国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 爬蟲技術(shù)詳解

爬蟲技術(shù)詳解

2020-08-27 14:51落葉的博客 Java教程

本文全面的介紹了爬蟲的原理、技術(shù)現(xiàn)狀、以及目前仍面臨的問題。具有很好的參考價值。下面跟著小編一起來看下吧

本文全面的介紹了爬蟲的原理、技術(shù)現(xiàn)狀、以及目前仍面臨的問題。如果你沒接觸過爬蟲,本文很適合你,如果你是一名資深的蟲師,那么文末的彩蛋你可能感興趣。

一. 需求

萬維網(wǎng)上有著無數(shù)的網(wǎng)頁,包含著海量的信息,無孔不入、森羅萬象。但很多時候,無論出于數(shù)據(jù)分析或產(chǎn)品需求,我們需要從某些網(wǎng)站,提取出我們感興趣、有價值的內(nèi)容,但是縱然是進化到21世紀(jì)的人類,依然只有兩只手,一雙眼,不可能去每一個網(wǎng)頁去點去看,然后再復(fù)制粘貼。所以我們需要一種能自動獲取網(wǎng)頁內(nèi)容并可以按照指定規(guī)則提取相應(yīng)內(nèi)容的程序,這就是爬蟲。

二. 原理

傳統(tǒng)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當(dāng)前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。聚焦爬蟲的工作流程較為復(fù)雜,需要根據(jù)一定的網(wǎng)頁分析算法過濾與主題無關(guān)的鏈接,保留有用的鏈接并將其放入等待抓取的URL隊列。然后,它將根據(jù)一定的搜索策略從隊列中選擇下一步要抓取的網(wǎng)頁URL,并重復(fù)上述過程,直到達到系統(tǒng)的某一條件時停止。另外,所有被爬蟲抓取的網(wǎng)頁將會被系統(tǒng)存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索;所以一個完整的爬蟲一般會包含如下三個模塊:   

1. 網(wǎng)絡(luò)請求模塊

2. 爬取流程控制模塊

3. 內(nèi)容分析提取模塊

三. 網(wǎng)絡(luò)請求

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

1. url

2. 請求header、body

3. 響應(yīng)herder、內(nèi)容

四. URL

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

五. Http請求

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

?
1
2
3
4
5
GET / HTTP/1.1
Connection:Keep-Alive
Host:gsw.iguoxue.org
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Accept-Encoding:gzip, deflate, sdch, br

本文不會解釋各個字段的意思,詳細(xì)的解釋請移步w3c Http Header Field Definitions . 對于爬蟲需要注意的是請求方法是post時,需要將請求的參數(shù)先進行urlencode后再發(fā)送,后臺收到請求信息后可能會做一些校驗,這可能會影響到爬取,相關(guān)的header字段如下:

1. Basic Auth

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

2. Referer

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

3. User-Agent

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

4. Cookie

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

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

5. JavaScript加密操作

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

6. 自定義字段

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

六. 流程控制

所謂爬取流程,就是按照什么樣的規(guī)則順序去爬。在爬取任務(wù)不大的情況下,爬取的流程控制不會太麻煩,很多爬取框架都已經(jīng)幫你做了如scrapy,只需要自己實現(xiàn)解析的代碼。但在爬取一些大型網(wǎng)站時,例如全網(wǎng)抓取京東的評論,微博所有人的信息,關(guān)注關(guān)系等等,這種上十億到百億次設(shè)置千億次的請求必須考慮效率,否則一天只有86400秒,那么一秒鐘要抓100次,一天也才8640w次請求,也需要100多天才能到達十億級別的請求量。涉及到大規(guī)模的抓取,一定要有良好的爬蟲設(shè)計,一般很多開源的爬蟲框架也都是有限制的,因為中間涉及到很多其他的問題,例如數(shù)據(jù)結(jié)構(gòu),重復(fù)抓取過濾的問題,當(dāng)然最重要的是要把帶寬利用滿,所以分布式抓取很重要,這時流程控制就會很重要,分布式最重要的就是多臺機器不同線程的調(diào)度和配合,通常會共享一個url隊列,然后各個線程通過消息通信,如果想要抓的越多越快,那么對中間的消息系統(tǒng)的吞吐量要求也越高。現(xiàn)在也有一些開源的分布式爬取框架如scrapy-redis就是一個重寫了scrapy的調(diào)度模塊、隊列、管道的包,redis數(shù)據(jù)庫是用來在分布式中做請求隊列共享,scrapyd是用來部署scrapy的,scrapyd-api用來啟動獲取數(shù)據(jù)。

七. 內(nèi)容分析提取

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

過去我們常需要獲取的內(nèi)容主要來源于網(wǎng)頁html文檔本身,也就是說,我們決定進行抓取的時候,都是html中包含的內(nèi)容,但是隨著這幾年web技術(shù)飛速的發(fā)展,動態(tài)網(wǎng)頁越來越多,尤其是移動端,大量的SPA應(yīng)用,這些網(wǎng)站中大量的使用了ajax技術(shù)。我們在瀏覽器中看到的網(wǎng)頁已不全是html文檔說包含的,很多都是通過javascript動態(tài)生成的,一般來說,我們最終眼里看到的網(wǎng)頁包括以下三種:

Html文檔本身包含內(nèi)容

這種情況是最容易解決的,一般來講基本上是靜態(tài)網(wǎng)頁已經(jīng)寫死的內(nèi)容,或者動態(tài)網(wǎng)頁,采用模板渲染,瀏覽器獲取到HTML的時候已經(jīng)是包含所有的關(guān)鍵信息,所以直接在網(wǎng)頁上看到的內(nèi)容都可以通過特定的HTML標(biāo)簽得到。這種情況解析也是很簡單的,一般的方法有一下幾種:

1. CSS選擇器

2. XPATH(這個值得學(xué)習(xí)一下)

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

4. JavaScript代碼加載內(nèi)容

一般來說有兩種情況:一種情況是在請求到html文檔時,網(wǎng)頁的數(shù)據(jù)在js代碼中,而并非在html標(biāo)簽中,之所以我們看到的網(wǎng)頁是正常的,那是因為,其實是由于執(zhí)行js代碼動態(tài)添加到標(biāo)簽里面的,所以這個時候內(nèi)容在js代碼里面的,而js的執(zhí)行是在瀏覽器端的操作,所以用程序去請求網(wǎng)頁地址的時候,得到的response是網(wǎng)頁代碼和js的代碼,所以自己在瀏覽器端能看到內(nèi)容,解析時由于js未執(zhí)行,肯定找到指定HTML標(biāo)簽下內(nèi)容肯定為空,如百度的主頁就是這種,這個時候的處理辦法,一般來講主要是要找到包含內(nèi)容的js代碼串,然后通過正則表達式獲得相應(yīng)的內(nèi)容,而不是解析HTML標(biāo)簽。另一種情況是在和用戶交互時,JavaScript可能會動態(tài)生成一些dom,如點擊某個按鈕彈了一個對話框等;對于這種情況,一般這些內(nèi)容都是一些用戶提示相關(guān)的內(nèi)容,沒什么價值,如果確實需要,可以分析一下js執(zhí)行邏輯,但這樣的情況很少。

Ajax/Fetch異步請求

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

八. 爬蟲技術(shù)的現(xiàn)狀

1. 語言

理論上來說,任何支持網(wǎng)絡(luò)通信的語言都是可以寫爬蟲的,爬蟲本身雖然語言關(guān)系不大,但是,總有相對順手、簡單的。目前來說,大多數(shù)爬蟲是用后臺腳本類語言寫的,其中python無疑是用的最多最廣的,并且頁誕生了很多優(yōu)秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來說,搜索引擎的爬蟲對爬蟲的效率要求更高,會選用c++、java、go(適合高并發(fā)),我在大學(xué)時代就用c++實現(xiàn)了一個多線程的框架,但是發(fā)現(xiàn)和python實現(xiàn)的爬蟲效率提升并不明顯,原因是,對于簡單爬蟲,瓶頸在于數(shù)據(jù)分析及提取,而網(wǎng)絡(luò)效率和語言關(guān)系并不大。值得一提的是,在近幾年node發(fā)展非常快, 使得javascript遍地開花,有些人也開始嘗試用node做爬蟲,但是,這其實和其它后臺腳本語言沒什么區(qū)別,也不如 python簡單, 因為你依舊不能在node 里發(fā)起ajax請求,不能執(zhí)行原網(wǎng)頁的dom。因為node的javascript 執(zhí)行環(huán)境和瀏覽器的執(zhí)行環(huán)境并不相同。那么,難道就真的不能像在瀏覽器中一樣用js寫爬蟲,用jquery提取內(nèi)容嗎?想法很大膽,我們暫且擱置。

2. 運行環(huán)境

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

3. 后臺爬蟲的三大問題

問題一:交互問題

有些網(wǎng)頁往往需要和用戶進行一些交互,進而才能走到下一步,比如輸入一個驗證碼,拖動一個滑塊,選幾個漢字。網(wǎng)站之所以這么做,很多時候都是為了驗證訪問者到底是人還是機器。而爬蟲程序遇到這種情況很難處理,傳統(tǒng)的簡單圖片驗證碼可以通過圖形處理算法讀出內(nèi)容,但是隨著各種各樣,花樣百出,人神共憤的、變態(tài)的驗證碼越來越多(尤其是買火車票時,分分鐘都想爆粗口),這個問題就越來越嚴(yán)重。

問題二:Javascript 解析問題

如前文所述,javascript可以動態(tài)生成dom。目前大多數(shù)網(wǎng)頁屬于動態(tài)網(wǎng)頁(內(nèi)容由javascript動態(tài)填充),尤其是在移動端,SPA/PWA應(yīng)用越來越流行,網(wǎng)頁中大多數(shù)有用的數(shù)據(jù)都是通過ajax/fetch動態(tài)獲取后然后再由js填充到網(wǎng)頁dom樹中,單純的html靜態(tài)頁面中有用的數(shù)據(jù)很少。目前主要應(yīng)對的方案就是對于js ajax/fetch請求直接請求ajax/fetch的url ,但是還有一些ajax的請求參數(shù)會依賴一段javascript動態(tài)生成,比如一個請求簽名,再比如用戶登陸時對密碼的加密等等,如果一昧的去用后臺腳本去干javascript本來做的事,這就要清楚的理解原網(wǎng)頁代碼邏輯,而這不僅非常麻煩,而且會使你的爬取代碼異常龐大臃腫,但是,更致命的是,有些javascript可以做的事爬蟲程序是很難甚至是不能模仿的,比如有些網(wǎng)站使用拖動滑塊到某個位置的驗證碼機制,這就很難再爬蟲中去模仿。其實,總結(jié)一些,這些弊端歸根結(jié)底,是因為爬蟲程序并非是瀏覽器,沒有javascript解析引擎所致。針對這個問題,目前主要的應(yīng)對策略就是在爬蟲中引入Javascript 引擎,如PhantomJS,但是又有著明顯的弊端,如服務(wù)器同時有多個爬取任務(wù)時,資源占用太大。還有就是,這些 無窗口的javascript引擎很多時候使用起來并不能像在瀏覽器環(huán)境中一樣,頁面內(nèi)部發(fā)生跳轉(zhuǎn)時,會導(dǎo)致流程很難控制。

問題三:IP限制

這是目前對后臺爬蟲中最致命的。網(wǎng)站的防火墻會對某個固定ip在某段時間內(nèi)請求的次數(shù)做限制,如果沒有超過上線則正常返回數(shù)據(jù),超過了,則拒絕請求,如qq 郵箱。值得說明的是,ip限制有時并非是專門為了針對爬蟲的,而大多數(shù)時候是出于網(wǎng)站安全原因針對DOS攻擊的防御措施。后臺爬取時機器和ip有限,很容易達到上線而導(dǎo)致請求被拒絕。目前主要的應(yīng)對方案是使用代理,這樣一來ip的數(shù)量就會多一些,但代理ip依然有限,對于這個問題,根本不可能徹底解決。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持服務(wù)器之家!

原文鏈接:http://www.cnblogs.com/wangyayun/p/6541163.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: www.国产 | 一区二区蜜桃 | 黄色裸体网站 | 久久综合久久综合久久综合 | 日韩在线中文 | 精品视频网 | 日韩精品小视频 | 欧美性生活片 | 在线永久免费观看日韩a | av中文在线 | 免费一级毛片在线播放放视频 | 久久九 | 日韩天堂| 在线播放一区二区三区 | 国产专区在线看 | 黄色国产视频 | 精品久久久久久久久久久久久久 | 激情五月综合网 | 亚洲欧美精品一区二区三区 | 人人天天色 | 天堂一区| 国内外成人激情免费视频 | 91视频原创| 日韩欧美二区 | 国产欧美在线 | 国产专区在线看 | 久草免费在线 | 国产精品久久一区二区三区 | 在线免费视频一区二区 | 国产精品日韩三级 | 国产99久久精品一区二区永久免费 | 亚洲综合影院 | 国产日韩欧美高清 | 九色porny丨国产精品 | 午夜精品视频在线观看 | 日韩一区二区三区视频 | 欧美一区二区三区不卡 | 国产激情91久久精品导航 | 亚洲精品成人av | 激情久久久久 | 欧美一级免费看 |