Python網絡爬蟲(2):迷你爬蟲架構

摘要:從零開始寫爬蟲,初學者的速成指南!mysql

 

封面:web

 

介紹正則表達式

你們好!回顧上一期,咱們在介紹了爬蟲的基本概念以後,就利用各類工具橫衝直撞的完成了一個小爬蟲,目的就是猛、糙、快,方便初學者上手,創建信心。對於有必定基礎的讀者,請不要着急,之後咱們會學習主流的開源框架,打造出一個強大專業的爬蟲系統!不過在此以前,要繼續打好基礎,本期咱們先介紹爬蟲的種類,而後選取最典型的通用網絡爬蟲,爲其設計一個迷你框架。有了本身對框架的思考後,再學習複雜的開源框架就有頭緒了。算法

今天咱們會把更多的時間用在思考上,而不是一根筋的coding。用80%的時間思考,20%的時間敲鍵盤,這樣更有利於進步。sql

 

 

語言&環境mongodb

語言:帶足彈藥,繼續用Python開路!安全

 

 

threadingthreading庫能夠在單獨的線程中執行任何的在Python中能夠調用的對象。Python 2.x中的thread模塊已被廢棄,用戶可使用threading模塊代替。在Python 3中不能再使用thread模塊。爲了兼容性,Python 3將thread重命名爲_thread。網絡

queuequeue模塊中提供了同步的、線程安全的隊列類,包括FIFO(先入先出)隊列Queue,LIFO(後入先出)隊列LifoQueue,和優先級隊列PriorityQueue。這些隊列都實現了鎖原語,可以在多線程中直接使用。可使用隊列來實現線程間的同步。多線程

rePython 自1.5版本起增長了re模塊,它提供Perl風格的正則表達式模式。re模塊使 Python語言擁有所有的正則表達式功能。架構

argparsePython用於解析命令行參數和選項的標準模塊,用於代替已通過時的optparse模塊。argparse模塊的做用是用於解析命令行參數。

configparser讀取配置文件的模塊。

爬蟲的種類

 

 

網絡爬蟲按照系統結構和實現技術,大體能夠分爲如下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。實際的網絡爬蟲系統一般是幾種爬蟲技術相結合實現的。

通用網絡爬蟲

通用網絡爬蟲又稱全網爬蟲(Scalable Web Crawler),爬取對象從一些種子 URL 擴充到整個 Web。主要爲門戶站點搜索引擎和大型 Web 服務提供商採集數據。

通用網絡爬蟲的結構大體能夠分爲頁面爬取模塊 、頁面分析模塊、連接過濾模塊、頁面存儲模塊、URL 隊列、初始 URL 集合幾個部分。爲提升工做效率,通用網絡爬蟲會採起必定的爬取策略。 經常使用的爬取策略有:深度優先策略、廣度優先策略。

1) 深度優先策略(DFS):其基本方法是按照深度由低到高的順序,依次訪問下一級網頁連接,直到不能再深刻爲止。

2) 廣度優先策略(BFS):此策略按照網頁內容目錄層次深淺來爬取頁面,處於較淺目錄層次的頁面首先被爬取。 當同一層次中的頁面爬取完畢後,爬蟲再深刻下一層繼續爬取。

聚焦網絡爬蟲

聚焦網絡爬蟲(Focused Crawler),又稱主題網絡爬蟲(Topical Crawler),是指選擇性地爬取那些與預先定義好的主題相關頁面的網絡爬蟲。 和通用網絡爬蟲相比,聚焦爬蟲只須要爬取與主題相關的頁面,極大地節省了硬件和網絡資源,保存的頁面也因爲數量少而更新快,還能夠很好地知足一些特定人羣對特定領域信息的需求。咱們以前爬的歌單就屬於這一種。

增量式網絡爬蟲

增量式網絡爬蟲(Incremental Web Crawler)是 指 對 已 下 載 網 頁 採 取 增 量式更新和只爬取新產生的或者已經發生變化網頁的爬蟲,它可以在必定程度上保證所爬取的頁面是儘量新的頁面。 和週期性爬取和刷新頁面的網絡爬蟲相比,增量式爬蟲只會在須要的時候爬取新產生或發生更新的頁面 ,並不從新下載沒有發生變化的頁面,可有效減小數據下載量,及時更新已爬取的網頁,減少時間和空間上的耗費,可是增長了爬取算法的複雜度和實現難度。如今比較火的輿情爬蟲通常都是增量式網絡爬蟲。

深網爬蟲

Web 頁面按存在方式能夠分爲表層網頁(Surface Web)和深層網頁(Deep Web,也稱 Invisible Web Pages 或 Hidden Web)。 表層網頁是指傳統搜索引擎能夠索引的頁面,以超連接能夠到達的靜態網頁爲主構成的 Web 頁面。Deep Web 是那些大部份內容不能經過靜態連接獲取的、隱藏在搜索表單後的,只有用戶提交一些關鍵詞才能得到的 Web 頁面。例如那些用戶註冊後內容纔可見的網頁就屬於 Deep Web。

一個迷你框架

下面以比較典型的通用爬蟲爲例,分析其工程要點,設計並實現一個迷你框架。架構圖以下:

 

 

代碼結構:

 

 

config_load.py 配置文件加載

crawl_thread.py 爬取線程

mini_spider.py 主線程

spider.conf 配置文件

url_table.py url隊列、url表

urls.txt 種子url集合

webpage_parse.py 網頁分析

webpage_save.py 網頁存儲

看看配置文件裏有什麼內容:

spider.conf

 

 

Step 1.採用BFS仍是DFS?

理論上,這兩個算法都可以在大體相同的時間裏爬取整個互聯網上的內容。但顯然各個網站最重要的網頁應該是它的首頁。在極端狀況下,若是隻能下載很是有限的網頁,那麼應該下載的全部網站的首頁,若是把爬蟲再擴大些,應該爬取從首頁直接連接的網頁,由於這些網頁是網站設計者本身認爲至關重要的網頁。在這個前提下,顯然BFS明顯優於DFS。事實上在搜索引擎的爬蟲裏,主要採用的就是BFS。咱們的框架採起這種策略。

抓取深度能夠經過配置文件中的max_depth設置,只要沒到達指定深度,程序就會不停的將解析出的url放入隊列中:

Step 2.初始URL集合、URL隊列

咱們來看看通用爬蟲如何下載整個互聯網。假設從一家門戶網站的首頁出發,先下載這個網頁(深度=0),而後經過分析這個網頁,能夠找到頁面裏的全部超連接,也就等於知道了這家門戶網站首頁所直接鏈接的所有網頁,諸如京東理財、京東白條,京東衆籌等(深度=1)。接下來訪問、下載並分析京東理財等網頁,又能找到其餘相連的網頁(深度=2)。讓計算機不停的作下去,就能下載整個網站。

在這個過程當中,咱們須要一個「初始URL集合」保存門戶的首頁,還須要一個「URL隊列」保存分析網頁獲得的超連接。

mini_spider.py

url_table.py

 

 

Step 3.記錄哪些網頁已經下載過的小本本——URL表。

在互聯網上,一個網頁可能被多個網頁中的超連接所指向。這樣在遍歷互聯網這張圖的時候,這個網頁可能被屢次訪問到。爲了防止一個網頁被下載和解析屢次,須要一個URL表記錄哪些網頁已經下載過。再遇到這個網頁的時候,咱們就能夠跳過它。

crawl_thread.py

 

 

Step 4.多個抓取線程

爲了提高爬蟲性能,須要多個抓取線程,從URL隊列獲取連接進行處理。多線程並沒什麼毛病,但Python的多線程可能會引發不少人的質疑,這源於Python設計之初的考慮:GIL。GIL的全稱是Global Interpreter Lock(全局解釋器鎖),某個線程想要執行,必須先拿到GIL,而且在一個Python進程中,GIL只有一個。結果就是Python裏一個進程永遠只能同時執行一個線程,這就是爲何在多核CPU上,Python的多線程效率並不高。那麼咱們爲何還要用Python多線程呢?

CPU密集型代碼(各類循環處理、編解碼等等),在這種狀況下,因爲計算工做多,ticks計數很快就會達到閾值,而後觸發GIL的釋放與再競爭(多個線程來回切換固然是須要消耗資源的),Python下的多線程對CPU密集型代碼並不友好。

IO密集型代碼(文件處理、網絡爬蟲等),多線程可以有效提高效率(單線程下有IO操做會進行IO等待,形成沒必要要的時間浪費,而開啓多線程能在線程A等待時,自動切換到線程B,能夠不浪費CPU的資源,從而能提高程序執行效率)。Python的多線程對IO密集型代碼比較友好。

因此,對於IO密集的爬蟲程序,使用Python多線程是沒問題的。

crawl_thread.py

 

 

Step 5.頁面分析模塊

從網頁中解析出URLs或者其餘有用的數據。這個是上期重點介紹的,能夠參考以前的代碼。

Step 6.頁面存儲模塊

保存頁面的模塊,目前將文件保存爲文件,之後能夠擴展出多種存儲方式,如mysql,mongodb,hbase等等。

webpage_save.py

 

 

寫到這裏,整個框架已經清晰的呈如今你們眼前了,千萬不要小看它,無論多麼複雜的框架都是在這些基本要素上擴展出來的。

下一步

基礎知識的學習暫時告一段落,但願可以幫助你們打下必定的基礎。下期開始爲你們介紹強大成熟的爬蟲框架Scrapy,它提供了不少強大的特性來使得爬取更爲簡單高效,更多精彩,敬請期待!

獲取視頻資料,轉發此文+點擊喜歡,而後進做者建立qun:814468827 找羣文件:網易雲音樂視頻教程+源碼

相關文章
相關標籤/搜索