網絡爬蟲(Web Spider)又稱網絡蜘蛛、網絡機器人,是一段用來自動化采集網站資料的程式。如果把網際網路比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。網絡爬蟲不僅能夠為搜尋引擎采集網絡資訊,而且還可以作為定向資訊采集器,定向采集某些網站下的特定資訊,如:汽車票價,招聘資訊,租房資訊,微網誌評論等。

圖1 應用場景
爬蟲技術在科學研究、Web安全、産品研發、輿情監控等領域可以做很多事情。如:在資料挖掘、機器學習、圖像處理等科學研究領域,如果沒有資料,則可以通過爬蟲從網上抓取;在Web安全方面,使用爬蟲可以對網站是否存在某一漏洞進行批量驗證、利用;在産品研發方面,可以采集各個商城物品價格,為使用者提供市場最低價;在輿情監控方面,可以抓取、分析新浪微網誌的資料,進而識别出某使用者是否為水軍。
對于定向資訊的爬取,爬蟲主要包括資料抓取、資料解析、資料入庫等操作流程。其中:
(1)資料抓取:發送構造的HTTP請求,獲得包含所需資料的HTTP響應;
(2)資料解析:對HTTP響應的原始資料進行分析、清洗以提取出需要的資料;
(3)資料入庫:将資料進一步儲存到資料庫(或文本檔案),建構知識庫。
圖2.1 基本運作流程
圖2.2 詳細運作流程
爬蟲的相關技術包括:
(1)資料抓取:了解HTTP請求和響應中各字段的含義;了解相關的網絡分析工具,主要用于分析網絡流量,如:burpsuit等。一般情況,使用浏覽器的開發者模式即可;
(2)資料解析:了解HTML結構、JSON和XML資料格式,CSS選擇器、Xpath路徑表達式、正規表達式等,目的是從響應中提取出所需的資料;
(3)資料入庫:MySQL,SQLite、Redis等資料庫,便于資料的存儲;
圖3 相關技術
以上是學習爬蟲的基本要求,在實際的應用中,也應考慮如何使用多線程提高效率、如何做任務排程、如何應對反爬蟲,如何實作分布式爬蟲等等。本文介紹的比較有限,僅供參考。
在爬蟲實作上,除了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 相關庫文檔
類庫
文檔
數 據 抓 取
urllib2
requests
mechanize
splinter
selenium
數 據 解 析
lxml
beautifulsoup4
re
pyquery
urllib2是python自帶的一個通路網頁及本地檔案的庫,通常需要與urllib一起使用。因為urllib提供了urlencode方法用來對發送的資料進行編碼,而urllib2沒有對應的方法。
以下是對urllib2簡易封裝的說明,主要是将相關的特性集中在了一個類函數裡面,避免一些繁瑣的配置工作。
圖4 urllib2封裝說明
requests是Python的第三方庫,基于urllib,但比urllib更加友善,接口簡單。其特點包括,關于http請求:支援自定義請求頭,支援設定代理、支援重定向、支援保持會話[request.Session()]、支援逾時設定、對post資料自動urlencode;關于http響應:可直接從響應中獲得詳細的資料,無需人工配置,包括:狀态碼、自動解碼的響應内容、響應頭中的各個字段;還内置JSON解碼器。
mechanize是對urllib2部分功能的替換,能夠更好的模拟浏覽器行為,在web通路控制方面做得很全面。其特點包括:支援cookie設定、代理設定、重定向設定、簡單的表單填寫、浏覽器曆史記錄和重載、referer頭的添加(可選)、自動遵守robots.txt、自動處理HTTP-EQUIV和重新整理等。
對requests和mechanize簡易封裝後的接口與urllib2一樣,也是将相關特性集中在了一個類函數裡面,這裡不在重複說明,可參考所給代碼。
selenium(python)和splinter可以很好的模拟浏覽器行為,二者通過加載浏覽器驅動工作。在采集資訊方面,降低了分析網絡請求的麻煩,一般隻需要知道資料頁面對應的URL即可。由于要加載浏覽器,是以效率方面相對較低。
預設情況下,優先使用的是Firefox浏覽器。這裡列出chrome和pantomjs(無頭浏覽器)驅動的下載下傳位址,友善查找。
chrome和pantomjs驅動位址:
對于資料解析,可用的庫有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請求。
在首次通路網站時,響應的JS内容會發送帶yundun參數的請求,而yundun參數每次都不一樣。
圖6動态參數yundun
目前測試時,該JavaScript代碼執行後,發送的請求不再帶有yundun參數,而是動态生成一個cookie,在随後的請求中帶上該cookie,作用類似于yundun參數。
圖7 動态cookie
針對這樣的反爬蟲方法,爬蟲方面需要能夠解析執行JavaScript,具體的方法可使用selenium或splinter,通過加載浏覽器來實作。
更詳細的反爬蟲技術和應對方法可參考:
本文轉自 技術花妞妞 51CTO部落格,原文連結:http://blog.51cto.com/xiaogongju/2068527