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