Python爬取真气网天气数据
使用工具:pycharm,Chrome driver
使用库:selenium
前言:
我们无时无刻不在呼吸着周围的空气,
可身边的空气质量怎样呢?
嗯~~~
大多数人会沉思一会儿,
最后还是会说:不知道。
我们平时看到的AQI只是环境综合指数,
有时并不能完全反应环境质量,
看来我们需要的是原始数据。
有了原始数据,
我们不但能分析现在的环境状况,
甚至还能对未来的环境状况做出自己的预测,
听起来是不是很XX呢。
古同还没找到直接在本页面下载的方法,
各位朋友可以,
后台回复:可执行文件,
可得到exe文件,
无需安装Python即可执行,
就算不会写爬虫,
也可以获得原始数据啦。
以下第一第二步为必读,
否则exe无法正常运行。
一、下载Chrome driver(必读)
这一步是无论执行.py还是.exe,
都要进行的一步,
在这一步我们要安装一个浏览器驱动插件,
相当于为我们的.py和.exe安装假肢。
首先,我们查看我们的浏览器版本,
打开后可以看到版本和操作系统位数,
我们要下载对应的驱动和Chrome版本相适应,
给大家推荐一个网址:
http://blog.csdn.net/huilan_same/article/details/51896672
根据自己Chrome浏览器的版本对应下载。
image二、安装Chrome driver(必读)
这里需要对环境变量进行配置,
首先我们要找到Chrome浏览器的安装位置,
最简单的方法是找到Google Chrome的快捷方式,
右击选择“打开文件位置”,
将路径复制下来,
例如我的路径为:
C:\Users\Gutong\AppData\Local\Google\Chrome\Application
然后,打开计算机——属性
image然后点击高级系统配置,
image点击环境变量,
image点击编辑,
image将复制的Chrome路径粘贴到红框中,
别忘了用分号(;)与前面的路径分开,
最后将我们下载好的Chrome driver中的exe文件粘到Chrome路径下,
imageOK,前期工作结束了,
上面两步是重点,
必须要学会的东西。
三、寻找提供原始数据的网站:
古同浏览了很多网站,
生态环境部官网、各市级环保网等等,
最后锁定了真气网,
网站数据来源真实可信,
历史数据网页链接:
https://www.aqistudy.cn/historydata/index.php
image四、分析网页:
由于网页数据是随时间进行变化的,
属于动态网页,
因此不宜采用静态网页的分析方法,
So我们选择selenium
五、写源码
首先引入所用库:
# -*- coding:utf-8-*-
#可以利用 webdriver 打开一个浏览器
from seleniumimport webdriver
#使时间中止至指定时间
import time
接着定义一个search()方法:
用来返回网页的信息,
def search(url):
#利用get()方法获取网页信息并返回
return driver.get(url)
接着再定义一个解析网页的方法:
def parse_one_page(page):
#查找出玩野中全部的 tr 标签并赋给 tr_list
tr_list =driver.find_elements_by_tag_name('tr')
return tr_list
当然不能忘了保存数据了,
def save_to_mysql(tr_list):
#在 D 盘创建一个 TXT 格式文件
with open(r'd:\data.txt','a',encoding='utf8') as f:
for i in range(1, len(tr_list)):
#找出 tr_list 中的全部 td 标签
td_list =tr_list[i].find_elements_by_tag_name('td')
dae = td_list[0].text
AQI = td_list[1].text
ql = td_list[2].text
PM2 = td_list[3].text
PM10 = td_list[4].text
SO2 = td_list[5].text
CO = td_list[6].text
NO2 = td_list[7].text
O3 = td_list[8].text
#将所得原始数据写入上面建立的 TXT 文件
f.write('{} {} {} {} {} {} {} {} {}\n'.format(dae,AQI,ql,PM2,PM10,SO2,CO,NO2,O3))
定义主函数:
def main()
#实现交互,输入城市和时间
area = input('请输入一个城市(例如[长春]):')
year = input('请输入一个年份(例如[2018]):')
print('正在抓取'+ area + '市' + year + '年' + '空气质量每日历史数据:' )
print('由于抓取数据较多,请您耐心等待:')
#定义全局变量 driver
global driver
#打开 Chrome 浏览器
driver = webdriver.Chrome()
#利用循环获取一年的原始数据
for i in range(1,13):
if i<10:
url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}0{}'.format(area,year,i)
else:
url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}{}'.format(area,year,i)
page = search(url)
time.sleep(1)
tr_list = parse_one_page(page)
save_to_mysql(tr_list)
print('抓取完毕')
print('文件存储在D:\data.txt')
最后调用主函数:
if __name__ =='__main__':
main()
大功告成了!!!
撒花
完整代码如下:
# -*- coding:utf-8-*-
#可以利用 webdriver 打开一个浏览器
from seleniumimport webdriver
#使时间中止至指定时间
import time
def search(url):
#利用get()方法获取网页信息并返回
return driver.get(url)
defparse_one_page(page):
#查找出玩野中全部的 tr 标签并赋给 tr_list
tr_list =driver.find_elements_by_tag_name('tr')
return tr_list
defsave_to_mysql(tr_list):
#在 D 盘创建一个 TXT 格式文件
withopen(r'd:\data.txt','a',encoding='utf8') as f:
for i in range(1, len(tr_list)):
#找出 tr_list 中的全部 td 标签
td_list =tr_list[i].find_elements_by_tag_name('td')
dae = td_list[0].text
AQI = td_list[1].text
ql = td_list[2].text
PM2 = td_list[3].text
PM10 = td_list[4].text
SO2 = td_list[5].text
CO = td_list[6].text
NO2 = td_list[7].text
O3 = td_list[8].text
#将所得原始数据写入上面建立的 TXT 文件
f.write('{} {} {} {} {} {} {} {} {}\n'.format(dae,AQI,ql,PM2,PM10,SO2,CO,NO2,O3))
def main()
#实现交互,输入城市和时间
area = input('请输入一个城市(例如[长春]):')
year = input('请输入一个年份(例如[2018]):')
print('正在抓取'+ area + '市' + year + '年' + '空气质量每日历史数据:' )
print('由于抓取数据较多,请您耐心等待:')
#定义全局变量 driver
global driver
#打开 Chrome 浏览器
driver = webdriver.Chrome()
#利用循环获取一年的原始数据
for i in range(1,13):
if i<10:
url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}0{}'.format(area,year,i)
else:
url ='https://www.aqistudy.cn/historydata/daydata.php?city={}&month={}{}'.format(area,year,i)
page = search(url)
time.sleep(1)
tr_list = parse_one_page(page)
save_to_mysql(tr_list)
print('抓取完毕')
print('文件存储在D:\data.txt')
if __name__ =='__main__':
main()
个人公众号:此地古同