首頁  >  文章  >  後端開發  >  Scrapy中的分散式爬蟲和提高資料抓取效率的方法

Scrapy中的分散式爬蟲和提高資料抓取效率的方法

WBOY
WBOY原創
2023-06-22 21:25:491419瀏覽

Scrapy是一個高效能的Python網路爬蟲框架,可以快速、靈活地編寫爬蟲程式。然而,在處理大量資料或複雜網站時,單機爬蟲可能會遇到效能和擴充問題,這時候就需要使用分散式爬蟲來提高資料抓取效率。本文就介紹Scrapy中的分散式爬蟲和提高資料抓取效率的方法。

一、什麼是分散式爬蟲?

傳統的單機爬蟲體系結構中,所有爬蟲運作在同一台機器上,面對大數據量或高壓力爬取任務時,常常會出現機器性能吃緊的情況。分散式爬蟲則是將爬蟲任務分發到多台機器上進行處理,透過分散式運算和存儲,降低了單台機器的負擔,從而提高了爬蟲的效率和穩定性。

Scrapy中的分散式爬蟲通常使用開源的分散式調度框架Distributed Scrapy(簡稱DSC)來實現。 DSC將Scrapy爬蟲程式分發到多台機器上進行平行處理,並將結果統一匯總到中心調度節點上。

二、如何實現分散式爬蟲?

1、安裝Distributed Scrapy

執行以下指令安裝DSC:

pip install scrapy_redis

pip install pymongo

#2、修改Scrapy設定檔

在Scrapy專案的settings.py檔中加入以下設定:

使用redis 調度器

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

#SCHEDULER = "scrapy_redis.scheduler.Scheduler"

使用redis 去重策略

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

不清空redis 記錄,可以暫停/恢復爬取

SCHEDULER_PERSIST=True

設定redis的連線參數


REDIS_HOST='localhost'

REDIS_PORT=6379

3、寫爬蟲程式碼

#在Scrapy的爬蟲程式中,需要修改起始請求的方式,使用scrapy-redis的起始方式:

encoding:utf-8


import scrapy,re,json

from ..items import DouyuItem

from scrapy_redis.spiders import RedisSpider

#class DouyuSpider(RedisSpider):

# 爬虫名字
name = 'douyu'
# redis-key,从redis中pop数据进行爬取
redis_key = 'douyu:start_urls'

def parse(self, response):
    # scrapy爬虫代码

4、啟動redis服務

#在終端執行下列指令啟動redis服務:

redis-server

5、啟動Distributed Scrapy

在終端機輸入下列指令啟動DSC的節點:

##scrapy crawl douyu -s JOBDIR= job1

其中,job1可以是自訂名稱,用於DSC記錄爬蟲狀態。

三、優化Scrapy爬蟲

Scrapy提供了許多優化爬蟲效率的方法,如果配合分散式爬蟲,可以進一步提高資料抓取效率。

1、使用CrawlerRunner

CrawlerRunner是需要利用一個 Twisted 的類別來擴充應用程式。與簡單的運行一個Python檔案相比,它允許您在同一進程中同時運行多個爬蟲,而無需使用多個進程或多個機器。這可以使任務管理變得更加輕鬆。

使用CrawlerRunner的方式如下:

from twisted.internet import reactor,defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.project import get_project_ettings# my_spider.spiders.my_spider import MySpider

runner = CrawlerRunner(get_project_settings())

##@defer.inlineCallbacks

def crawl():

yield runner.crawl(MySpider)
reactor.stop()
##crawl()##crawl()
reactor.run()

2、降低下載中間件的優先權

如果需要在下載中間件中處理大量或複雜的數據,可以使用CONCURRENT_REQUESTS_PER_DOMAIN降低下載中間件的優先:

CONCURRENT_REQUESTS_PER_DOMAIN = 2

DOWNLOAD_DELAY = 0.5

DOWNLOADER_MIDDLEWARES = {

'myproject.middles.MyCustomDownloaderMiddleware':
#myproject.middles.MyCustomDownloaderMiddleware':
#33,##3,
3,##3, CONCURRENT_REQUESTS和DOWNLOAD_DELAY參數

CONCURRENT_REQUESTS表示每個網域同時處理要求的最大數量,可以根據機器配置和任務要求合理調整。

DOWNLOAD_DELAY表示每個請求間的延遲時間,可以透過增加延遲或非同步請求來提高爬蟲效率。

四、總結

Scrapy的分散式爬蟲可以幫助我們快速處理大量數據,提高爬蟲效率。同時,透過給予下載中間件降低優先順序、調整協程數量、增加請求延遲等方式,還可以進一步提高爬蟲效率。分散式爬蟲是Scrapy的重要功能之一,學會了它,可以讓我們輕鬆應付各種爬蟲任務。

以上是Scrapy中的分散式爬蟲和提高資料抓取效率的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn