python爬取某城市各监测站点历史空气质量数据

本文介绍了如何使用Python的selenium库爬取真气网上的城市各监测站点历史空气质量数据。由于网站有防爬机制,作者通过安装和配置Chrome driver来模拟浏览器动态爬取。虽然代码存在跨月和跨年的爬取问题,但已经能够实现每天数据的抓取,并展示了部分爬取结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
爬取空气质量检测网的部分城市的历年每天质量数据 思路----------------------------------------- 从某城市空气质量网页获取某市每月的链接,再爬取每个月的表格数据。连云港市:https://www.aqistudy.cn/historydata/daydata.php?city=连云港 连云港2014年5月的空气质量:https://www.aqistudy.cn/historydata/daydata.php?city=连云港&month=2014-05 遇到的问题----------------------------------------- 获取的网页中的表格数据隐藏,尝试requests无法获取。判断可能是动态加载的网页 尝试----------------------------------------- 1. 通过XHR,js查找隐藏数据的加载网页,没有找到。 2. 使用phantomjs.get() result=pd.read_html ,可以获得隐藏的表格数据,但是并不稳定,只是偶尔出现加载的表格数据,无法大规模的获取 解决方法----------------------------------------- 查找资料得知这个网站的表格数据在Console里的items中, 使用selenium的webdriver.firefox(),driver.execute_script("return items") 数据可获得。 仍遇到的问题:----------------------------------------- 爬取一个网页可获得数据,但是连续的获取网页,会出现两个错误。 1.Message: ReferenceError: items is not defined 2.connection refused 解决方法: 1.connection refused问题,可能是网页开太多,使用driver.quit() 2. 如果 execute_script 还是出错,可尝试pd.read_html获取信息。之前用phantomjs获取的时候输出空的表格,可能由于加载不够,用 Waite直到table出现之后再获取网页 Element=wait.until(EC.element_to_be_clickable((By.XPATH,"/html/body/div[3]/div[1]/div[1]/table/tbody"))) 3.之后出现偶尔出现输出为空,使用循环,如果输出表格为空,再重新获取。 if len(result)>1: filename = str(month) + '.xls' result.to_excel('E:\python\案例程序\data\\' + filename) print('成功存入'+filename) driver.quit() else: driver.quit() return getdata(monthhref,month)
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值