哪個城市最熱?
現(xiàn)如今瓢剿,我大天朝舉國上下都處于一種高溫的狀態(tài)逢慌。那么這里我們也來蹭一蹭熱度,來寫個小爬蟲间狂,看看全國哪個城市最熱攻泼。東西雖然小,但是比起那些所謂“高大上”的教程來說鉴象,這篇文章比較腳踏實地忙菠,不玩虛的,你看完后一定可以學會的纺弊。
準備工作:
-
在做爬蟲之前只搁,首先對爬蟲的解題路徑做個簡單概述。一個爬蟲工作分為兩步驟:
- 第一步:把你需要爬取的那個網(wǎng)頁的數(shù)據(jù)全部拉下來俭尖。
- 第二步是把從網(wǎng)站上拉下來的數(shù)據(jù)進行過濾氢惋,把你需要的提取出來,把不需要的給過濾掉稽犁。這就是爬蟲的工作原理焰望。
我們要爬取的網(wǎng)站數(shù)據(jù)不是特別大,復雜度也不高已亥。因此為降低大家學習爬蟲的難度熊赖。我們不上那些很復雜的框架,比如
Scrapy
虑椎,而是直接使用一個簡單又好用的第三方庫幫我們完成爬蟲任務震鹉,那就是requests
庫俱笛。requests
庫是一個專門用來從網(wǎng)站上拉取數(shù)據(jù)的庫,也就對應了我們爬蟲工作的第一步——從網(wǎng)站上拉取數(shù)據(jù)传趾。這個庫的使用迎膜,后面我們會講到,如果您還沒有安裝這個庫浆兰,那么可以通過以下命令進行安裝:pip install requests
磕仅。如果您使用的是Linux
或者Mac OS
系統(tǒng),那么最好在前面加上一個sudo pip install requests
簸呈,不然很容易會因為權限問題而安裝失敗榕订。-
在使用
requests
庫把數(shù)據(jù)拉取下來以后,接下來的工作就是對這些數(shù)據(jù)進行分析和過濾了蜕便。這時候我們使用的一個第三方庫是beautifulsoup4
劫恒。這個庫是專門用來解析網(wǎng)頁數(shù)據(jù)的。并且為了使接下效率更高轿腺,一般我們推薦使用lxml
來作為解析的引擎兼贸。因此,要使用beautifulsoup
庫吃溅,要通過以下命令來安裝:# 安裝lxml pip install lxml # 安裝beautifulsoup4 pip install bs4
中國天氣網(wǎng)分析:
這里我們需要爬取的網(wǎng)站是:中國天氣網(wǎng)http://www.weather.com.cn/textFC/hb.shtml#
溶诞。我們做任何爬蟲之前,都需要對這個網(wǎng)站進行詳細的分析决侈,一定要達到了如指掌的境地螺垢。不然后面很容易在數(shù)據(jù)過濾的時候會出現(xiàn)一個問題,這也是所有做爬蟲需要注意的地方赖歌。我們這里就跟大家分析一下中國天氣網(wǎng)的網(wǎng)站:
-
在以上這個中國天氣網(wǎng)的頁面中枉圃。我們可以看到,他是通過區(qū)域的方式把全國個大省份和城市進行區(qū)分的庐冯,有:華北孽亲、東北、華東展父、華中返劲、華南、西北栖茉、西南篮绿、港澳臺。在每個區(qū)域下面吕漂,都是通過表格的形式把屬于該區(qū)域下的所有省份以及城市的天氣信息列出來亲配。因此我們要做的是,首先找到所有的區(qū)域的鏈接,然后再在每個區(qū)域的鏈接下把這個區(qū)域下的所有的城市天氣信息爬出來就可以了吼虎。
-
我們已經知道只要拿到了所有的區(qū)域鏈接犬钢,就可以在這個鏈接的網(wǎng)頁中把這些城市拿到。那么如何去拿到這個區(qū)域下對應的所有城市以及他們對應的天氣信息呢思灰?這時候就需要去解析源代碼了玷犹,我們點擊這個頁面任何一個地方,然后右鍵點擊審查元素官辈,打開控制臺后,去尋找規(guī)則(因為這個尋找規(guī)則比較繁瑣遍坟,這里就做個簡單概述拳亿,如果對如何去找到相應的元素感興趣,可以關注本公眾號愿伴,會有一套詳細的視頻教程免費教大家查找)肺魁。我們可以看到,一個省份的城市及其天氣信息隔节,都是放在一個叫做
<div class='conMidtab2'>
的盒子中鹅经。因此我們只要找到所有的conMidtab2
盒子,就找到了所有的城市怎诫。但是這個地方需要注意的是瘾晃,因為在一個頁面中,展示了7天的數(shù)據(jù)幻妓,因此如果你按照class='conMidtab2'
這個規(guī)則去尋找的話蹦误,會得到從今天往后延7天的所有數(shù)據(jù)。這時候我們就要換一個規(guī)則了肉津,我們經過分析(具體分析過程可以看本教程視頻內容)發(fā)現(xiàn)一天的天氣信息强胰,是放在一個class='conMidtab'
的這樣一個盒子中。因此我們只要把第一個conMidtab
盒子拿到妹沙,就可以拿到今天的天氣數(shù)據(jù)而把其他日期的數(shù)據(jù)給過濾掉偶洋。這里要給大家上一份源代碼了:# find方法,只會返回第一個滿足條件的元素距糖,也即只把第一個conMidtab返回回來玄窝,把今天的數(shù)據(jù)返回回來 conMidtab = soup.find('div', class_='conMidtab') # 通過得到的這個conMidtab,我們再調用find_all方法悍引,把這個conMidtab元素下的所有conMidtab2盒子找到哆料,得到這一天中這個區(qū)域下所有的城市 conMidtab2_list = conMidtab.find_all('div', class_='conMidtab2')
也上一份圖片給大家分析一下:
-
我們已經分析好了如何獲取城市的盒子,那么接下來就是去獲取城市的天氣信息了吗铐。我們繼續(xù)分析(具體分析過程可以看本視頻教程)后發(fā)現(xiàn)东亦,在
table
中,前面兩個tr
是表頭,知識用來解釋數(shù)據(jù)的典阵,我們不需要奋渔,那么真正有用的數(shù)據(jù)是從第三個tr
開始的。并且第三個tr
的第1個td
展示的是該省或者直轄市的名稱壮啊,從第二個td
開始才是真正展示該省份下這個城市的詳細天氣情況了嫉鲸,這里上一張圖片分析一下:
并且,從第四個
tr
開始歹啼,下面的td
全部展示的就是這個城市的信息了玄渗,而不包括省份的信息了,這里也用一張圖片來說明這個問題:
所以綜合以上的分析狸眼,我們就知道藤树,省份名稱是存儲在
table
下的第三個tr
下的第0個td
下,而城市名字則要進行判斷拓萌,如果是第三個tr
岁钓,那么就是在第二個td
,如果是從第四個開始微王,那么就是存儲在第0個td
下屡限。而最高氣溫也要區(qū)分,第三個tr
炕倘,存儲在第5個td
下钧大,從第四個tr
開始,則存儲在第4個td
下罩旋,那么我們也可以上一份源代碼拓型,看看如何獲取的:conMidtab = soup.find('div', class_='conMidtab') conMidtab2_list = conMidtab.find_all('div', class_='conMidtab2') for x in conMidtab2_list: tr_list = x.find_all('tr')[2:] province = '' for index, tr in enumerate(tr_list): # 如果是第0個tr標簽,那么城市名和省份名是放在一起的 min = 0 if index == 0: td_list = tr.find_all('td') province = td_list[0].text.replace('\n', '') city = td_list[1].text.replace('\n', '') max = td_list[5].text.replace('\n', '') else: # 如果不是第0個tr標簽瘸恼,那么在這個tr標簽中只存放城市名 td_list = tr.find_all('td') city = td_list[0].text.replace('\n', '') max = td_list[4].text.replace('\n', '') TEMPERATURE_LIST.append({ 'city': province+city, 'min': min })
數(shù)據(jù)顯示:
如果把所有數(shù)據(jù)都爬下來后劣挫,那么我們可以使用echarts-python
把數(shù)據(jù)進行可視化,這部分內容比較簡單东帅,我就直接把我做的可視化的數(shù)據(jù)圖給大家看下压固,具體的實現(xiàn)方式,大家可以觀看我的視頻教程靠闭,講解非常詳細:
寫在最后:
以上是對中國天氣網(wǎng)爬蟲和數(shù)據(jù)可視化的分析帐我,爬蟲雖然簡單,但也是五臟俱全愧膀,囊括了爬蟲邏輯的方方面面拦键,并且在最后還把爬取出來的數(shù)據(jù)進行了可視化,使我們爬取出來的數(shù)據(jù)有用武之地檩淋。另外芬为,如果想精通爬蟲技術萄金,建議學習下這個課程媚朦,相信你學習完后有很大的成長:21天搞定Python分布式爬蟲