網絡爬蟲基本概念
基本概念
網絡爬蟲的 wiki 定義如下:
網絡爬蟲(英語:web crawler),也叫網絡蜘蛛(spider),是一種用來自動瀏覽萬維網的網絡機器人,用來獲取萬維網上可用的數據。
對於爬蟲本身是做什麼的,我們都很熟悉,因此這個定義也不言自明。
基本類型
網絡爬蟲的經歷了五個發展歷程
-
建立索引
1989年互聯網誕生之初沒有搜索功能。
1993年6月產生了第一個萬維網漫遊器,可以抓取互聯網上的所有網頁,測量網頁大小,同年12月首個基於爬蟲的搜索引擎誕生 -
2000年網頁API和API爬蟲
Salesforce 和 eBay 首先推出自己的API供程序員下載數據使用
發送一組HTTP請求,然後接收JSON或XML的回饋,爲開發人員提供了一種更友好的網絡爬蟲方式 -
2004 年Python Beautiful Soup
Beautiful Soup可以理解站點的結構,並幫助從HTML容器中解析內容。它被認爲是用於網絡爬蟲的最複雜和最先進的庫,也是當今常見和流行的方法之一。 -
網絡抓取軟件的可視化
爲了降低網絡爬蟲的編碼門檻,使更多有數據爬取需求的人能夠使用網絡爬蟲,可視化的網絡爬蟲軟件,它允許用戶輕鬆簡單的選擇網頁內容,並將這些數據構造成可用的excel文件或數據庫。但是可視化軟件的功能始終是有限的,當遇到高定製化、個性化的需求的時候,依然需要專門的爬蟲工程師來完成。
網絡爬蟲的基本架構
基本架構
一個小型的網絡爬蟲,比如只爬取數個特定頁面的爬蟲,或許只要一個 py 文件就足以勝任,但是要爬取上百萬頁面的大型網絡爬蟲,就需要一定的架構才能更好的完成任務,這樣的爬蟲基本上框架如下:
- 爬蟲調度端:來啓動爬蟲、停止爬蟲、監視爬蟲的運行情況
- URL管理器:對將要爬取的和已經爬取的URL進行管理
- 網頁下載器:
- 從URL管理器中獲取一個將要爬取的URL,傳給網頁下載器
- 下載器將URL指向的網頁下載並存儲爲一個字符串
- 網頁解析器:
- 將網頁下載器下載下來的字符串進行解析
- 一方面獲取價值數據,另一方面每個URL中往往還有指向其他頁面的URL,需要補充到URL管理器中
這四個部分最終組成一個應用程序。
架構流程運行流程
整個爬蟲的架構流程如下所示
- 調度器詢問URL管理器是否有待爬取的URL?
- URL管理器返回是/否
- 如果是,調度器會從URL管理器中獲取一個待爬取的URL
- URL管理器將URL返回給調度器
- 調度器將URL傳給下載器對網頁內容進行下載
- 下載好後下載器將URL內容返回給調度器
- 調度器將URL內容傳遞給解析器進行網頁的解析
- 解析之後將價值數據和新的URL列表傳給調度器
- 一方面調度器會將價值數據傳遞給應用進行數據的收集
- 另一方面將新的URL列表補充進URL管理器
- 如果URL管理器中還有未爬取的URL,那麼將會一直執行上面的循環,直到爬取完所有URL
- 最後調度器會調用應用的方法將價值數據進行輸出,將價值數據輸出到需要的格式
各組件詳解
URL管理器
- URL管理器用來管理待抓取URL集合和已抓取URL集合
- 防止重複抓取和循環抓取
- 因爲每個網頁都有很多指向其他網頁的URL
- 其他網頁也有指向本網頁的URL,就可能存在URL循環指向的問題
- URL管理器需要支持的最小功能範圍
- 添加新的URL到待爬取集合中
- 判斷待添加的URL是否已經存在容器中
- 從容器中獲取一個待爬取的URL
- 判斷容器中還有沒有待爬取的URL
- 將URL從待爬取集合移動到已爬取集合
URL管理器實現方式介紹:
- 將已爬取和未爬取的URL集合都存儲在內存中:使用Python的set類型,因爲Python的set類型可以自動去除集合中重複的數據元素
- 使用關係數據庫:比如在MySQL中建立一張表
- 緩存數據庫,比如使用redis,redis本身就支持set數據結構。目前大型的網絡公司因爲redis的性能比較高,一般都使用redis。
網頁下載器
-
使用Python自帶的urllib2模塊或其他下載庫
-
將互聯網上URL對應的網頁下載到本地的工具,因爲將網頁下載到本地才能進行後續的分析和處理
-
類似於網頁瀏覽器,將URL對應的網頁下載到本地存儲爲本地文件或者內存字符串,然後才能進行分析
-
urllib2模塊:
- 支持直接的URL網頁下載
- 或者向網頁發送一些需要用戶輸入的數據
- 甚至支持需要登錄網頁的cookie處理、需要代理訪問的代理處理
-
requests:第三方插件,功能更強大
網頁解析器
可以使用正則表達式、html.parser、BeautifulSoup、lxml 等實現方式。
本人一般使用 xpath 的方式。