之前我們已經(jīng)介紹過(guò)用Python可以輔助快速分析處理工作中遇到的數(shù)據(jù)表。隨著時(shí)代的進(jìn)步,網(wǎng)絡(luò)成為大量數(shù)據(jù)的載體,我們有時(shí)需要從網(wǎng)上獲取大量的信息資源進(jìn)行分析,但是如何能夠高效地獲取需要的信息成了一個(gè)挑戰(zhàn)。傳統(tǒng)的搜索引擎可以幫助我們解決部分問(wèn)題,但還有不少局限性。為此,程序員使用了“聚焦網(wǎng)絡(luò)爬蟲(chóng)”,簡(jiǎn)單來(lái)說(shuō)網(wǎng)絡(luò)爬蟲(chóng)是一個(gè)自動(dòng)獲取初始網(wǎng)頁(yè)上所有鏈接的程序,而聚焦爬蟲(chóng)更加智能,它能夠根據(jù)設(shè)計(jì)者的要求有選擇地訪問(wèn)萬(wàn)維網(wǎng)上的網(wǎng)頁(yè)與相關(guān)的鏈接,經(jīng)算法過(guò)濾后只獲取需要的信息,這種爬蟲(chóng)并不追求大的覆蓋,而將目標(biāo)定為抓取與某一特定主題內(nèi)容相關(guān)的網(wǎng)頁(yè),因此效率更高。
爬蟲(chóng)的基本工作流程分為四個(gè)步驟:發(fā)送請(qǐng)求,獲取響應(yīng)內(nèi)容,解析內(nèi)容,保存數(shù)據(jù)。發(fā)送請(qǐng)求:通過(guò)HTTP庫(kù)向目標(biāo)網(wǎng)站發(fā)送一個(gè)請(qǐng)求,等待響應(yīng);獲取響應(yīng)內(nèi)容:服務(wù)器正常響應(yīng)后能得到一個(gè)響應(yīng)(Response),內(nèi)容為獲取頁(yè)面的內(nèi)容,可能是HTML、JSON字符或者二進(jìn)制數(shù)據(jù)等類型;解析內(nèi)容:得到的內(nèi)容如果是HTML,可以通過(guò)正則表達(dá)式或網(wǎng)頁(yè)解析庫(kù)進(jìn)行解析,如果是JSON字符可以直接轉(zhuǎn)換為JSON對(duì)象解析,如果是二進(jìn)制數(shù)據(jù)可以保存后作進(jìn)一步處理;保存數(shù)據(jù):把解析后的數(shù)據(jù)保存下來(lái),可以是文本,也可以保存到數(shù)據(jù)庫(kù)當(dāng)中。
特別提醒你注意!因非法使用爬蟲(chóng)獲刑的案件屢見(jiàn)不鮮,一定要合法合規(guī)使用爬蟲(chóng)工具,切記遵守以下原則:遵守 Robots 協(xié)議,限制爬蟲(chóng)頻率,不強(qiáng)行突破反爬限制,只獲取公開(kāi)數(shù)據(jù),禁止利用爬取數(shù)據(jù)牟利!如果你還抱有僥幸心理請(qǐng)一定先去看看中國(guó)裁判文書網(wǎng)上大量因非法利用爬蟲(chóng)而獲刑的實(shí)際判例。
學(xué)習(xí)爬蟲(chóng)之前我們需要梳理一下編寫爬蟲(chóng)需要用到的庫(kù)和準(zhǔn)備知識(shí)。
1.Requests模塊:Requests是Python一種第三方模塊,主要用于發(fā)送請(qǐng)求,支持HTTP連接池的連接保持,支持使用Cookie保持會(huì)話,支持文件上傳,支持自動(dòng)響應(yīng)內(nèi)容的編碼,支持國(guó)際化數(shù)據(jù)自動(dòng)編碼。在Python內(nèi)置模塊的基礎(chǔ)上進(jìn)行了高度的封裝,使得Python進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),變得人性化,使用Requests可以輕而易舉地完成瀏覽器需要的任何操作。
2. BeautifulSoup也是一個(gè)受歡迎的Python第三方庫(kù),它是一款優(yōu)秀的網(wǎng)頁(yè)解析庫(kù),提供了很多接口幫助我們來(lái)處理導(dǎo)航、搜索、修改分析樹(shù),它的查找提取功能非常好用,能夠節(jié)省程序員大量的時(shí)間。
3. 除此之外你還要掌握一定的HTML+CSS網(wǎng)頁(yè)知識(shí)內(nèi)容,這是理解Python爬蟲(chóng)的基礎(chǔ),想要自己編寫爬蟲(chóng)程序就需要提前學(xué)習(xí)這方面的知識(shí)。
今天我們就以爬取浙江地區(qū)天氣情況為例,獲取日期(周/日)、浙江天氣(多云/晴/雨)、風(fēng)力(風(fēng)向/級(jí)數(shù))……
使用中國(guó)天氣網(wǎng)作為數(shù)據(jù)源,進(jìn)入當(dāng)?shù)靥鞖忭?yè)面,對(duì)浙江地區(qū)的天氣進(jìn)行查詢,選擇七天天氣變化,表格中會(huì)出現(xiàn)七天天氣變化包括日期、溫度、風(fēng)向……接著我們?cè)谟益I頁(yè)面檢查網(wǎng)頁(yè)源代碼(根據(jù)瀏覽器不同快捷鍵可能是F12或Ctrl+Shift+F)進(jìn)入如圖1的頁(yè)面。
有HTML基礎(chǔ)的可以直接在網(wǎng)頁(yè)源代碼中找需要的信息標(biāo)簽,也可以點(diǎn)擊左上方的鼠標(biāo)按鈕,開(kāi)啟快速查找,點(diǎn)擊圖1網(wǎng)頁(yè)中7天天氣信息定位到該信息的網(wǎng)頁(yè)源代碼,右邊代碼框中用紅框圈出的部分就是目標(biāo)數(shù)據(jù)。
下面開(kāi)始對(duì)網(wǎng)頁(yè)目標(biāo)區(qū)域代碼進(jìn)行解析,我們通過(guò)Python的BeautifulSoup的方法來(lái)鎖定信息,先找到對(duì)應(yīng)id和class的div,然后再找到ul中class為“t clearfix”的部分,其中所有的li標(biāo)簽中的內(nèi)容就是我們的目標(biāo)。div相當(dāng)于一個(gè)整體的框鍵,而li相當(dāng)于框架中的七個(gè)小框鍵用來(lái)存放每一天的天氣數(shù)據(jù)。
接下來(lái)分析li中的內(nèi)容,再次通過(guò)BeatifulSoup來(lái)進(jìn)行數(shù)據(jù)的解析,我們把weathers中的日期、天氣、溫度、風(fēng)力的信息通過(guò)class名字獲取。采用遍歷的方式每次獲取一個(gè)標(biāo)簽,最后輸出相應(yīng)的內(nèi)容,然后存放在文檔中。
代碼如下:
首先導(dǎo)入需要的庫(kù)requests和BeautifulSoup。接下來(lái)設(shè)置保存路徑save,這里存放在了我的電腦桌面的bd.txt中,編碼格式為utf-8。
接下來(lái)res就是我們通過(guò)網(wǎng)址用requests模塊去獲取的存有天氣數(shù)據(jù)的網(wǎng)頁(yè)101210404.shtml。
通過(guò)BeautifulSoup來(lái)搜索確定定位需要爬取的標(biāo)簽內(nèi)容(id,ul,li),具體數(shù)值以網(wǎng)頁(yè)分析為準(zhǔn)。查找成功之后便可以鎖定weather區(qū)域,通過(guò)循環(huán)將天氣中的日期、天氣、溫度、風(fēng)力信息通過(guò)class名字獲取,獲取到的值通過(guò)result全部累加疊合在一起,并且有序地輸出到文本中并保存,作為數(shù)據(jù)源用于后續(xù)的分析處理。