在每个域上以高并发和低请求率执行 Scrapy 广泛抓取。

cod*_*eer 5 concurrency scrapy web-scraping python-2.7

我正在尝试进行 Scrapy 广泛的爬行。目标是在不同的域进行许多并发爬网,但同时在每个域上轻轻爬行。因此能够保持良好的爬行速度并保持每个 url 上的请求频率较低。

这是我使用的蜘蛛:

import re
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from myproject.items import MyprojectItem

class testSpider(CrawlSpider):
    name = "testCrawler16"
    start_urls = [
              "http://example.com",
    ]

    extractor = SgmlLinkExtractor(deny=('.com','.nl','.org'),
                              allow=('.se'))

    rules = (
        Rule(extractor,callback='parse_links',follow=True),
        )

    def parse_links(self, response):
        item = MyprojectItem()
        item['url'] =response.url
        item['depth'] = response.meta['depth']
        yield item
Run Code Online (Sandbox Code Playgroud)

这是我使用的设置:

BOT_NAME = 'myproject'

SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'

REACTOR_THREADPOOL_MAXSIZE = 20
RETRY_ENABLED = False
REDIRECT_ENABLED = False
DOWNLOAD_TIMEOUT = 15
LOG_LEVEL = 'INFO'
COOKIES_ENABLED = False
DEPTH_LIMIT = 10


AUTOTHROTTLE_ENABLED = True
CONCURRENT_REQUESTS = 10
CONCURRENT_REQUESTS_PER_DOMAIN = 1
AUTOTHROTTLE_TARGET_CONCURRENCY = 1
AUTOTHROTTLE_START_DELAY = 5
AUTOTHROTTLE_MAX_DELAY = 60
Run Code Online (Sandbox Code Playgroud)

问题是,一段时间后,爬虫同时爬行的次数越来越少,并且只会在几个域之间交替,有时只有一个。因此自动油门会减慢爬行速度。我怎样才能让蜘蛛保持并发并与许多域有许多单独的连接,并使用并发来保持速度,同时保持每个域的低请求率?

eLR*_*uLL 4

AUTOTHROTTLE_ENABLED不建议快速爬行,我建议将其设置为False,然后自行轻轻爬行。

这里您需要的唯一设置是CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAINDOWNLOAD_DELAY

设置DOWNLOAD_DELAY为您希望对每个域的每个请求进行爬网的值,10例如,如果您希望每分钟 6 个请求(每秒一个10)。

设置CONCURRENT_REQUESTS_PER_DOMAIN为 1 以尊重每个域的先前DOWNLOAD_DELAY间隔。

设置CONCURRENT_REQUESTS为较高值,它可能是您计划抓取的域数量(或更多)。这只是为了不干扰之前的设置。