<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何改造 Scrapy 從而實現(xiàn)多網(wǎng)站大規(guī)模爬?。?/h1>

          共 1716字,需瀏覽 4分鐘

           ·

          2020-10-16 07:44

          閱讀本文大概需要 2 分鐘。


          Scrapy 框架默認是用來開發(fā)定向爬蟲的。一般情況下,在 spiders 文件夾下面的一個.py 文件對應(yīng)了一個網(wǎng)站的爬取。

          但還有另外一種爬蟲,它不會拘泥于提取頁面上的特定文字,而是關(guān)注如何并行爬取非常多的網(wǎng)站。這種爬蟲可以實現(xiàn)大規(guī)模的爬取。這種爬蟲,一般是從若干個種子網(wǎng)址開始爬。進入每個網(wǎng)址后,把該頁面的所有網(wǎng)址作為新的種子網(wǎng)址繼續(xù)爬取,源源不斷,生生不息。但爬到以后,一般直接把整個頁面的源代碼保存下來,通過 Kafka 或者其他組件傳給另外的服務(wù)進行解析。

          為了讓 Scrapy 適配這種通用的解析邏輯,需要做一些定制化修改。Scrapy 官方文檔中,給出了幾點修改建議[1]。

          修改調(diào)度隊列

          Scrapy 默認的調(diào)度隊列是scrapy.pqueues.ScrapyPriorityQueue,它適合做定向爬蟲使用,對于通用爬蟲,我們應(yīng)該修改為scrapy.pqueues.DownloaderAwarePriorityQueue。在 settings.py文件中添加一行:

          SCHEDULER_PRIORITY_QUEUE?=?'scrapy.pqueues.DownloaderAwarePriorityQueue'

          提高并發(fā)量

          settings.py中增加配置:

          CONCURRENT_REQUESTS?=?100
          CONCURRENT_REQUESTS_PER_DOMAIN?=?100

          但是并發(fā)量實際上受內(nèi)存和 CPU 的限制,建議實際測試,選擇最適合的數(shù)字。

          提高 Twisted IO 線程池大小

          Scrapy 在做 DNS 解析的時候,是阻塞式的。所以請求量越高,解析 DNS 就會越慢。為了避免這個情況,可以提高線程池的大小。在?settings.py中增加一個配置:

          REACTOR_THREADPOOL_MAXSIZE?=?20

          搭建專用 DNS 服務(wù)器

          如果爬蟲進程數(shù)太多,并發(fā)又太快,可能會對 DNS 服務(wù)器形成 Dos 攻擊。所以建議自己單獨搭建一個 DNS 服務(wù)器。

          減少日志量

          Scrapy 默認是 DEBUG 級別的日志等級,每次爬取會產(chǎn)生大量的日志。通過把日志等級調(diào)整到INFO 可以大大減少日志量。在 settings.py 中增加一行:

          LOG_LEVEL?=?'INFO'

          禁用 Cookies 和自動重試

          大規(guī)模爬蟲一般不需要用到 Cookies,所以可以把它禁用。請求失敗的自動重試會降低爬蟲的速度。但是由于大規(guī)模爬蟲的爬取范圍很大,對于個別失敗的請求沒有必要重試。因此修改settings.py

          COOKIES_ENABLED?=?False
          RETRY_ENABLED?=?False

          降低請求超時時間,禁用自動跳轉(zhuǎn)

          有些網(wǎng)址因為遠在大洋彼岸或者受到了干擾,請求響應(yīng)時間很長。對于這種網(wǎng)址,應(yīng)該果斷放棄,避免影響其他網(wǎng)址的爬取。

          禁用自動跳轉(zhuǎn)功能,也有助于提高網(wǎng)頁訪問速度。

          DOWNLOAD_TIMEOUT?=?10
          REDIRECT_ENABLED?=?False

          使用廣度有限搜索

          Scrapy 默認基于深度優(yōu)先(DFO)搜索算法。但在大規(guī)模爬蟲中,我們一般會使用廣度有限(BFO)搜索算法:

          DEPTH_PRIORITY?=?1
          SCHEDULER_DISK_QUEUE?=?'scrapy.squeues.PickleFifoDiskQueue'
          SCHEDULER_MEMORY_QUEUE?=?'scrapy.squeues.FifoMemoryQueue'

          關(guān)注內(nèi)存,謹防內(nèi)存泄露

          如果你發(fā)現(xiàn)爬蟲占用大量內(nèi)存,但是速度遠遠低于你設(shè)置的并發(fā)速度,那么要考慮是否發(fā)生了內(nèi)存泄露。

          參考資料

          [1]

          修改建議: https://doc.scrapy.org/en/latest/topics/broad-crawls.html


          好文和朋友一起看~
          瀏覽 56
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報

          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美自拍视频 在线 | 久草超碰在线 | 色欲综合一区二区 | 欧美亚洲日韩一区二区 | 亚洲无码不卡手机免费观看 |