之前给大家分享了月度空气质量数据的爬虫程序,详见“爬虫大法:空气质量数据的爬取”一文。事实上,中国空气质量在线监测分析平台(https://www.aqistudy.cn/historydata/)也提供了全国384个城市和地区的日度空气质量数据,只是爬取下来程序更为复杂,耗费时间也会更长。
这个爬虫程序的思路还是先爬取城市名,构造网址,然后再通过网址爬取各个城市的日度空气质量数据。这个网站日度数据网址命名规则是这样的:
https://www.aqistudy.cn/historydata/daydata.php?city=北京&month=2015-01
https://www.aqistudy.cn/historydata/daydata.php?city=北京&month=2015-02
……
https://www.aqistudy.cn/historydata/daydata.php?city=上海&month=2015-01
https://www.aqistudy.cn/historydata/daydata.php?city=上海&month=2015-02
其实,很容易分解,就是初始网址+城市名+月份。有了思路之后,代码都是浮云了!飘了飘了!
- import requests
- from lxml import etree
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36'
- }
- url = "https://www.aqistudy.cn/historydata/"
- response = requests.get(url, headers=headers)
- text = response.content.decode('utf-8')
- html = etree.HTML(text)
- city_set = list()
- citys = html.xpath("//div[@class='all']/div/ul")
- for city in citys:
- messages = city.xpath(".//li")
- for message in messages:
- city_name = message.xpath(".//a/text()")
- city_name = "".join(city_name)
- # print(city_name)
- city_set.append(city_name)
- print(city_set)
- import time
- from urllib import parse
- import pandas as pd
- from selenium import webdriver
- driver = webdriver.PhantomJS(r'D:/爬虫下载/phantomjs-2.1.1-windows\bin\phantomjs.exe')
- base_url = 'https://www.aqistudy.cn/historydata/daydata.php?city='
- def get_month_set():
- month_set = list()
- # for i in range(1, 10):
- # month_set.append(('2014-0%s' % i))
- # for i in range(10, 13):
- # month_set.append(('2014-%s' % i))
- for i in range(1, 10):
- month_set.append(('2015-0%s' % i))
- for i in range(10, 13):
- month_set.append(('2015-%s' % i))
- for i in range(1, 10):
- month_set.append(('2016-0%s' % i))
- for i in range(10, 13):
- month_set.append(('2016-%s' % i))
- for i in range(1, 10):
- month_set.append(('2017-0%s' % i))
- for i in range(10, 13):
- month_set.append(('2017-%s' % i))
- for i in range(1, 10):
- month_set.append(('2018-0%s' % i))
- for i in range(10, 13):
- month_set.append(('2018-%s' % i))
- for i in range(1, 10):
- month_set.append(('2019-0%s' % i))
- for i in range(10, 13):
- month_set.append(('2019-%s' % i))
- for i in range(1, 5):
- month_set.append(('2020-0%s' % i))
- return month_set
- month_set = get_month_set()
- # print(month_set)
- for k in range(0,len(city_set)):
- city = city_set[k]
- # fp = open(r'D:\爬虫下载\日空气质量\%s.csv'% (str(city)), 'a')
- # fp.write('%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n'%('序号','日期','AQI','grade','PM2.5','PM10','SO2','CO','NO2','O3'))#表头
- # fp.close()
- for i in range(len(month_set)):
- str_month = month_set[i]
- weburl = ('%s%s&month=%s' % (base_url, parse.quote(city), str_month))
- print(city,str_month)
- driver.get(weburl)
- time.sleep(3)
- dfs = pd.read_html(driver.page_source,header=0)[0]
- # time.sleep(0.5)#防止页面一带而过,爬不到内容
- dfs.to_csv(r'D:\爬虫下载\日空气质量\%s.csv' % (str(city)), mode='a+', encoding='utf_8_sig')
- driver.quit()
- print ('爬虫已经爬完!请检测!')
有需要本期爬虫代码和爬取下来的日度空气质量数据的朋友,可以在公众号【功夫计量经济学】后台回复“AQI”,即可看到获取方式。为了感谢各位朋友的支持,月度空气质量数据的下载已经放开,不再需要转发,后台回复”PM2.5”即可看到下载链接。
数据说明:
(1)这次爬取的是384个城市和地区2015年1月1日到2020年4月30日的日度空气质量数据。但是,像有些地区比如西藏林芝、日喀则是2017年1月1日之后才有数据的。
(2)因为网站上实际上没有保亭、白沙、昌江、澄迈、儋州、定安、东方、乐东、临高、陵水、琼海、琼中、屯昌、万宁、文昌和五指山这16个城市和地区的空气质量数据,所以这些城市和地区爬取下来的会是空白,最终一共只有368个城市和地区的数据。
(3)这个网站事实上也存在数据缺失的问题,有些城市有些月份、有些日期是没有数据的。当然,缺失的相当少。