python爬空气污染实时数据_python爬虫之静态网页——全国空气质量指数(AQI)爬取...

利用的python库,最近最流行的requests,BeautifulSoup。

requests:用于下载html BeautifulSoup:用于解析

下面开始分析:要获取所有城市的aqi,就要进入每个城市的单独链接,而这些链接可以从主页中获取

打开主网页,查看源代码,可以看到,所有的城市链接都在id=‘citylist’里面

把所有链接爬下来存在一个列表里面,然后依次爬取每个城市的单个链接,附代码

import requests

from bs4 import BeautifulSoup

import bs4

def get_all_city():

url='http://www.air-level.com'

try:

# 伪装成浏览器,headers

kv={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}

r=requests.get(url,headers=kv)

r.raise_for_status()

r.encoding=r.apparent_encoding

except:

print('爬取城市链接失败')

demo=r.text

soup=bs4(demo,'thml.parser')

time=soup.find('h4').string

print(time)

for it in soup.find(id='citylist').children:

if isinstance(it,s4.element.Tag):

for its in it.find_all('a'):

clist.append(its.get('href')) #加入列表当中去18|

cnlist.append(its.string)

之后就是每个城市的单独链接的信息爬取,以北京为例,查看源代码可知:

附爬取每个城市代码:

def get_one_page(city): # 获得HTML 爬取城市信息

url = "http://www.air-level.com"+city

if city in cwlink:

aqilist.append("异常链接")

else:

try:

kv = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'} # 伪装成浏览器,headers

r = requests.get(url, headers=kv)

r.raise_for_status()

r.encoding = r.apparent_encoding

except:

print("爬取失败")

demo = r.text

soup = BeautifulSoup(demo, "html.parser")

s = soup.find("span")

aqilist.append(s.string)

但是在爬取的过程中会发现问题,有的一些城市网站用浏览器打不开,也就爬取不了,所以要做处理,

在上面可以看到,本人用cwlist存储了所有异常链接,跳过去,不爬取。

附完整代码:

import requests

from bs4 import BeautifulSoup

import bs4

aqilist = [] # 储存城市AQI

clist = [] # 储存城市链接

cnlist = [] # 储存城市名字

cwlink = ["/air/changdudiqu/", "/air/kezilesuzhou/", "/air/linzhidiqu/", "/air/rikazediqu/",

"/air/shannandiqu/", "/air/simao/", "/air/xiangfan/", "/air/yilihasake/"]

def get_one_page(city): # 获得HTML 爬取城市信息

url = "http://www.air-level.com"+city

if city in cwlink:

aqilist.append("异常链接")

else:

try:

kv = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'} # 伪装成浏览器,headers

r = requests.get(url, headers=kv)

except:

print("爬取失败")

demo = r.text

soup = BeautifulSoup(demo, "html.parser")

s = soup.find("span")

aqilist.append(s.string)

def get_all_city():

url='http://www.air-level.com'

try:

# 伪装成浏览器,headers

kv={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}

r=requests.get(url,headers=kv)

except:

print('爬取城市链接失败')

demo=r.text

soup=BeautifulSoup(demo,'html.parser')

time=soup.find('h4').string

print(time)

for it in soup.find(id='citylist').children:

if isinstance(it,bs4.element.Tag):

for its in it.find_all('a'):

clist.append(its.get('href')) #加入列表当中去

cnlist.append(its.string)

def main():

get_all_city()

print('共爬取了{}个城市'.format(len(clist)))

for it in range(len(clist)):

get_one_page(clist[it])

print('{}{}'.format(cnlist[it],aqilist[it]))

main()

输出结果:

D:\application\Anaconda3\python.exe F:/test/venv/learning/test.py

更新时间 2019-03-09 22:00

共爬取了378个城市

北京135 轻度污染

上海83 良

天津99 良

重庆105 轻度污染

广州27 优

南京109 轻度污染

杭州68 良

鞍山137 轻度污染

安庆113 轻度污染

安顺30 优

安阳179 中度污染

安康83 良

阿坝州34 优

阿克苏地区90 良

阿拉善盟64 良

阿勒泰地区40 优

阿里地区10 优

北京135 轻度污染

宝鸡99 良

包头141 轻度污染

保定105 轻度污染

白城66 良

蚌埠123 轻度污染

本溪96 良

白山94 良

白银62 良

亳州126 轻度污染

保山38 优

巴中57 良

北海19 优

毕节30 优

滨州106 轻度污染

百色40 优

博州58 良

巴彦淖尔80 良

重庆105 轻度污染

成都61 良

长春69 良

承德59 良

沧州117 轻度污染

赤峰57 良

常州151 中度污染

常德83 良

长沙101 轻度污染

常熟94 良

长治89 良

朝阳61 良

潮州21 优

郴州39 优

池州89 良

崇左16 优

滁州140 轻度污染

昌吉州92 良

楚雄州36 优

昌都45 优

大连35 优

大同52 良

东莞23 优

丹东106 轻度污染

德州122 轻度污染

东营68 良

大庆51 良

大理州39 优

大兴安岭地区28 优

达州143 轻度污染

德宏州56 良

德阳59 良

定西65 良

迪庆州34 优

鄂尔多斯48 优

鄂州106 轻度污染

恩施州75 良

福州24 优

抚顺156 中度污染

阜阳148 轻度污染

富阳75 良

佛山22 优

阜新46 优

抚州58 良

防城港11 优

广州27 优

广安110 轻度污染

广元56 良

桂林31 优

贵阳52 良

赣州28 优

贵港26 优

固原71 良

甘孜州25 优

甘南州24 优

果洛州23 优

杭州68 良

哈尔滨69 良

合肥94 良

呼和浩特161 中度污染

海口46 优

邯郸126 轻度污染

衡水120 轻度污染

海门19 优

海北州23 优

海东地区47 优

海南州37 优

海西州30 优

哈密地区64 良

汉中75 良

鹤壁125 轻度污染

河池33 优

鹤岗32 优

黑河35 优

湖州68 良

衡阳91 良

和田地区76 良

河源8 优

菏泽130 轻度污染

贺州32 优

红河州95 良

淮安79 良

淮北139 轻度污染

怀化66 良

淮南128 轻度污染

黄山53 良

黄冈150 轻度污染

黄南州46 优

黄石90 良

惠州15 优

葫芦岛123 轻度污染

呼伦贝尔29 优

吉林63 良

济南111 轻度污染

济宁95 良

锦州145 轻度污染

佳木斯32 优

吉安59 良

江门13 优

江阴105 轻度污染

胶南30 优

胶州53 良

焦作120 轻度污染

嘉兴93 良

嘉峪关61 良

揭阳37 优

即墨58 良

金昌72 良

晋城112 轻度污染

景德镇60 良

荆门119 轻度污染

荆州76 良

金华59 良

金坛124 轻度污染

晋中69 良

九江96 良

酒泉41 优

鸡西35 优

句容141 轻度污染

昆明54 良

昆山92 良

开封165 中度污染

库尔勒67 良

克州81 良

喀什地区63 良

克拉玛依55 良

克孜勒苏州异常链接

洛阳109 轻度污染

拉萨49 优

连云港43 优

廊坊81 良

来宾37 优

莱芜141 轻度污染

莱西49 优

莱州58 良

兰州59 良

乐山62 良

凉山州27 优

聊城126 轻度污染

辽阳147 轻度污染

辽源61 良

丽江15 优

临安73 良

临沧59 良

临汾149 轻度污染

临沂105 轻度污染

丽水56 良

六安99 良

六盘水38 优

柳州53 良

溧阳100 良

陇南48 优

龙岩20 优

娄底76 良

漯河165 中度污染

泸州77 良

吕梁83 良

临夏州34 优

林芝22 优

马鞍山119 轻度污染

茂名21 优

眉山46 优

梅州23 优

绵阳56 良

牡丹江58 良

南京109 轻度污染

南昌96 良

南宁31 优

南充95 良

南平13 优

南通64 良

南阳114 轻度污染

宁波92 良

宁德34 优

内江68 良

爬取空气质量检测网的部分城市的历年每天质量数据 思路----------------------------------------- 从某城市空气质量网页获取某市每月的链接,再爬取每个月的表格数据。连云港市: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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值