上个月导师要我做的一个小爬虫,分享一下过程
需求分析
需要爬取网页中Fragate Spot的价格,但是不同区域价格不一样,并且价格每隔几个小时会有变化,所以需要定时爬取。
把爬取的数据存入excel,方便后期分析价格变化情况。
网页分析
通过分析网页结构,我在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的问题,这就需要自己去查资料了,都不难
源码
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文件
直接这样就可以访问,比较方便看爬虫挂不挂了(中间挂过几次,所以加了try catch)