2019-07-08

所以一個(gè)完整的爬蟲一般會(huì)包含如下三個(gè)模塊:

網(wǎng)絡(luò)請(qǐng)求模塊

爬取流程控制模塊

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

網(wǎng)絡(luò)請(qǐng)求

我們常說(shuō)爬蟲其實(shí)就是一堆的http(s)請(qǐng)求,找到待爬取的鏈接束世,然后發(fā)送一個(gè)請(qǐng)求包,得到一個(gè)返回包坚洽,當(dāng)然韭畸,也有HTTP長(zhǎng)連接(keep-alive)或h5中基于stream的websocket協(xié)議,這里暫不考慮汽纤;

所以核心的幾個(gè)要素就是:

url

請(qǐng)求header、body

響應(yīng)herder福荸、內(nèi)容

URL

爬蟲開始運(yùn)行時(shí)需要一個(gè)初始url蕴坪,然后會(huì)根據(jù)爬取到的html文章,解析里面的鏈接敬锐,然后繼續(xù)爬取背传,這就像一棵多叉樹,從根節(jié)點(diǎn)開始台夺,每走一步径玖,就會(huì)產(chǎn)生新的節(jié)點(diǎn)。為了使爬蟲能夠結(jié)束颤介,一般都會(huì)指定一個(gè)爬取深度(Depth)梳星。

Http請(qǐng)求

http請(qǐng)求信息由請(qǐng)求方法(method)、請(qǐng)求頭(headers)滚朵、請(qǐng)求正文(body)三部分組成冤灾。由于method一般是header中的第一行,也可以說(shuō)請(qǐng)求頭中包含請(qǐng)求方法辕近,下面是chrome訪問(wèn)請(qǐng)求頭的一部分:

對(duì)于爬蟲需要注意的是請(qǐng)求方法是post時(shí)韵吨,需要將請(qǐng)求的參數(shù)先進(jìn)行urlencode后再發(fā)送,后臺(tái)收到請(qǐng)求信息后可能會(huì)做一些校驗(yàn)亏推,這可能會(huì)影響到爬取学赛,相關(guān)的header字段如下:

Basic Auth

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

Referer

鏈接的來(lái)源,通常在訪問(wèn)鏈接時(shí)童擎,都要帶上Referer字段滴劲,服務(wù)器會(huì)進(jìn)行來(lái)源驗(yàn)證,后臺(tái)通常會(huì)用此字段作為防盜鏈的依據(jù)顾复。

User-Agent

后臺(tái)通常會(huì)通過(guò)此字段判斷用戶設(shè)備類型班挖、系統(tǒng)以及瀏覽器的型號(hào)版本。有些編程語(yǔ)言包里網(wǎng)絡(luò)請(qǐng)求會(huì)自定義User-Agent芯砸,可以被辨別出來(lái)萧芙,爬蟲中可以設(shè)置為瀏覽器的ua.

Cookie

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

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

JavaScript加密操作

在進(jìn)行敏感數(shù)據(jù)傳輸時(shí),一般都會(huì)通過(guò)javascript進(jìn)行加密渴邦,例如qq空間就會(huì)對(duì)用戶登陸密碼進(jìn)行RSA加密后再發(fā)送給服務(wù)器疯趟,因此,爬蟲在模擬登陸時(shí)需要自己去請(qǐng)求公鑰几莽,然后加密迅办。

自定義字段

因?yàn)閔ttp的headers可以自定義地段,所以第三方可能會(huì)加入了一些自定義的字段名稱或者字段值章蚣,這也是需要注意的站欺。

流程控制

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

但在爬取一些大型網(wǎng)站時(shí),例如全網(wǎng)抓取京東的評(píng)論吼鱼,微博所有人的信息蓬豁,關(guān)注關(guān)系等等绰咽,這種上十億到百億次設(shè)置千億次的請(qǐng)求必須考慮效率,否則一天只有86400秒地粪,那么一秒鐘要抓100次取募,一天也才8640w次請(qǐng)求,也需要100多天才能到達(dá)十億級(jí)別的請(qǐng)求量蟆技。

涉及到大規(guī)模的抓取玩敏,一定要有良好的爬蟲設(shè)計(jì),一般很多開源的爬蟲框架也都是有限制的质礼,因?yàn)橹虚g涉及到很多其他的問(wèn)題旺聚,例如數(shù)據(jù)結(jié)構(gòu),重復(fù)抓取過(guò)濾的問(wèn)題眶蕉,當(dāng)然最重要的是要把帶寬利用滿砰粹。

所以分布式抓取很重要,這時(shí)流程控制就會(huì)很重要妻坝,分布式最重要的就是多臺(tái)機(jī)器不同線程的調(diào)度和配合伸眶,通常會(huì)共享一個(gè)url隊(duì)列,然后各個(gè)線程通過(guò)消息通信刽宪,如果想要抓的越多越快厘贼,那么對(duì)中間的消息系統(tǒng)的吞吐量要求也越高。

現(xiàn)在也有一些開源的分布式爬取框架如scrapy-redis就是一個(gè)重寫了scrapy的調(diào)度模塊圣拄、隊(duì)列嘴秸、管道的包,redis數(shù)據(jù)庫(kù)是用來(lái)在分布式中做請(qǐng)求隊(duì)列共享庇谆,scrapyd是用來(lái)部署scrapy的,scrapyd-api用來(lái)啟動(dòng)獲取數(shù)據(jù)岳掐。

內(nèi)容分析提取

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

過(guò)去我們常需要獲取的內(nèi)容主要來(lái)源于網(wǎng)頁(yè)html文檔本身寞肖,也就是說(shuō)纲酗,我們決定進(jìn)行抓取的時(shí)候,都是html中包含的內(nèi)容新蟆,但是隨著這幾年web技術(shù)飛速的發(fā)展觅赊,動(dòng)態(tài)網(wǎng)頁(yè)越來(lái)越多,尤其是移動(dòng)端琼稻,大量的SPA應(yīng)用吮螺,這些網(wǎng)站中大量的使用了ajax技術(shù)。

我們?cè)跒g覽器中看到的網(wǎng)頁(yè)已不全是html文檔說(shuō)包含的,很多都是通過(guò)javascript動(dòng)態(tài)生成的鸠补,一般來(lái)說(shuō)萝风,我們最終眼里看到的網(wǎng)頁(yè)包括以下三種:

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

這種情況是最容易解決的,一般來(lái)講基本上是靜態(tài)網(wǎng)頁(yè)已經(jīng)寫死的內(nèi)容紫岩,或者動(dòng)態(tài)網(wǎng)頁(yè)闹丐,采用模板渲染,瀏覽器獲取到HTML的時(shí)候已經(jīng)是包含所有的關(guān)鍵信息被因,所以直接在網(wǎng)頁(yè)上看到的內(nèi)容都可以通過(guò)特定的HTML標(biāo)簽得到。

這種情況解析也是很簡(jiǎn)單的衫仑,一般的方法有一下幾種:

CSS選擇器

XPATH(這個(gè)值得學(xué)習(xí)一下)

正則表達(dá)式或普通字符串查找

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

一般來(lái)說(shuō)有兩種情況:一種情況是在請(qǐng)求到html文檔時(shí)梨与,網(wǎng)頁(yè)的數(shù)據(jù)在js代碼中,而并非在html標(biāo)簽中文狱,之所以我們看到的網(wǎng)頁(yè)是正常的粥鞋,那是因?yàn)椋鋵?shí)是由于執(zhí)行js代碼動(dòng)態(tài)添加到標(biāo)簽里面的瞄崇。

所以這個(gè)時(shí)候內(nèi)容在js代碼里面的呻粹,而js的執(zhí)行是在瀏覽器端的操作,所以用程序去請(qǐng)求網(wǎng)頁(yè)地址的時(shí)候苏研,得到的response是網(wǎng)頁(yè)代碼和js的代碼等浊,所以自己在瀏覽器端能看到內(nèi)容,解析時(shí)由于js未執(zhí)行摹蘑,肯定找到指定HTML標(biāo)簽下內(nèi)容肯定為空筹燕,如百度的主頁(yè)就是這種,這個(gè)時(shí)候的處理辦法衅鹿,一般來(lái)講主要是要找到包含內(nèi)容的js代碼串撒踪,然后通過(guò)正則表達(dá)式獲得相應(yīng)的內(nèi)容,而不是解析HTML標(biāo)簽大渤。

另一種情況是在和用戶交互時(shí)制妄,JavaScript可能會(huì)動(dòng)態(tài)生成一些dom,如點(diǎn)擊某個(gè)按鈕彈了一個(gè)對(duì)話框等泵三;對(duì)于這種情況耕捞,一般這些內(nèi)容都是一些用戶提示相關(guān)的內(nèi)容,沒什么價(jià)值切黔,如果確實(shí)需要砸脊,可以分析一下js執(zhí)行邏輯,但這樣的情況很少纬霞。

Ajax/Fetch異步請(qǐng)求

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丛晌,一起剝皮案震驚了整個(gè)濱河市仅炊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澎蛛,老刑警劉巖抚垄,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谋逻,居然都是意外死亡呆馁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門毁兆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浙滤,“玉大人,你說(shuō)我怎么就攤上這事气堕〈山校” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵送巡,是天一觀的道長(zhǎng)摹菠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)骗爆,這世上最難降的妖魔是什么次氨? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮摘投,結(jié)果婚禮上煮寡,老公的妹妹穿的比我還像新娘。我一直安慰自己犀呼,他們只是感情好幸撕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著外臂,像睡著了一般坐儿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天貌矿,我揣著相機(jī)與錄音炭菌,去河邊找鬼。 笑死逛漫,一個(gè)胖子當(dāng)著我的面吹牛黑低,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酌毡,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼克握,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了枷踏?” 一聲冷哼從身側(cè)響起玛荞,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呕寝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婴梧,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡下梢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞蹭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孽江。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖番电,靈堂內(nèi)的尸體忽然破棺而出岗屏,到底是詐尸還是另有隱情,我是刑警寧澤漱办,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布这刷,位于F島的核電站,受9級(jí)特大地震影響娩井,放射性物質(zhì)發(fā)生泄漏暇屋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一洞辣、第九天 我趴在偏房一處隱蔽的房頂上張望咐刨。 院中可真熱鬧,春花似錦扬霜、人聲如沸定鸟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)联予。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躯泰,已是汗流浹背谭羔。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦向,地道東北人瘟裸。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像诵竭,于是被迫代替她去往敵國(guó)和親话告。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • HTTP基本原理 URI卵慰、URL沙郭、URN(Uninform Resource) URI(Identifier):統(tǒng)...
    GHope閱讀 2,076評(píng)論 2 26
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)裳朋。 注意:講述HT...
    kismetajun閱讀 27,474評(píng)論 1 45
  • 一病线、Gecco是什么 Gecco是一款用java語(yǔ)言開發(fā)的輕量化的易用的網(wǎng)絡(luò)爬蟲,不同于Nutch這樣的面向搜索引...
    4ea0af17fd67閱讀 2,034評(píng)論 0 1
  • 原理 傳統(tǒng)爬蟲從一個(gè)或若干初始網(wǎng)頁(yè)的URL開始鲤嫡,獲得初始網(wǎng)頁(yè)上的URL送挑,在抓取網(wǎng)頁(yè)的過(guò)程中,不斷從當(dāng)前頁(yè)面上抽取...
    IT高薪愛好者閱讀 1,268評(píng)論 0 2
  • 昨天手寫感恩日記暖眼,忘記了日記的更改惕耕,看了番紅艷的日更讓我觸動(dòng)很深,感恩遇見诫肠。
    胡秀琴閱讀 136評(píng)論 0 2