0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一篇了解爬蟲技術方方面面

馬哥Linux運維 ? 來源:未知 ? 作者:李倩 ? 2018-10-23 17:01 ? 次閱讀

原理

傳統(tǒng)爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。聚焦爬蟲的工作流程較為復雜,需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接并將其放入等待抓取的URL隊列。

然后,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,并重復上述過程,直到達到系統(tǒng)的某一條件時停止。另外,所有被爬蟲抓取的網頁將會被系統(tǒng)存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索;

所以一個完整的爬蟲一般會包含如下三個模塊:

網絡請求模塊

爬取流程控制模塊

內容分析提取模塊

網絡請求

我們常說爬蟲其實就是一堆的http(s)請求,找到待爬取的鏈接,然后發(fā)送一個請求包,得到一個返回包,當然,也有HTTP長連接(keep-alive)或h5中基于stream的websocket協(xié)議,這里暫不考慮;

所以核心的幾個要素就是:

url

請求header、body

響應herder、內容

URL

爬蟲開始運行時需要一個初始url,然后會根據爬取到的html文章,解析里面的鏈接,然后繼續(xù)爬取,這就像一棵多叉樹,從根節(jié)點開始,每走一步,就會產生新的節(jié)點。為了使爬蟲能夠結束,一般都會指定一個爬取深度(Depth)。

Http請求

http請求信息由請求方法(method)、請求頭(headers)、請求正文(body)三部分組成。由于method一般是header中的第一行,也可以說請求頭中包含請求方法,下面是chrome訪問請求頭的一部分:

對于爬蟲需要注意的是請求方法是post時,需要將請求的參數先進行urlencode后再發(fā)送,后臺收到請求信息后可能會做一些校驗,這可能會影響到爬取,相關的header字段如下:

Basic Auth

這是一種古老的、不安全的用戶驗證方式,一般會有用戶授權的限制,會在headers的Autheration字段里要求加入用戶名密碼(明文),如果驗證失敗則請求就會失敗,現(xiàn)在這種認證方式正在被淘汰。

Referer

鏈接的來源,通常在訪問鏈接時,都要帶上Referer字段,服務器會進行來源驗證,后臺通常會用此字段作為防盜鏈的依據。

User-Agent

后臺通常會通過此字段判斷用戶設備類型、系統(tǒng)以及瀏覽器的型號版本。有些編程語言包里網絡請求會自定義User-Agent,可以被辨別出來,爬蟲中可以設置為瀏覽器的ua.

Cookie

一般在用戶登錄或者某些操作后,服務端會在返回包中包含Cookie信息要求瀏覽器設置Cookie,沒有Cookie會很容易被辨別出來是偽造請求;

也有本地通過JS,根據服務端返回的某個信息進行處理生成的加密信息,設置在Cookie里面;

JavaScript加密操作

在進行敏感數據傳輸時,一般都會通過javascript進行加密,例如qq空間就會對用戶登陸密碼進行RSA加密后再發(fā)送給服務器,因此,爬蟲在模擬登陸時需要自己去請求公鑰,然后加密。

自定義字段

因為http的headers可以自定義地段,所以第三方可能會加入了一些自定義的字段名稱或者字段值,這也是需要注意的。

流程控制

所謂爬取流程,就是按照什么樣的規(guī)則順序去爬。在爬取任務不大的情況下,爬取的流程控制不會太麻煩,很多爬取框架都已經幫你做了如scrapy,只需要自己實現(xiàn)解析的代碼。

但在爬取一些大型網站時,例如全網抓取京東的評論,微博所有人的信息,關注關系等等,這種上十億到百億次設置千億次的請求必須考慮效率,否則一天只有86400秒,那么一秒鐘要抓100次,一天也才8640w次請求,也需要100多天才能到達十億級別的請求量。

涉及到大規(guī)模的抓取,一定要有良好的爬蟲設計,一般很多開源的爬蟲框架也都是有限制的,因為中間涉及到很多其他的問題,例如數據結構,重復抓取過濾的問題,當然最重要的是要把帶寬利用滿。

所以分布式抓取很重要,這時流程控制就會很重要,分布式最重要的就是多臺機器不同線程的調度和配合,通常會共享一個url隊列,然后各個線程通過消息通信,如果想要抓的越多越快,那么對中間的消息系統(tǒng)的吞吐量要求也越高。

現(xiàn)在也有一些開源的分布式爬取框架如scrapy-redis就是一個重寫了scrapy的調度模塊、隊列、管道的包,redis數據庫是用來在分布式中做請求隊列共享,scrapyd是用來部署scrapy的,scrapyd-api用來啟動獲取數據。

內容分析提取

請求headers的Accept-Encoding字段表示瀏覽器告訴服務器自己支持的壓縮算法(目前最多的是gzip),如果服務器開啟了壓縮,返回時會對響應體進行壓縮,爬蟲需要自己解壓;

過去我們常需要獲取的內容主要來源于網頁html文檔本身,也就是說,我們決定進行抓取的時候,都是html中包含的內容,但是隨著這幾年web技術飛速的發(fā)展,動態(tài)網頁越來越多,尤其是移動端,大量的SPA應用,這些網站中大量的使用了ajax技術。

我們在瀏覽器中看到的網頁已不全是html文檔說包含的,很多都是通過javascript動態(tài)生成的,一般來說,我們最終眼里看到的網頁包括以下三種:

Html文檔本身包含內容

這種情況是最容易解決的,一般來講基本上是靜態(tài)網頁已經寫死的內容,或者動態(tài)網頁,采用模板渲染,瀏覽器獲取到HTML的時候已經是包含所有的關鍵信息,所以直接在網頁上看到的內容都可以通過特定的HTML標簽得到。

這種情況解析也是很簡單的,一般的方法有一下幾種:

CSS選擇器

XPATH(這個值得學習一下)

正則表達式或普通字符串查找

JavaScript代碼加載內容

一般來說有兩種情況:一種情況是在請求到html文檔時,網頁的數據在js代碼中,而并非在html標簽中,之所以我們看到的網頁是正常的,那是因為,其實是由于執(zhí)行js代碼動態(tài)添加到標簽里面的。

所以這個時候內容在js代碼里面的,而js的執(zhí)行是在瀏覽器端的操作,所以用程序去請求網頁地址的時候,得到的response是網頁代碼和js的代碼,所以自己在瀏覽器端能看到內容,解析時由于js未執(zhí)行,肯定找到指定HTML標簽下內容肯定為空,如百度的主頁就是這種,這個時候的處理辦法,一般來講主要是要找到包含內容的js代碼串,然后通過正則表達式獲得相應的內容,而不是解析HTML標簽。

另一種情況是在和用戶交互時,JavaScript可能會動態(tài)生成一些dom,如點擊某個按鈕彈了一個對話框等;對于這種情況,一般這些內容都是一些用戶提示相關的內容,沒什么價值,如果確實需要,可以分析一下js執(zhí)行邏輯,但這樣的情況很少。

Ajax/Fetch異步請求

這種情況是現(xiàn)在很常見的,尤其是在內容以分頁形式顯示在網頁上,并且頁面無刷新,或者是對網頁進行某個交互操作后,得到內容。對于這種頁面,分析的時候我們要跟蹤所有的請求,觀察數據到底是在哪一步加載進來的。然后當我們找到核心的異步請求的時候,就只需抓取這個異步請求就可以了,如果原始網頁沒有任何有用信息,也沒必要去抓取原始網頁了。

爬蟲技術的現(xiàn)狀

語言

理論上來說,任何支持網絡通信的語言都是可以寫爬蟲的,爬蟲本身雖然語言關系不大,但是,總有相對順手、簡單的。目前來說,大多數爬蟲是用后臺腳本類語言寫的,其中python無疑是用的最多最廣的,并且頁誕生了很多優(yōu)秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。

但是一般來說,搜索引擎的爬蟲對爬蟲的效率要求更高,會選用c++、java、go(適合高并發(fā)),我在大學時代就用c++實現(xiàn)了一個多線程的框架,但是發(fā)現(xiàn)和python實現(xiàn)的爬蟲效率提升并不明顯,原因是,對于簡單爬蟲,瓶頸在于數據分析及提取,而網絡效率和語言關系并不大。

值得一提的是,在近幾年node發(fā)展非??欤?使得javascript遍地開花,有些人也開始嘗試用node做爬蟲,但是,這其實和其它后臺腳本語言沒什么區(qū)別,也不如 python簡單, 因為你依舊不能在node 里發(fā)起ajax請求,不能執(zhí)行原網頁的dom。

因為node的javascript 執(zhí)行環(huán)境和瀏覽器的執(zhí)行環(huán)境并不相同。那么,難道就真的不能像在瀏覽器中一樣用js寫爬蟲,用jquery提取內容嗎?

運行環(huán)境

爬蟲本身不區(qū)分到底是運行在windows還是Linux,又或是OSX,但從業(yè)務角度講,我們把運行在服務端(后臺)的,稱之為后臺爬蟲。而現(xiàn)在,幾乎所有的爬蟲都是后臺爬蟲。

后臺爬蟲的三大問題

后臺爬蟲在大行其道的時候,也有著些許棘手的、到目前也沒有什么好的解決方案問題,而歸根結底,這些問題的根本原因是由于后臺爬蟲的先天不足導致,在正式討論之前,我們先思考一個問題,“爬蟲和瀏覽器有什么異同?”。

相同點

本質上都是通過http/https協(xié)議請求互聯(lián)網數據

不同點

爬蟲一般為自動化程序,無需用用戶交互,而瀏覽器不是

運行場景不同;瀏覽器運行在客戶端,而爬蟲一般都跑在服務端

能力不同;瀏覽器包含渲染引擎、javascript虛擬機,而爬蟲一般都不具備這兩者。

了解了這些,我們再來看看后臺面臨的問題

問題一:交互問題

有些網頁往往需要和用戶進行一些交互,進而才能走到下一步,比如輸入一個驗證碼,拖動一個滑塊,選幾個漢字。網站之所以這么做,很多時候都是為了驗證訪問者到底是人還是機器。

而爬蟲程序遇到這種情況很難處理,傳統(tǒng)的簡單圖片驗證碼可以通過圖形處理算法讀出內容,但是隨著各種各樣,花樣百出,人神共憤的、變態(tài)的驗證碼越來越多(尤其是買火車票時,分分鐘都想爆粗口),這個問題就越來越嚴重。

問題二:Javascript 解析問題

如前文所述,javascript可以動態(tài)生成dom。目前大多數網頁屬于動態(tài)網頁(內容由javascript動態(tài)填充),尤其是在移動端,SPA/PWA應用越來越流行,網頁中大多數有用的數據都是通過ajax/fetch動態(tài)獲取后然后再由js填充到網頁dom樹中,單純的html靜態(tài)頁面中有用的數據很少。

目前主要應對的方案就是對于js ajax/fetch請求直接請求ajax/fetch的url ,但是還有一些ajax的請求參數會依賴一段javascript動態(tài)生成,比如一個請求簽名,再比如用戶登陸時對密碼的加密等等。

如果一昧的去用后臺腳本去干javascript本來做的事,這就要清楚的理解原網頁代碼邏輯,而這不僅非常麻煩,而且會使你的爬取代碼異常龐大臃腫,但是,更致命的是,有些javascript可以做的事爬蟲程序是很難甚至是不能模仿的,比如有些網站使用拖動滑塊到某個位置的驗證碼機制,這就很難再爬蟲中去模仿。

其實,總結一些,這些弊端歸根結底,是因為爬蟲程序并非是瀏覽器,沒有javascript解析引擎所致。針對這個問題,目前主要的應對策略就是在爬蟲中引入Javascript 引擎,如PhantomJS,但是又有著明顯的弊端,如服務器同時有多個爬取任務時,資源占用太大。

還有就是,這些 無窗口的javascript引擎很多時候使用起來并不能像在瀏覽器環(huán)境中一樣,頁面內部發(fā)生跳轉時,會導致流程很難控制。

問題三:IP限制

這是目前對后臺爬蟲中最致命的。網站的防火墻會對某個固定ip在某段時間內請求的次數做限制,如果沒有超過上線則正常返回數據,超過了,則拒絕請求,如qq 郵箱。

值得說明的是,ip限制有時并非是專門為了針對爬蟲的,而大多數時候是出于網站安全原因針對DOS攻擊的防御措施。后臺爬取時機器和ip有限,很容易達到上線而導致請求被拒絕。目前主要的應對方案是使用代理,這樣一來ip的數量就會多一些,但代理ip依然有限,對于這個問題,根本不可能徹底解決。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8963

    瀏覽量

    85085
  • 爬蟲
    +關注

    關注

    0

    文章

    82

    瀏覽量

    6814

原文標題:一篇了解爬蟲技術方方面面

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Android的方方面面,全面了解

    發(fā)表于 08-01 21:42

    文章告訴你關于NFC的方方面面

    1、NFC技術原理近場通信(Near Field Communication,NFC),又稱近距離無線通信,是種短距離的高頻無線通信技術,允許電子設備之間進行非接觸式點對點數據傳輸(在十厘米內
    發(fā)表于 06-20 10:15

    方方面面看筆記本鍵盤

    方方面面看筆記本鍵盤 筆記本電腦中鍵盤是成本比較低的部件,就
    發(fā)表于 01-19 11:08 ?1221次閱讀

    淺析PCMCIA卡常識的方方面面

    淺析PCMCIA卡常識的方方面面  PCMCIA ( Personal Computer Memory Card International Association PC機內存卡國際聯(lián)合會的縮寫) 是個成立于 1989 年的國際性組織,
    發(fā)表于 01-23 11:50 ?1855次閱讀

    方方面面話筆記本電池(二)

    方方面面話筆記本電池(二) 前面提到了本本各類電池的充電次數,市場上主流的鋰離子電池的充電次數僅有400~600次,這個數字對于
    發(fā)表于 01-25 14:25 ?436次閱讀

    方方面面話本本電池 ()

    方方面面話本本電池 () 常常看到討論針對本本電池節(jié)能的文章,講的都是些技巧,而本文想討論的是本本電池的方方面面,若看后會讓你有半
    發(fā)表于 01-25 14:33 ?441次閱讀

    方方面面話本本內存 購買

    方方面面話本本內存 購買 通常情況下,大部分筆記本電腦都預留了兩個144-pin的DIMM插槽,以提供用戶升級需要。鑒于筆記本電腦超
    發(fā)表于 01-25 14:41 ?523次閱讀

    方方面面話本本內存 門道

    方方面面話本本內存 門道  本本升級的各部件中,最為頻繁與普遍的就是本本的內存了,這是用戶朋友追求“大肚量”的必然結果
    發(fā)表于 01-25 14:52 ?540次閱讀

    AI慢慢的侵蝕了人類生活的方方面面

    不可避免地,AI侵蝕了人類生活的方方面面,我們無法想象失去AI,生活會變成什么樣。不斷有言論叫囂——很快人工智能將占據我們的工作崗位、為人類的戰(zhàn)爭而戰(zhàn)、管理我們的健康狀況,甚至像科幻片里上演的情節(jié)樣成為人類的主宰。
    發(fā)表于 10-16 09:50 ?1746次閱讀

    無人機的應用幾乎滲透到了我們生產和生活的方方面面

    近年來,隨著飛控、導航、信息等技術的不斷發(fā)展,無人機在我們視野中出現(xiàn)的頻率越來越高,從農業(yè)植保到國土測繪、從交通管理到電力巡檢、從影視娛樂到消防救援。。。。。。無人機的應用幾乎滲透到了我們生產和生活的方方面面。
    發(fā)表于 05-22 15:28 ?1928次閱讀

    安全芯片已經滲入生產生活的方方面面 新基建將帶來新挑戰(zhàn)

    芯片是密碼技術的載體,也是重要數據的保險箱。從每個人的身份證、銀行卡、手機卡,到稅務、通信、金融、交通、安防、醫(yī)療等涉及國計民生的方方面面,都離不開安全芯片的保駕護航。而5G、AI等新基建項目,也對安全芯片提出了新的挑戰(zhàn)。
    的頭像 發(fā)表于 04-17 15:09 ?2521次閱讀

    5G技術日益深度融入粵港澳大灣區(qū)方方面面

    電線巡檢、地鐵信號、通關安檢5G技術日益深度融入粵港澳大灣區(qū)的方方面面,有望形成萬億元級的5G產業(yè)聚集區(qū)。這是記者從正在廣州舉行的2020世界5G大會上了解到的。 在香港,大面積覆蓋的5G信號已基
    的頭像 發(fā)表于 11-28 11:14 ?2034次閱讀

    機器視覺逐漸滲入社會生活的方方面面

    機器視覺逐漸滲入社會生活的方方面面。在人臉識別、圖片識別、視頻監(jiān)控、3D應用等各領域,幾乎都能看到機器視覺的身影。對于工業(yè)領域而言,機器視覺的應用更是大大降低了高危作業(yè)的危險系數,保障了工業(yè)生產
    的頭像 發(fā)表于 07-05 10:03 ?2909次閱讀

    階段的物體檢測器,從直覺到細節(jié)的方方面面

    這篇文章非常詳細的講解了階段物體檢測器的諸多細節(jié)和方方面面,并以yolo和ssd為例,非常細致的比較了兩者細節(jié)上的異同點,由于文章太...
    發(fā)表于 01-26 19:32 ?4次下載
    <b class='flag-5'>一</b>階段的物體檢測器,從直覺到細節(jié)的<b class='flag-5'>方方面面</b>(<b class='flag-5'>一</b>)

    RFID標簽技術革新——原來RFID標簽已滲透到生活的方方面面

    RFID標簽技術,顛覆傳統(tǒng)標簽的“黑科技”,以其遠距離識別、大數據容量和高可靠性在眾多領域獲得廣泛應用。隨著RFID技術不斷成熟,其應用場景已經深入到生活中的方方面面。那么,RFID電子標簽市場隱藏
    的頭像 發(fā)表于 12-29 11:40 ?502次閱讀
    RFID標簽<b class='flag-5'>技術</b>革新——原來RFID標簽已滲透到生活的<b class='flag-5'>方方面面</b>