一 相關背景
網(wǎng)絡爬蟲(Web Spider)又稱網(wǎng)絡蜘蛛、網(wǎng)絡機器人,是一段用來自動化采集網(wǎng)站數(shù)據(jù)的程序。如果把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。網(wǎng)絡爬蟲不僅能夠為搜索引擎采集網(wǎng)絡信息,而且還可以作為定向信息采集器,定向采集某些網(wǎng)站下的特定信息,如:汽車票價,招聘信息,租房信息,微博評論等。
二 應用場景

圖1 應用場景
爬蟲技術在科學研究、Web安全、產(chǎn)品研發(fā)、輿情監(jiān)控等領域可以做很多事情。如:在數(shù)據(jù)挖掘、機器學習、圖像處理等科學研究領域,如果沒有數(shù)據(jù),則可以通過爬蟲從網(wǎng)上抓;在Web安全方面,使用爬蟲可以對網(wǎng)站是否存在某一漏洞進行批量驗證、利用;在產(chǎn)品研發(fā)方面,可以采集各個商城物品價格,為用戶提供市場最低價;在輿情監(jiān)控方面,可以抓取、分析新浪微博的數(shù)據(jù),從而識別出某用戶是否為水軍。
三 本文目的
本文簡要介紹對于定向信息采集所需了解基本知識和相關技術,以及python中與此相關的庫。同時提供對與數(shù)據(jù)抓取有關庫的封裝實現(xiàn),目的是減少不必要的配置,便于使用,目前僅包含對urllib2, requests, mechanize的封裝。地址:https://github.com/xinhaojing/Crawler
四 運行流程
對于定向信息的爬取,爬蟲主要包括數(shù)據(jù)抓取、數(shù)據(jù)解析、數(shù)據(jù)入庫等操作流程。其中:
(1)數(shù)據(jù)抓。喊l(fā)送構造的HTTP請求,獲得包含所需數(shù)據(jù)的HTTP響應;
(2)數(shù)據(jù)解析:對HTTP響應的原始數(shù)據(jù)進行分析、清洗以提取出需要的數(shù)據(jù);
(3)數(shù)據(jù)入庫:將數(shù)據(jù)進一步保存到數(shù)據(jù)庫(或文本文件),構建知識庫。

圖2.1 基本運行流程

圖2.2 詳細運行流程
五 相關技術
爬蟲的相關技術包括:
(1)數(shù)據(jù)抓取:了解HTTP請求和響應中各字段的含義;了解相關的網(wǎng)絡分析工具,主要用于分析網(wǎng)絡流量,如:burpsuit等。一般情況,使用瀏覽器的開發(fā)者模式即可;
(2)數(shù)據(jù)解析:了解HTML結構、JSON和XML數(shù)據(jù)格式,CSS選擇器、Xpath路徑表達式、正則表達式等,目的是從響應中提取出所需的數(shù)據(jù);
(3)數(shù)據(jù)入庫:MySQL,SQLite、Redis等數(shù)據(jù)庫,便于數(shù)據(jù)的存儲;

圖3 相關技術
以上是學習爬蟲的基本要求,在實際的應用中,也應考慮如何使用多線程提高效率、如何做任務調(diào)度、如何應對反爬蟲,如何實現(xiàn)分布式爬蟲等等。本文介紹的比較有限,僅供參考。
六 python相關庫
在爬蟲實現(xiàn)上,除了scrapy框架之外,python有許多與此相關的庫可供使用。其中,在數(shù)據(jù)抓取方面包括: urllib2(urllib3)、requests、mechanize、selenium、splinter;在數(shù)據(jù)解析方包括:lxml、beautifulsoup4、re、pyquery。
對于數(shù)據(jù)抓取,涉及的過程主要是模擬瀏覽器向服務器發(fā)送構造好的http請求,常見類型有:get/post。其中,urllib2(urllib3)、requests、mechanize用來獲取URL對應的原始響應內(nèi)容;而selenium、splinter通過加載瀏覽器驅動,獲取瀏覽器渲染之后的響應內(nèi)容,模擬程度更高。
具體選擇哪種類庫,應根據(jù)實際需求決定,如考慮效率、對方的反爬蟲手段等。通常,能使用urllib2(urllib3)、requests、mechanize等解決的盡量不用selenium、splinter,因為后者因需要加載瀏覽器而導致效率較低。
對于數(shù)據(jù)解析,主要是從響應頁面里提取所需的數(shù)據(jù),常用方法有:xpath路徑表達式、CSS選擇器、正則表達式等。其中,xpath路徑表達式、CSS選擇器主要用于提取結構化的數(shù)據(jù),而正則表達式主要用于提取非結構化的數(shù)據(jù)。相應的庫有l(wèi)xml、beautifulsoup4、re、pyquery。
表1 相關庫文檔
類庫
文檔
數(shù) 據(jù) 抓 取
urllib2
https://docs.python.org/2/library/urllib2.html
requests
http://cn.python-requests.org/zh_CN/latest
mechanize
https://mechanize.readthedocs.io/en/latest/
splinter
http://splinter.readthedocs.io/en/latest/
selenium
https://selenium-python.readthedocs.io/
數(shù) 據(jù) 解 析
lxml
http://lxml.de/
beautifulsoup4
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html http://cuiqingcai.com/1319.html
re
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
pyquery
https://pythonhosted.org/pyquery/
七.相關介紹
1數(shù)據(jù)抓取
(1)urllib2
urllib2是python自帶的一個訪問網(wǎng)頁及本地文件的庫,通常需要與urllib一起使用。因為urllib提供了urlencode方法用來對發(fā)送的數(shù)據(jù)進行編碼,而urllib2沒有對應的方法。
以下是對urllib2簡易封裝的說明,主要是將相關的特性集中在了一個類函數(shù)里面,避免一些繁瑣的配置工作。



圖4 urllib2封裝說明
(2)requests和mechanize
requests是Python的第三方庫,基于urllib,但比urllib更加方便,接口簡單。其特點包括,關于http請求:支持自定義請求頭,支持設置代理、支持重定向、支持保持會話[request.Session()]、支持超時設置、對post數(shù)據(jù)自動urlencode;關于http響應:可直接從響應中獲得詳細的數(shù)據(jù),無需人工配置,包括:狀態(tài)碼、自動解碼的響應內(nèi)容、響應頭中的各個字段;還內(nèi)置JSON解碼器。
mechanize是對urllib2部分功能的替換,能夠更好的模擬瀏覽器行為,在web訪問控制方面做得很全面。其特點包括:支持cookie設置、代理設置、重定向設置、簡單的表單填寫、瀏覽器歷史記錄和重載、referer頭的添加(可選)、自動遵守robots.txt、自動處理HTTP-EQUIV和刷新等。
對requests和mechanize簡易封裝后的接口與urllib2一樣,也是將相關特性集中在了一個類函數(shù)里面,這里不在重復說明,可參考所給代碼。
(4)splinter和selenium
selenium(python)和splinter可以很好的模擬瀏覽器行為,二者通過加載瀏覽器驅動工作。在采集信息方面,降低了分析網(wǎng)絡請求的麻煩,一般只需要知道數(shù)據(jù)頁面對應的URL即可。由于要加載瀏覽器,所以效率方面相對較低。
默認情況下,優(yōu)先使用的是Firefox瀏覽器。這里列出chrome和pantomjs(無頭瀏覽器)驅動的下載地址,方便查找。
chrome和pantomjs驅動地址:
chrome : http://chromedriver.storage.googleapis.com/index.html?path=2.9/
pantomjs : http://phantomjs.org/download.html
2 數(shù)據(jù)解析
對于數(shù)據(jù)解析,可用的庫有l(wèi)xml、beautifulsoup4、re、pyquery。其中,beautifulsoup4比較常用些。除了這些庫的使用,可了解一下xpath路徑表達式、CSS選擇器、正則表達式的語法,便于從網(wǎng)頁中提取數(shù)據(jù)。其中,chrome瀏覽器自帶生成Xpath的功能。

圖5 chrome查看元素的xpath
如果能夠基于網(wǎng)絡分析,抓取到所需數(shù)據(jù)對應的頁面,接下來,從頁面中提取數(shù)據(jù)的工作就相對明確很多。具體的使用方法可參考文檔,這里不在詳細介紹。
八 反爬蟲
1. 基本的反爬蟲手段,主要是檢測請求頭中的字段,比如:User-Agent、referer等。針對這種情況,只要在請求中帶上對應的字段即可。所構造http請求的各個字段最好跟在瀏覽器中發(fā)送的完全一樣,但也不是必須。
2. 基于用戶行為的反爬蟲手段,主要是在后臺對訪問的IP(或User-Agent)進行統(tǒng)計,當超過某一設定的閾值,給予封鎖。針對這種情況,可通過使用代理服務器解決,每隔幾次請求,切換一下所用代理的IP地址(或通過使用User-Agent列表解決,每次從列表里隨機選擇一個使用)。這樣的反爬蟲方法可能會誤傷用戶。
3. 希望抓取的數(shù)據(jù)是如果通過ajax請求得到的,假如通過網(wǎng)絡分析能夠找到該ajax請求,也能分析出請求所需的具體參數(shù),則直接模擬相應的http請求,即可從響應中得到對應的數(shù)據(jù)。這種情況,跟普通的請求沒有什么區(qū)別。
4. 基于JavaScript的反爬蟲手段,主要是在響應數(shù)據(jù)頁面之前,先返回一段帶有JavaScript代碼的頁面,用于驗證訪問者有無JavaScript的執(zhí)行環(huán)境,以確定使用的是不是瀏覽器。
通常情況下,這段JS代碼執(zhí)行后,會發(fā)送一個帶參數(shù)key的請求,后臺通過判斷key的值來決定是響應真實的頁面,還是響應偽造或錯誤的頁面。因為key參數(shù)是動態(tài)生成的,每次都不一樣,難以分析出其生成方法,使得無法構造對應的http請求。
比如網(wǎng)站http://www.kuaidaili.com/,使用就是這種方式,具體可參見https://www.v2ex.com/t/269337。
在首次訪問網(wǎng)站時,響應的JS內(nèi)容會發(fā)送帶yundun參數(shù)的請求,而yundun參數(shù)每次都不一樣。


圖6動態(tài)參數(shù)yundun
目前測試時,該JavaScript代碼執(zhí)行后,發(fā)送的請求不再帶有yundun參數(shù),而是動態(tài)生成一個cookie,在隨后的請求中帶上該cookie,作用類似于yundun參數(shù)。



圖7 動態(tài)cookie
針對這樣的反爬蟲方法,爬蟲方面需要能夠解析執(zhí)行JavaScript,具體的方法可使用selenium或splinter,通過加載瀏覽器來實現(xiàn)。
|