AWS爬取价格

上个月导师要我做的一个小爬虫,分享一下过程


需求分析

目标url:AWS Fargate 价格-无服务器容器服务-AWS云服务 (amazon.com)

需要爬取网页中Fragate Spot的价格,但是不同区域价格不一样,并且价格每隔几个小时会有变化,所以需要定时爬取。

把爬取的数据存入excel,方便后期分析价格变化情况。

AWS爬取价格

网页分析

通过分析网页结构,我在html中可以发现,不同地区的pricce并不直接在html中显示,只有点击后才会在html中

检查是否是异步请求,发现并没有异步请求,也就是ajax。

继续分析点击按钮所点击的js函数,发现所有的price存在一个js文件中进行加密处理了,难以破解。

所以无法利用简单的页面分析来爬数据,只能使用selenium工具了(其实是一个自动化测试工具,但用来爬东西也行)

相关技术

根据需求及网页结构分析,可以确定所需的技术

环境:

云服务器一台 Ubuntu(其他的也行)

python3

chrome(装在服务器上)

下载chromedriver

第三方库

selenium(爬网页)

openpyxl(操作excel)

相关库的简单使用

openpyxl:【python】openpyxl常用方法_Hurpe-CSDN博客

selenium:Python+Selenium基础入门及实践 - 简书 (jianshu.com)

python + selenium + chrome headless 的一些备忘 - SegmentFault 思否

1. 安装 — Selenium-Python中文文档 2 documentation (selenium-python-zh.readthedocs.io)

部署

在Linux中使用selenium(环境部署) - 凯帅 - 博客园 (cnblogs.com)

Linux下后台运行python程序,并输出日志文件_春风化雨-CSDN博客_nohup python 命令输出日志

在部署过程中会遇见许多linux的问题,这就需要自己去查资料了,都不难

源码

import datetime
import time

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from openpyxl import Workbook
from openpyxl import load_workbook
import re


def get_driver(url):
    # 如果启动server就用下面这个
    # driver = webdriver.Remote(
    #     command_executor='http://127.0.0.1:4444/wd/hub',
    #     desired_capabilities={'browserName': 'chrome',
    #                           'version': '2',
    #                           'javascriptEnabled': True})

    option = webdriver.ChromeOptions()
    option.add_argument('--headless')
    option.add_argument('--disable-gpu')  # 如果不加这个选项,有时定位会出现问题
    option.add_argument("--start-maximized")
    option.add_argument('--window-size=2560, 1440')

    chrome = webdriver.Chrome(options=option)
    chrome.implicitly_wait(3)  # seconds
    chrome.get(url)
    # print(chrome.get_window_size())
    # chrome.maximize_window()
    # print(chrome.get_window_size())
    # chrome.set_window_size(2560, 1440)
    # print(chrome.get_window_size())
    return chrome


def get_data(driver):
    region_data = []
    price_data = []
    try:
        select = driver.find_element_by_xpath('/html/body/div[2]/main/div[2]/div/div[5]/div/div[1]/div/ul')
        region_list = select.find_elements_by_tag_name('li')
    except Exception as e:
        print(e)
        return None, None
    else:
        print('地区个数:', len(region_list))
        for i in range(23):
            select.click()
            element = driver.find_element_by_class_name("aws-plc-content")
            # print(region_list[i].text)
            # print(element.text)
            region_data.append(region_list[i].text)
            price_data.append(element.text)
            # print('---')
            # time.sleep(1)
            region_list[i].click()
        return region_data, price_data


def save(data1, data2):
    # 数据清洗
    title = []
    price_data = []
    price_data.append(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    # 标题只要录入一次
    # for region in data1:
    #     title.append('')
    #     title.append(region)
    #     print(region)
    for price in data2:
        p = price.split('\n')
        price1 = re.search('[\d.]+', p[1])
        price2 = re.search('[\d.]+', p[2])
        price_data.append(price1.group())
        price_data.append(price2.group())
    # print(len(title))
    print('本次写入数据:', len(price_data))
    # 开始写入数据
    wb = load_workbook('price.xlsx')
    table = wb.active
    # table.append(title)
    table.append(price_data)
    wb.save('price.xlsx')


if __name__ == '__main__':
    while True:
        url = 'https://aws.amazon.com/cn/fargate/pricing/'  # 必须加https
        driver = get_driver(url)
        data1, data2 = get_data(driver)
        # print(data1)
        # print(data2)
        if data1 is not None and data2 is not None:
            save(data1, data2)
            print("本次爬取成功!")
            time.sleep(3600)
        else:
            print('本次爬取失败,5min后再爬一次')
            time.sleep(300)
        driver.quit()
        # 1h爬一次

# 美国东部(弗吉尼亚北部)
# 价格
# 每小时每 vCPU 0.012144 USD
# 每小时每 GB 0.0013335 USD

结果展示

其中最后我用nginx做了个web服务器,方便随时访问excel文件
AWS爬取价格
直接这样就可以访问,比较方便看爬虫挂不挂了(中间挂过几次,所以加了try catch)
AWS爬取价格

上一篇:我看好数据湖的未来,但不看好数据湖的现在


下一篇:CodePicnic的Docker Swarm之路