python爬取某城市各监测站点历史空气质量数据
引言
由于要使用某地各监测站点的空气质量数据做数据预测,因此需要去网站爬取这些站点的空气质量数据。笔者在网上找了很多关于空气质量爬取的代码,但是都不符合我的要求,因为大部分都是爬取该城市的历史空气质量数据,类似于爬取这种,如下图:
但是这不是笔者所需要的,笔者需要的是每天该城市各检测站点的AQI、PM2.5、PM10、So2、No2、Co、O3数据,以天津市为例,类似这种才是笔者所需要的,如下图:
这只是该天天津市各监测站点的空气质量数据,笔者需要上一年或者上两年的历史数据,因为网上的代码都不合适,笔者自己尝试写了一下,最后因为太忙,代码在跨时间爬取上还有些问题没时间修改,不过代码在爬取过程中只需要稍微调整以下时间即可。
先上最后爬取效果图:
上图是爬取的每一天监测站点的结果,因为最后太忙,爬取结果是按照天存放到表格中的,没有存放在一张表格中,后期如果有需要可以自己处理一下。
正文
爬取以天津市为例,爬取网站为真气网,别的网站没找到历史气候数据。。。
在开始爬取后,笔者发现真气网设置了防爬措施,因此不能使用BeautifulSoup+requests进行静态爬取,只能用selenium模仿人类点击浏览器进行动态爬取。
在爬取之前需要先安装Chrome driver(火狐的是geckodriver)和selenium
一、安装Web driver
如果使用的是谷歌浏览器需要安装的是Chrome driver,如果是火狐浏览器安装geckodriver。安装方法基本相同,但是需要特别注意一点就是driver必须要和你的浏览器版本进行对应,下图是谷歌浏览器和Chrome driver对应的表格,火狐的geckodriver也有对应的表格,可以搜一下:
下载完浏览器对应的driver后,将其直接复制到自己浏览器的安装目录中即可,笔者使用的是火狐浏览器,所以直接将geckodriver复制到火狐浏览器的本地目录中即可,谷歌浏览器也是一样,主要版本一定要对应,如下图:
二、安装selenium
selenium比较好安装,如果使用的是pycharm软件,点击File–>settings–>python Interpreter,点击加号在下图界面搜索selenium,Install Package安装即可。
安装完成之后,使用下方代码测试一下,如果能出现下图浏览器界面(浏览器链接栏有个小机器人说明电脑正在模拟控制),说明安装成功。
from selenium import webdriver
#火狐浏览器selenium方式,谷歌浏览器不用这段
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
# firfoxdriver 为 你的firefox安装路径
firfoxdriver = 'C:\\Users\\admin\\AppData\\Local\\Mozilla Firefox\\firefox.exe'
binary = FirefoxBinary(firfoxdriver)
driver = webdriver.Firefox(firefox_binary=binary,executable_path='C:\\Users\\admin\\AppData\\Local\\Mozilla Firefox\\geckodriver.exe')
#driver = webdriver.Chrome() 谷歌浏览器用这个
# 浏览器窗口最大化
driver.maximize_window()
# 浏览器地址定向为页面
driver.get("https://www.zq12369.com/environment.php?tab=city&city=天津&order=DESC#envtab")
三、数据爬取
# import requests
# import re
import csv
import numpy as np
import pandas as pd
import openpyxl as op
import time
import unittest
from selenium import webdriver
# from bs4 import BeautifulSoup
#火狐浏览器selenium方式
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
# firfoxdriver 为 你的firefox安装路径
firfoxdriver = 'C:\\Users\\admin\\AppData\\Local\\Mozilla Firefox\\firefox.exe'
binary = FirefoxBinary(firfoxdriver)
#时间选择函数,定位到指定的时间
def TimeSelect(driver,star_data):
# 激活时间控件下拉框
driver.find_element_by_css_selector("input#reservation2").click()
time.sleep(1)
data_conver = {
'一': '1', '二': '2', '三': '3', '四': '4', '五': '5', '六': '6', '七': '7', '八': '8', '九': '9', '十': '10', '十一': '11', '十二': '12'}
# print("请输入日期(例如:2020-11-20)")
inyear, inmonth, inday = star_data.split("-")
# print(b)
t = 0 #控件向前向后点,class不一样,用来判断
# ---------------操作左边的控件---------------------
data_original = driver.find_element_by_xpath( # 获得左边控件原始日期
"//div[@class='calendar left']//div//tr//th[@class='month']").get_attribute("textContent")
a, b = data_original.split(" ") #按空格拆分出年和月
data_or_year = b #原始日期年
data_or_month = data_conver[a[0:a.rfind('月',1)]] #原始日期月
data_or_day = int(driver.find_element_by_xpath( #初始日期日
"//div[@class='calendar left']//div//tbody//td[@class='available'][1]").get_attribute("textContent"))
while 1: #定位到所输入的时间,年和月
if(int(data_or_year) > int(inyear)): #定位所输入的年份
driver.find_element_by_xpath( # 点击左边的箭头控件
"//div[@class='calendar left']//div//table//th[@class='prev available']//i").click()
data_original = driver.find_element_by_xpath( # 获得左边控件日期
"//div[@class='calendar left']//div//tr//th[@class='month']").get_attribute("textContent")
a, b = data_original.split(" ") # 按空格拆分出年和月
data_or_year = b # 原始日期年
data_or_month = data_conver[a[0:a.rfind('月', 1)]] # 原始日期月
elif(int(data_or_month) > i