閱讀文本大概須要 7 分鐘。html
此次咱們的目標是爬取全國最冷的 10 座城市。html5
首先打開目標網站 - 中國天氣網。bash
「 http://www.weather.com.cn/textFC/hb.shtml 」app
咱們要爬取全國全部城市的最低溫度,而後獲取溫度最低的 10 個城市,並繪製成餅狀圖。echarts
因爲爬取的數據少,考慮使用「 美味湯 - beautiful soup 」的方式來爬取。函數
另外,最後須要根據數據生成餅狀圖,須要安裝「 pyecharts 」及兼容庫,否則控制檯會報錯。網站
# 安裝美味湯
pip3 install bs4
# html5lib 提高兼容性
pip3 install html5lib
# 安裝圖形庫
pip3 install pyecharts
# 安裝圖形兼容庫
pip3 install pyecharts-snapshot複製代碼
注意:通常爬蟲使用 lxml 去解析,可是因爲中國天氣網的「 港澳臺 」頁面源碼中存在不少標籤沒有正確關閉,所以使用 html5lib 的方式去解析數據。ui
首先,咱們能夠看到全國分爲華北、東北、華東、華中、華南、西北、西南、港澳臺,8 個區域來展現天氣數據。url
# 一共8個區域,包含:華北、東北、華東、華中、華南、西北、西南、港澳臺
# 華北
url_hb = 'http://www.weather.com.cn/textFC/hb.shtml'
# 東北
url_db = 'http://www.weather.com.cn/textFC/db.shtml'
# 華東
url_hd = 'http://www.weather.com.cn/textFC/hd.shtml'
# 華中
url_hz = 'http://www.weather.com.cn/textFC/hz.shtml'
# 華南
url_hn = 'http://www.weather.com.cn/textFC/hn.shtml'
# 西北
url_xb = 'http://www.weather.com.cn/textFC/xb.shtml'
# 西南
url_xn = 'http://www.weather.com.cn/textFC/xn.shtml'
# 港澳臺【比較特殊】
url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'
複製代碼
咱們首先須要去獲取每個區域下全部城市的天氣數據,而後再對數據進行整理排序,寫入到圖形文件中。spa
首先爬取「 華北地區 」城市的天氣數據。
能夠獲取到下面的規律:
全部的「 class=conMidtab 」的 6 個 div 保存着華北地區全部城市,包含今天之內將來一週的天氣數據。
每個「 class=conMidtab2 」的 div 表明了一個省份的天氣信息。
省份下面的城市天氣數據,都包含 table 標籤下。從第 3 個 tr 標籤開始,是每個城市的天氣數據。
soup = BeautifulSoup(text, 'html5lib')
div_conMidtab = soup.find('div', class_='conMidtab')
# 3.獲取全部的table子Tag【天氣信息都保存在table標籤下面】
tables = div_conMidtab.find_all('table')
# 4.遍歷片區下面的省份
for table in tables:
# 4.1過濾掉表頭的兩個tr數據
trs = table.find_all('tr')[2:]
# 5.遍歷省份下面的市區
for index, tr in enumerate(trs):
tds = tr.find_all('td')
# 5.1 城市名稱【第 1 個td標籤】
# 注意:一個省份第一個城市取第 2 個td標籤;其他城市取第 1 個td標籤
city_td = tds[1] if index == 0 else tds[0]
city = list(city_td.stripped_strings)[0]
# 5.2 最低氣溫【倒數第 2 個td標籤】
temp_low_td = tds[-2]
temp_low = list(temp_low_td.stripped_strings)[0]
ALL_DATA.append({"city": city, "temp_low": int(temp_low)})
複製代碼
接下來,循環全國 8 個區域的列表,獲取全部城市的名稱和溫度數據。
for index, url in enumerate(url_areas):
print('開始爬取第{}個區域'.format(index + 1))
parse_page(url)
time.sleep(1)
複製代碼
而後拿到全部城市和溫度的列表數據後,就能夠對數據按溫度進行「 升序 」排列。
def analysis_data():
""" 分析爬下來的數據 :return: """
# 1.默認的排序方式是升序【經過最低氣溫進行排序】
ALL_DATA.sort(key=lambda data: data['temp_low'])
# 2.獲取前面10條數據
top_10 = ALL_DATA[:10]
return top_10
複製代碼
最後,將數據寫入到餅狀圖中。
def show_with_chart(top_10):
""" 10個城市和溫度生成餅狀圖 :param top_10: :return: """
# 把列表tip_10中的每一項拿出去放到匿名函數中,而後組裝成新的一個列表
# 1.獲取城市列表
citys = list(map(lambda item: item['city'], top_10))
# 2.最低溫度列表
temp_lows = list(map(lambda item: item['temp_low'], top_10))
# 3.生成餅狀圖並寫入到html文件中
bar = Bar("最低氣溫排行榜")
bar.add("最低溫度", citys, temp_lows)
# 渲染
bar.render('temperature.html')複製代碼
最後打開生成的餅狀圖,就能很直觀的查看到今天溫度最低的 10 個城市。
本文首發於公衆號「 AirPython 」,後臺回覆「好冷」便可獲取完整代碼。