昨天剛剛概念性的回答了爬蟲怎樣斷點續傳的問題,今天看到你這個提問就突然產生把昨天構思的爬蟲構架實現的沖動。希望下面我這些用心寫出的內容能夠解答你的問題。
都說Python是做爬蟲絕好的工具,這是因為用Python寫代碼從互聯網抓數據實在太簡單了。今天我用個簡單的小例子帶大家看一看,怎樣用Python去網站上爬取信息。爬蟲英語叫做Spider,因為蜘蛛會在網上爬來爬去,每個角落都有它的足跡,互聯網上的Spider行為也是一樣的,它會探索網站的每個角落,去抓取感興趣的信息。作為一篇新手向的指導,我沒有向大家介紹Scrapy這些框架,一上來就講框架往往會讓人忽視問題的本質,今天寫的這個小程序沒有借助任何爬蟲框架,原汁原味地用Python實現了一個能自動探索網站的爬蟲程序。
爬蟲的架構設計
爬蟲應當具備兩個基本能力,一是從網頁中發現URL,以便于探索更多的頁面;二是從網頁提取我們想要的數據,這也是開發爬蟲的根本目的。一個典型的爬蟲應當具有下圖這樣的架構。
我們使用隊列去做URL存儲以便更加容易的實現自動化。如下圖所示,在隊列的tail加入待處理的URL(入隊enqueue),然后從head取出URL進行處理(出隊dequeue)。
第一次運行程序,我們放入一個種子URL到隊列中,爬蟲主體從隊列中拿到URL,通過和待抓取網站交互獲取到新的URL,再次放入到URL隊列中,同時把需要解析的數據存儲到數據庫。這便形成了一個自循環系統,只需要設計好URL抽取算法,爬蟲可以完全自動化的工作起來了!這樣看來,我們開發爬蟲需要掌握下面的知識,如果1你還不了解,可以先去百度科普一下,本文的介紹會涉及2~4的相關知識:- Web網站的基本結構,HTTP和HTML相關知識。
- 如何使用HTTP協議方法從Web站點上獲取信息。
- 如何抽取URL和我們感興趣的結構化數據。
- 如何存儲數據。
設計程序框架
根據架構圖,我們使用Python的Queue庫作為URL隊伍使用,新建一個爬蟲主體類,我們命名為SimpleSpider。SimpleSpider的主要功能是從隊伍中取URL、獲取網頁并從中提取URL和數據、將URL放入隊列等功能。代碼框架如下圖所示。
實現URL隊列
為了讓SimpleSpider代碼先能跑得通,我們得先把URL隊列實現了。Queue庫很簡單,我們在加入以下幾行代碼,便完成了隊列的功能。這里還簡單實現了一個去重機制(注意這種使用list去重方法效率很低而且會占用大量內存,實際項目需要用其它方式實現)。
可以注意到在初始化時把news.baidu.com加入了URL隊列,也就是我們爬蟲的起始種子URL是news.baidu.com。
實現網頁下載
需要使用HTTP協議同網站服務器溝通才能下載下來網頁,Python中最為流行的HTTP庫是requests,它的功能很強大,詳細的使用方法可以參考它的中文文檔(http://docs.python-requests.org/zh_CN/latest/user/quickstart.html)。這里只用到它很簡單的一個get方法,在程序中繼續加入以下代碼,便實現了文檔下載的功能。需要提醒的是,requests并非Python的標準庫,需要運行pipinstallrequests安裝。
然后,我們在程序的尾部加上以下代碼,來做一個簡單的測試:
Bingo,百度新聞主頁下載下來并打印出來了!請注意,我們的document變量里存的是網頁的源代碼,因此后面的分析也是基于源代碼進行的。實現提取URL和數據,并保存到磁盤
提取數據,可用的方法非常的多,比如正則表達式、BeautifulSoup、XPath、CssPath等都很強大,今天只簡單介紹下正則表達式。正則表達式如果想到熟練其實并不容易,不過今天教大家一個“萬金油”式的用法,足夠應付開發爬蟲最初期的需要了,那就是模糊匹配:
使用點(.)表示任意字符,使用星號(*)表示任意長度,使用問號(?)表示匹配最近的一個后續字符串,然后使用括號把你想要的數據括起來。
現在我們想要提取URL,實際上就是把網頁上的<a}保存到磁盤。代碼如下,數據被保存在output.txt文件中。
完成并測試我們的爬蟲
最后,需要實現run方法,把我們的爬蟲跑起來。判定只要隊列不是空就一直循環,它完成3步操作:第1步,下載網頁,第2步,提取網頁中我們需要的URL,第3步,提取數據。我們用一個print語句把處理的結果輸出到屏幕上。啟動后爬蟲開始全自動的工作,仔細去探索百度新聞網站。
這是提取出來的數據保存到磁盤上的結果:
由于百度新聞數據量極大,加上我們沒有很好的過濾掉無用的代碼,不出意外的話,這個爬蟲會運行很久才停下來(我已經跑了1小時隊列里已經積壓了5000多個URL了[汗],后面有機會我會告訴大家如何用多線程去極大的提高URL隊列的處理速度)。如果等不及了想看結果請直接按Ctrl+C結束進程。開發真正實用的爬蟲時,需要仔細去設計跳出循環的機制。這個小爬蟲程序是我專門為回答此問題編寫的,如果覺得幫到了你請幫忙點贊呦!大家可以照著指示寫下來應該不會有問題,或者不想動手敲代碼可以加粉私信我,我會一一回復源代碼的下載地址。也希望大家能多多轉發,大家的支持是我堅持寫下去的唯一動力!