您的位置:首頁>科技>正文

淺談Python網路爬蟲

作者: ArkTeam/XHJ

一 相關背景

二 應用場景

圖1 應用場景

三 本文目的

本文簡要介紹對於定向資訊採集所需瞭解基本知識和相關技術, 以及python中與此相關的庫。

同時提供對與資料抓取有關庫的封裝實現, 目的是減少不必要的配置, 便於使用, 目前僅包含對urllib2, requests, mechanize的封裝。 地址: https://github.com/xinhaojing/Crawler

四 運行流程

對於定向資訊的爬取, 爬蟲主要包括資料抓取、資料解析、資料入庫等操作流程。 其中:

(1)數據抓取:發送構造的HTTP請求, 獲得包含所需資料的HTTP回應;

(2)數據解析:對HTTP回應的原始資料進行分析、清洗以提取出需要的資料;

(3)資料入庫:將資料進一步保存到資料庫(或文字檔), 構建知識庫。

圖2.1 基本運行流程

圖2.2 詳細運行流程

五 相關技術

爬蟲的相關技術包括:

(1)數據抓取:瞭解HTTP請求和回應中各欄位的含義;瞭解相關的網路分析工具,

主要用於分析網路流量, 如:burpsuit等。 一般情況, 使用流覽器的開發者模式即可;

(2)數據解析:瞭解HTML結構、JSON和XML資料格式, CSS選擇器、Xpath路徑運算式、規則運算式等, 目的是從回應中提取出所需的資料;

(3)資料入庫:MySQL, SQLite、Redis等資料庫, 便於資料的存儲;

圖3 相關技術

以上是學習爬蟲的基本要求, 在實際的應用中, 也應考慮如何使用多執行緒提高效率、如何做任務調度、如何應對反爬蟲, 如何實現分散式爬蟲等等。 本文介紹的比較有限, 僅供參考。

六 python相關庫

在爬蟲實現上, 除了scrapy框架之外, python有許多與此相關的庫可供使用。 其中, 在資料抓取方面包括: urllib2(urllib3)、requests、mechanize、selenium、splinter;在資料解析方包括:lxml、beautifulsoup4、re、pyquery。

對於資料抓取 , 涉及的過程主要是模擬流覽器向伺服器發送構造好的http請求, 常見類型有:get/post。 其中, urllib2(urllib3)、requests、mechanize用來獲取URL對應的原始回應內容;而selenium、splinter通過載入流覽器驅動, 獲取流覽器渲染之後的回應內容, 類比程度更高。

具體選擇哪種類庫, 應根據實際需求決定, 如考慮效率、對方的反爬蟲手段等。 通常, 能使用urllib2(urllib3)、requests、mechanize等解決的儘量不用selenium、splinter,

因為後者因需要載入流覽器而導致效率較低。

對於資料解析 , 主要是從回應頁面裡提取所需的資料, 常用方法有:xpath路徑運算式、CSS選擇器、規則運算式等。 其中, xpath路徑運算式、CSS選擇器主要用於提取結構化的資料, 而規則運算式主要用於提取非結構化的資料。 相應的庫有lxml、beautifulsoup4、re、pyquery。

表1 相關庫文檔

類庫文檔數 據 抓 取urllib2https://docs.python.org/2/library/urllib2.htmlrequestshttp://cn.python-requests.org/zh_CN/latest
mechanizehttps://mechanize.readthedocs.io/en/latest/
splinterhttp://splinter.readthedocs.io/en/latest/
seleniumhttps://selenium-python.readthedocs.io/
數 據 解 析lxmlhttp://lxml.de/beautifulsoup4https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html http://cuiqingcai.com/1319.html
rehttp://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
pyqueryhttps://pythonhosted.org/pyquery/

七.相關介紹

1資料抓取

(1)urllib2

urllib2是python自帶的一個訪問網頁及本地檔的庫, 通常需要與urllib一起使用。 因為urllib提供了urlencode方法用來對發送的資料進行編碼, 而urllib2沒有對應的方法。

以下是對urllib2簡易封裝的說明, 主要是將相關的特性集中在了一個類函數裡面, 避免一些繁瑣的配置工作。

圖4 urllib2封裝說明

(2)requests和mechanize

requests是Python的協力廠商庫,基於urllib,但比urllib更加方便,介面簡單。其特點包括, 關於http請求: 支援自訂請求頭,支援設置代理、支援重定向、支持保持會話[request.Session()]、支援超時設置、對post資料自動urlencode; 關於http回應: 可直接從回應中獲得詳細的資料,無需人工配置,包括:狀態碼、自動解碼的回應內容、回應頭中的各個欄位;還內置JSON解碼器。

mechanize是對urllib2部分功能的替換,能夠更好的模擬流覽器行為,在web存取控制方面做得很全面。其特點包括:支援cookie設置、代理設置、重定向設置、簡單的表單填寫、流覽器歷史記錄和重載、referer頭的添加(可選)、自動遵守robots.txt、自動處理HTTP-EQUIV和刷新等。

對requests和mechanize簡易封裝後的介面與urllib2一樣,也是將相關特性集中在了一個類函數裡面,這裡不在重複說明,可參考所給代碼。

(3)splinter和selenium

selenium(python)和splinter可以很好的模擬流覽器行為,二者通過載入流覽器驅動工作。在採集資訊方面,降低了分析網路請求的麻煩,一般只需要知道資料頁面對應的URL即可。由於要載入流覽器,所以效率方面相對較低。

chrome和pantomjs驅動地址:

chrome : http://chromedriver.storage.googleapis.com/index.html?path=2.9/

pantomjs : http://phantomjs.org/download.html

2 資料解析

對於資料解析,可用的庫有lxml、beautifulsoup4、re、pyquery。其中,beautifulsoup4比較常用些。除了這些庫的使用,可瞭解一下xpath路徑運算式、CSS選擇器、規則運算式的語法,便於從網頁中提取資料。其中,chrome流覽器自帶生成Xpath的功能。

圖5 chrome查看元素的xpath

如果能夠基於網路分析,抓取到所需資料對應的頁面,接下來,從頁面中提取資料的工作就相對明確很多。具體的使用方法可參考文檔,這裡不在詳細介紹。

八 反爬蟲

1. 基本的反爬蟲手段,主要是檢測請求頭中的欄位,比如:User-Agent、referer等。針對這種情況,只要在請求中帶上對應的欄位即可。所構造http請求的各個欄位最好跟在流覽器中發送的完全一樣,但也不是必須。

2. 基於用戶行為的反爬蟲手段,主要是在後臺對訪問的IP(或User-Agent)進行統計,當超過某一設定的閾值,給予封鎖。針對這種情況,可通過使用代理伺服器解決,每隔幾次請求,切換一下所用代理的IP位址(或通過使用User-Agent列表解決,每次從列表裡隨機選擇一個使用)。這樣的反爬蟲方法可能會誤傷用戶。

3. 希望抓取的資料是如果通過ajax請求得到的,假如通過網路分析能夠找到該ajax請求,也能分析出請求所需的具體參數,則直接模擬相應的http請求,即可從回應中得到對應的資料。這種情況,跟普通的請求沒有什麼區別。

4. 基於JavaScript的反爬蟲手段,主要是在回應資料頁面之前,先返回一段帶有JavaScript代碼的頁面,用於驗證訪問者有無JavaScript的執行環境,以確定使用的是不是流覽器。

通常情況下,這段JS代碼執行後,會發送一個帶參數key的請求,後臺通過判斷key的值來決定是回應真實的頁面,還是回應偽造或錯誤的頁面。因為key參數是動態生成的,每次都不一樣,難以分析出其生成方法,使得無法構造對應的http請求。

比如網站 http://www.kuaidaili.com/ ,使用就是這種方式,具體可參見 https://www.v2ex.com/t/269337 。

在首次訪問網站時,回應的JS內容會發送帶yundun參數的請求,而yundun參數每次都不一樣。

圖6動態參數yundun

目前測試時,該JavaScript代碼執行後,發送的請求不再帶有yundun參數,而是動態生成一個cookie,在隨後的請求中帶上該cookie,作用類似於yundun參數。

圖7 動態cookie

針對這樣的反爬蟲方法,爬蟲方面需要能夠解析執行JavaScript,具體的方法可使用selenium或splinter,通過載入流覽器來實現。

End.

圖4 urllib2封裝說明

(2)requests和mechanize

requests是Python的協力廠商庫,基於urllib,但比urllib更加方便,介面簡單。其特點包括, 關於http請求: 支援自訂請求頭,支援設置代理、支援重定向、支持保持會話[request.Session()]、支援超時設置、對post資料自動urlencode; 關於http回應: 可直接從回應中獲得詳細的資料,無需人工配置,包括:狀態碼、自動解碼的回應內容、回應頭中的各個欄位;還內置JSON解碼器。

mechanize是對urllib2部分功能的替換,能夠更好的模擬流覽器行為,在web存取控制方面做得很全面。其特點包括:支援cookie設置、代理設置、重定向設置、簡單的表單填寫、流覽器歷史記錄和重載、referer頭的添加(可選)、自動遵守robots.txt、自動處理HTTP-EQUIV和刷新等。

對requests和mechanize簡易封裝後的介面與urllib2一樣,也是將相關特性集中在了一個類函數裡面,這裡不在重複說明,可參考所給代碼。

(3)splinter和selenium

selenium(python)和splinter可以很好的模擬流覽器行為,二者通過載入流覽器驅動工作。在採集資訊方面,降低了分析網路請求的麻煩,一般只需要知道資料頁面對應的URL即可。由於要載入流覽器,所以效率方面相對較低。

chrome和pantomjs驅動地址:

chrome : http://chromedriver.storage.googleapis.com/index.html?path=2.9/

pantomjs : http://phantomjs.org/download.html

2 資料解析

對於資料解析,可用的庫有lxml、beautifulsoup4、re、pyquery。其中,beautifulsoup4比較常用些。除了這些庫的使用,可瞭解一下xpath路徑運算式、CSS選擇器、規則運算式的語法,便於從網頁中提取資料。其中,chrome流覽器自帶生成Xpath的功能。

圖5 chrome查看元素的xpath

如果能夠基於網路分析,抓取到所需資料對應的頁面,接下來,從頁面中提取資料的工作就相對明確很多。具體的使用方法可參考文檔,這裡不在詳細介紹。

八 反爬蟲

1. 基本的反爬蟲手段,主要是檢測請求頭中的欄位,比如:User-Agent、referer等。針對這種情況,只要在請求中帶上對應的欄位即可。所構造http請求的各個欄位最好跟在流覽器中發送的完全一樣,但也不是必須。

2. 基於用戶行為的反爬蟲手段,主要是在後臺對訪問的IP(或User-Agent)進行統計,當超過某一設定的閾值,給予封鎖。針對這種情況,可通過使用代理伺服器解決,每隔幾次請求,切換一下所用代理的IP位址(或通過使用User-Agent列表解決,每次從列表裡隨機選擇一個使用)。這樣的反爬蟲方法可能會誤傷用戶。

3. 希望抓取的資料是如果通過ajax請求得到的,假如通過網路分析能夠找到該ajax請求,也能分析出請求所需的具體參數,則直接模擬相應的http請求,即可從回應中得到對應的資料。這種情況,跟普通的請求沒有什麼區別。

4. 基於JavaScript的反爬蟲手段,主要是在回應資料頁面之前,先返回一段帶有JavaScript代碼的頁面,用於驗證訪問者有無JavaScript的執行環境,以確定使用的是不是流覽器。

通常情況下,這段JS代碼執行後,會發送一個帶參數key的請求,後臺通過判斷key的值來決定是回應真實的頁面,還是回應偽造或錯誤的頁面。因為key參數是動態生成的,每次都不一樣,難以分析出其生成方法,使得無法構造對應的http請求。

比如網站 http://www.kuaidaili.com/ ,使用就是這種方式,具體可參見 https://www.v2ex.com/t/269337 。

在首次訪問網站時,回應的JS內容會發送帶yundun參數的請求,而yundun參數每次都不一樣。

圖6動態參數yundun

目前測試時,該JavaScript代碼執行後,發送的請求不再帶有yundun參數,而是動態生成一個cookie,在隨後的請求中帶上該cookie,作用類似於yundun參數。

圖7 動態cookie

針對這樣的反爬蟲方法,爬蟲方面需要能夠解析執行JavaScript,具體的方法可使用selenium或splinter,通過載入流覽器來實現。

End.

Next Article
喜欢就按个赞吧!!!
点击关闭提示