实战_爬取中国天气网

目标

将中国天气网所有城市的最低气温爬取下来,将最低气温的前十名可视化显示出来。
这个爬虫比较简单没有做反爬处理,所以对于获取html代码比较简单,关键在于如何解析得到的html代码。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import requests
from bs4 import BeautifulSoup
from pyecharts.charts.bar import Bar
ALL_DATA=[]
def parse_page(url):
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
resp=requests.get(url,headers=headers)
#print(resp.text)
text=resp.content.decode("utf-8")
# print(text)
#这里使用的解析器是html5lib,因为在使用常用的lxml解析器容错率不好,港澳台天气这个页面html书写不规范,从而无法正常爬取。
#pip install html5lib
soup=BeautifulSoup(text,"html5lib")
divs=soup.find("div",class_="conMidtab") #获取第一个div标签
tables=divs.find_all("table")
for table in tables:
trs=table.find_all("tr")[2:]
for index,tr in enumerate(trs):
# print(tr)
# print("="*30)
tds=tr.find_all("td")
if(index==0):
city_td=tds[1]
else:
city_td=tds[0]
city=list(city_td.stripped_strings)[0]
# print(city)
temp_td=tds[-2]
temp=list(temp_td.stripped_strings)[0]
# print({'city':city,'temp':temp})
data={'city':city,'temp':int(temp)}
ALL_DATA.append(data)
def spider():
base_url="http://www.weather.com.cn/textFC/{}.shtml"
params=["hb","db","hd","hz","hn","xb","xn","gat"]
for param in params:
url=base_url.format(param)
parse_page(url)
ALL_DATA.sort(key=lambda x:x['temp'])
# print(ALL_DATA)
data=ALL_DATA[0:10]
cicties=list(map(lambda x:x['city'],data))
temps=list(map(lambda x:x['temp'],data))
chart=Bar("中国天气排行榜")
chart.add("",cicties,temps)
chart.render('temp.html')
if __name__ == '__main__':
spider()

要点

这里使用的是beautifulsoup库,用的解析器是html5lib;因为在爬取港澳台地区的天气时,这个页面的html代码写的不规范。如果我们使用常用的lxml解析器的话会无法正常爬取。

1
pip install html5lib


这里是这段代码比较重要的部分,通过sort函数对得到的数据进行排序,’key=’参数指定按什么关键字排序。
1
ALL_DATA.sort(key=lambda x:x['temp'])

这里是按照字典中的temp参数进行排序

1
2
cicties=list(map(lambda x:x['city'],data))
temps=list(map(lambda x:x['temp'],data))

这段代码是通过lambda和map()将城市和对应的最低温度形成单个的列表


最后

效果如图:

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×