Python告訴你今天最冷的地方在哪裏


閱讀文本大概須要 7 分鐘。html


01 抓取目標

此次咱們的目標是爬取全國最冷的 10 座城市。html5

首先打開目標網站 - 中國天氣網。bash

「 http://www.weather.com.cn/textFC/hb.shtml 」app

咱們要爬取全國全部城市的最低溫度,而後獲取溫度最低的 10 個城市,並繪製成餅狀圖。echarts


02 準備工做

因爲爬取的數據少,考慮使用「 美味湯 - beautiful soup 」的方式來爬取。函數

另外,最後須要根據數據生成餅狀圖,須要安裝「 pyecharts 」及兼容庫,否則控制檯會報錯。網站

# 安裝美味湯
pip3 install bs4

# html5lib 提高兼容性
pip3 install html5lib

# 安裝圖形庫
pip3 install pyecharts

# 安裝圖形兼容庫
pip3 install pyecharts-snapshot複製代碼


注意:通常爬蟲使用 lxml 去解析,可是因爲中國天氣網的「 港澳臺 」頁面源碼中存在不少標籤沒有正確關閉,所以使用 html5lib 的方式去解析數據。ui



03 爬取思路

首先,咱們能夠看到全國分爲華北、東北、華東、華中、華南、西北、西南、港澳臺,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


04 代碼實現

首先爬取「 華北地區 」城市的天氣數據。

能夠獲取到下面的規律:

全部的「 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')複製代碼

05 爬取結果

最後打開生成的餅狀圖,就能很直觀的查看到今天溫度最低的 10 個城市。


本文首發於公衆號「 AirPython 」,後臺回覆「好冷」便可獲取完整代碼。

相關文章
相關標籤/搜索