由於一些需要,想要擷取今天的天氣資料,於是又撿起了Python寫了個爬蟲用來擷取中國天氣網上的氣象資料。由於我需要的資料比較簡單,因為我只需要北京地區當天的溫度(最低溫度和最高溫度)和天氣,因此代碼部分比較簡單,下面就來講講這個爬取的過程。
第一步 網頁分析
要進行爬蟲設計,首先得分析網頁的請求過程。首先,開啟中國天氣網首頁,在搜尋方塊中搜尋北京,查看北京地區的天氣,如下圖所示:
發現在今天的資料欄中並沒有我要的最低溫度和最高溫度,於是又選擇了“7天”連結,截圖如下:
這時候我想要的資料(最低溫度、最高溫度)就有了,接下來就該分析網頁的請求過程了。通過對比分析“今天”頁面和“7天”頁面發現,該網站的請求都是簡單的GET的請求。
以請求“7天”頁面為例,請求的URL如下:
URL=“ http://www.weather.com.cn/weather/101010100.shtml”
其中,“weather”代表請求的是“7天”,如果是請求“今天”則是“weather1d“;後面的“101010100”則代表了北京地區的編號。
既然URL已經搞清楚了,那麼就下來就要分析網頁源碼,找到資料在源碼中呈現位置,經過一番尋找,已經定位元據在源碼中的位置,其中天氣資料和溫度資料在兩個p標籤中,而最高溫度資料在span標籤中,最低溫度在i標籤中。
但是這邊需要注意的一個問題是,到了晚上時間,這裡會有一個變化,那就是沒有了最高溫度,在網頁介面呈現的結果為:
在代碼中的呈現結果即為少了一個span標籤,只剩下包含最低溫度資料的i標籤。由於我在資料的應用情境中必須有最高溫度,故為了避免讀取不到最高溫度,我採取的方法是直接利用第二天的最高溫度來代替(雖然比較粗暴)。
到此,網頁的分析工作就結束了,那麼接下來的工作就是擷取資料。
第二步 資料擷取
鑒於Python語言的優雅,本次簡易爬蟲故選用Python+Beautiful Soup 4進行頁面解析。Beauti Soup是一個可以從HTML或XML檔案中提取資料的Python庫,其強大的解析功能,能夠方便快捷的解決很多問題。關於BeautiSoup的相關介紹,大家可以參考官方文檔或是其他檔案,這裡就直接貼出My Code.
from urllib.request import urlopenfrom bs4 import BeautifulSoupimport reresp=urlopen('http://www.weather.com.cn/weather/101010100.shtml')soup=BeautifulSoup(resp,'html.parser')tagToday=soup.find('p',class_="tem") #第一個包含class="tem"的p標籤即為存放今天天氣資料的標籤try: temperatureHigh=tagToday.span.string #有時候這個最高溫度是不顯示的,此時利用第二天的最高溫度代替。except AttributeError as e: temperatureHigh=tagToday.find_next('p',class_="tem").span.string #擷取第二天的最高溫度代替temperatureLow=tagToday.i.string #擷取最低溫度weather=soup.find('p',class_="wea").string #擷取天氣print('最低溫度:' + temperatureLow)print('最高溫度:' + temperatureHigh)print('天氣:' + weather)
程式運行結果如下: