Python網(wǎng)絡(luò)爬蟲---scrapy通用爬蟲及反爬技巧

一、通用爬蟲

通用爬蟲一般有以下通用特性:

  • 爬取大量(一般來說是無限)的網(wǎng)站而不是特定的一些網(wǎng)站。
    不會將整個網(wǎng)站都爬取完畢,因為這十分不實際(或者說是不可能)完成的。相反,其會限制爬取的時間及數(shù)量。

  • 在邏輯上十分簡單(相較于具有很多提取規(guī)則的復(fù)雜的spider),數(shù)據(jù)會在另外的階段進(jìn)行后處理(post-processed)

  • 并行爬取大量網(wǎng)站以避免被某個網(wǎng)站的限制所限制爬取的速度(為表示尊重,每個站點爬取速度很慢但同時爬取很多站點)。

  • Scrapy默認(rèn)設(shè)置是對特定爬蟲做了優(yōu)化,而不是通用爬蟲。不過, 鑒于scrapy使用了異步架構(gòu),其對通用爬蟲也十分適用。

總結(jié)了一些將Scrapy作為通用爬蟲所需要的技巧, 以及相應(yīng)針對通用爬蟲的Scrapy設(shè)定的一些建議。

1.1 增加并發(fā)

并發(fā)是指同時處理的request的數(shù)量。其有全局限制和局部(每個網(wǎng)站)的限制。

Scrapy并發(fā)增加的程度取決于您的爬蟲能占用多少CPU。 一般開始可以設(shè)置為 100 。不過最好的方式是做一些測試,獲得Scrapy進(jìn)程占取CPU與并發(fā)數(shù)的關(guān)系。 為了優(yōu)化性能,您應(yīng)該選擇一個能使CPU占用率在80%-90%的并發(fā)數(shù)。

增加全局并發(fā)數(shù):

CONCURRENT_REQUESTS = 100

1.2 降低log級別

當(dāng)進(jìn)行通用爬取時,一般您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy使用 INFO log級別來報告這些信息。為了減少CPU使用率(及記錄log存儲的要求), 在進(jìn)行通用爬取時應(yīng)該使用 INFO log級別。 不過在開發(fā)的時候使用 DEBUG 應(yīng)該還能接受。

設(shè)置Log級別:

LOG_LEVEL = 'INFO'

1.3 禁止cookies

除非您 真的 需要,否則請禁止cookies。在進(jìn)行通用爬取時cookies并不需要, (搜索引擎則忽略cookies)。禁止cookies能減少CPU使用率及Scrapy爬蟲在內(nèi)存中記錄的蹤跡,提高性能。

禁止cookies:

COOKIES_ENABLED = False

1.4 禁止重試

對失敗的HTTP請求進(jìn)行重試會減慢爬取的效率,尤其是當(dāng)站點響應(yīng)很慢(甚至失敗)時, 訪問這樣的站點會造成超時并重試多次。這是不必要的,同時也占用了爬蟲爬取其他站點的能力。

禁止重試:

RETRY_ENABLED = False

1.5 減小下載超時

如果您對一個非常慢的連接進(jìn)行爬取(一般對通用爬蟲來說并不重要), 減小下載超時能讓卡住的連接能被快速的放棄并解放處理其他站點的能力。

減小下載超時:

DOWNLOAD_TIMEOUT = 15

1.6 禁止重定向

除非您對跟進(jìn)重定向感興趣,否則請考慮關(guān)閉重定向。 當(dāng)進(jìn)行通用爬取時,一般的做法是保存重定向的地址,并在之后的爬取進(jìn)行解析。 這保證了每批爬取的request數(shù)目在一定的數(shù)量, 否則重定向循環(huán)可能會導(dǎo)致爬蟲在某個站點耗費(fèi)過多資源。

關(guān)閉重定向:

REDIRECT_ENABLED = False

scrapy反爬技巧

有些網(wǎng)站實現(xiàn)了特定的機(jī)制,以一定規(guī)則來避免被爬蟲爬取。 與這些規(guī)則打交道并不容易,需要技巧,有時候也需要些特別的基礎(chǔ)。 如果有疑問請考慮聯(lián)系 商業(yè)支持。

下面是些處理這些站點的建議(tips):

  • 使用user-agent池,輪流或隨機(jī)選擇來作為user-agent。

  • 禁止cookies(參考 COOKIES_ENABLED),有些站點會使用cookies來發(fā)現(xiàn)爬蟲的軌跡。

  • 設(shè)置下載延遲(2或更高)。參考 DOWNLOAD_DELAY 設(shè)置。

  • 如果可行,使用 Google cache 來爬取數(shù)據(jù),而不是直接訪問站點。

  • 使用IP池。例如免費(fèi)的 Tor項目 或付費(fèi)服務(wù)(ProxyMesh)。

  • 使用高度分布式的下載器(downloader)來繞過禁止(ban),您就只需要專注分析處理頁面。這樣的例子有: Crawlera

自動限速擴(kuò)展

該擴(kuò)展能根據(jù)Scrapy服務(wù)器及您爬取的網(wǎng)站的負(fù)載自動限制爬取速度。

設(shè)計目標(biāo)

  • 更友好的對待網(wǎng)站,而不使用默認(rèn)的下載延遲0。

  • 自動調(diào)整scrapy來優(yōu)化下載速度,使得用戶不用調(diào)節(jié)下載延遲及并發(fā)請求數(shù)來找到優(yōu)化的值。 用戶只需指定允許的最大并發(fā)請求數(shù),剩下的都交給擴(kuò)展來完成。

擴(kuò)展是如何實現(xiàn)的

在Scrapy中,下載延遲是通過計算建立TCP連接到接收到HTTP包頭(header)之間的時間來測量的。

注意,由于Scrapy可能在忙著處理spider的回調(diào)函數(shù)或者無法下載,因此在合作的多任務(wù)環(huán)境下準(zhǔn)確測量這些延遲是十分苦難的。 不過,這些延遲仍然是對Scrapy(甚至是服務(wù)器)繁忙程度的合理測量,而這擴(kuò)展就是以此為前提進(jìn)行編寫的。

限速算法

算法根據(jù)以下規(guī)則調(diào)整下載延遲及并發(fā)數(shù):

spider永遠(yuǎn)以1個并發(fā)請求數(shù)及 AUTOTHROTTLESTARTDELAY 中指定的下載延遲啟動。 當(dāng)接收到響應(yīng)時,下載延遲會調(diào)整到該響應(yīng)延遲與之前下載延遲之間的平均值。

AutoThrottle擴(kuò)展尊重標(biāo)準(zhǔn)Scrapy設(shè)置中的并發(fā)數(shù)及延遲。這意味著其永遠(yuǎn)不會設(shè)置一個比 DOWNLOADDELAY 更低的下載延遲或者比 CONCURRENTREQUESTSPERDOMAIN 更高的并發(fā)數(shù) (或 CONCURRENTREQUESTSPER_IP ,取決于您使用哪一個)。

自動限速擴(kuò)展參數(shù)

下面是控制AutoThrottle擴(kuò)展的設(shè)置:

AUTOTHROTTLE_ENABLED 默認(rèn)False
AUTOTHROTTLE_START_DELAY 默認(rèn)5.0
AUTOTHROTTLE_MAX_DELAY 默認(rèn)60
AUTOTHROTTLE_DEBUG 默認(rèn)False
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,743評論 2 370

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