
编写一个用于获取全国空气质量监测网代码的Python脚本。
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
该方案旨在收集特定城市历年每日的空气质量数据。首先,从某城市的空气质量监测网站获取该市每个月的链接,然后对每个月的数据进行提取。例如,连云港市的数据位于:https://www.aqistudy.cn/historydata/daydata.php?city=连云港连云港2014年5月的空气质量数据也位于:https://www.aqistudy.cn/historydata/daydata.php?city=连云港&month=2014-05。在尝试获取这些数据时,发现网页中的表格信息被隐藏起来。最初尝试使用requests库进行抓取,但未能成功获取到这些隐藏的数据。
进一步分析后,判断该网站可能采用了动态加载网页的技术。因此,进行了以下诊断和处理:
1. 通过分析XHR请求和JavaScript代码,追踪隐藏数据的加载过程,但未能找到相应的加载机制。
2. 利用PhantomJS的`get()`方法和`pd.read_html`函数来获取隐藏的表格数据,然而这种方法并不稳定,仅偶尔能够成功加载表格数据,无法实现大规模的数据采集。
为了解决这个问题,查阅相关资料得知该网站的表格数据存储在Console窗口中的“items”列表中。因此,使用Selenium的webdriver.firefox()配合driver.execute_script(return items)来访问并提取这些数据是可行的。然而,在使用过程中仍然存在一些问题:
1. 单次爬取一个网页可能获得数据,但连续爬取多个网页时会遇到错误:首先出现“ReferenceError: items is not defined”的错误;其次是“connection refused”错误。
2. 针对“connection refused”错误的处理方法是关闭多余的浏览器实例(使用driver.quit());如果执行`execute_script`仍然报错, 可以尝试使用`pd.read_html`获取信息。
3. 在之前使用PhantomJS获取数据时, 曾出现输出空表格的情况, 这可能是由于加载速度不足造成的;因此, 采用Waite机制等待表格元素出现后再抓取页面元素(例如: `wait.until(EC.element_to_be_clickable((By.XPATH,/html/body/div[3]/div[1]/div[1]/table/tbody)))`)来确保数据的完整性。
4. 此外, 偶尔还会出现输出为空的情况, 因此采用循环方式处理, 如果当前抓取的表格为空, 则重新抓取页面元素; 具体实现为:如果 `len(result) > 1`, 则将数据保存到Excel文件中(filename = str(month) + .xls),并将结果保存到指定路径下 (E:\python\案例程序\data\\)。如果 `len(result) <= 1`, 则关闭浏览器实例并递归调用`getdata(monthhref, month)`函数继续爬取下一页数据。
全部评论 (0)


