利用的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 良