python爬取aqistudy数据

工具 专栏收录该内容
8 篇文章 0 订阅

由于网上相关的代码大多数都失效了,无法使用,这里更新一版可以使用的代码,

截止 2021-05-28亲测可用,这里以爬取山西省的11个城市的aqi数据为例

get_daily_data.py

import time
from selenium import webdriver
import pandas as pd
from concurrent.futures import ProcessPoolExecutor
import urllib.request as request


# pip install selenium==2.48.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
#  按网页url的格式生成一段时间内的日期
# get_year_months(2020, 4, 2021, 4)
# [202004, 202005, 202006, 202007, 202008, 202009, 202010, 202011, 202012, 202101, 202102, 202103, 202104]
def get_year_months(start_year, start_month, end_year, end_month):
    start_year, start_month, end_year, end_month = [int(i) for i in [start_year, start_month, end_year, end_month]]
    year_months = []
    if start_year < end_year:
        for year in range(start_year, end_year + 1):
            if year == start_year:
                if start_month > 12 or start_month < 1:
                    raise ValueError
                else:
                    for month in range(start_month, 13):
                        year_months.append(year * 100 + month)
            elif year == end_year:
                if end_month > 12 or end_month < 1:
                    raise ValueError
                else:
                    for month in range(1, end_month + 1):
                        year_months.append(year * 100 + month)
            else:
                for month in range(1, 13):
                    year_months.append(year * 100 + month)
    elif start_year == end_year:
        if start_month <= end_month:
            for month in range(start_month, end_month + 1):
                year_months.append(start_year * 100 + month)

    return year_months


if __name__ == '__main__':
    start = time.clock()
    # ------------------------------------------基本设置-----------------------------------------------
    base_aqi_url = r'https://www.aqistudy.cn/historydata/daydata.php?'
    # city_set = ['太原', '大同', '朔州', '忻州', '阳泉', '吕梁', '晋中', '长治', '晋城', '临汾', '运城']
    city_set = ['太原']
    for k in range(0, len(city_set)):
        city_chinese_name = city_set[k]
        # 将城市中文名进行URL编码
        city_name = request.quote(city_chinese_name)
        # 拿到目标日期的月份
        year_months = get_year_months(2021, 5, 2021, 5)  # 包括最后年的最后月
        encoding = 'gbk'
        # 最大进程数
        executor_num = 10
        # ---------------------------------crawl-----------------------------------------------------------
        city_aqi_url = base_aqi_url + 'city=%s' % city_name
        start_time = time.time()
        driver = webdriver.PhantomJS(r'C:\phantomjs-2.1.1-windows\bin\phantomjs.exe')
        # 这里使用多进程并行编程库里面的ProcessPoolExecutor
        with ProcessPoolExecutor(executor_num) as executor:
            for year_month in year_months:
                city_year_month_url = city_aqi_url + '&month=%d' % year_month
                # 在url中带入月份
                driver.get(city_year_month_url)
                time.sleep(1)
                # 利用pandas读取网页中的表格
                dfs = pd.read_html(driver.page_source, header=0)[0]
                time.sleep(0.5)
                dfs[1] = str(city_chinese_name)
                # 数据落地
                dfs.to_csv('data_test/' + (str(city_chinese_name) + '.csv'), header=None, index=None, mode='a+',
                           encoding='utf_8_sig')
driver.quit()
end = time.clock()
print('Running time: %s Seconds' % round((end - start), 2))

注意事项

  • selenium版本过高会出现警告’Selenium support for PhantomJS has been deprecated, please use headless ',降低版本即可

    pip install selenium==2.48.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  • phantomjs下载链接

    https://phantomjs.org/download.html

结果截图

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

爬取空气质量检测网的部分城市的历年每天质量数据 思路----------------------------------------- 从某城市的空气质量网页获取某市每月的链接,再爬取每个月的表格数据。连云港市: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)
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值