在执行期间计算从 scrapy 中抓取的项目,并在一定数量的页面后暂停或休眠

Count scraped items from scrapy during execution and pause or sleep after a certain number of pages

我有超过 210000 个链接要抓取。有没有什么办法可以打印出它在执行期间完成抓取的链接数量,并在每 10000 页计数后休眠或暂停执行 10 分钟?

如果你只想打印页码,它已经完成了 scrapy 你可以这样做。请记住,Scrapy 不能保证按照生成的顺序解析页面。

def start_requests(self)
     for i in range(1,210000):
         yield scrapy.Request(
            url=f'https://someurl.com?page={str(i)}',
            meta={'page': i}
         )

def parse(self, response):
    page = response.meta.get('page')
    print('Parsed page #' + str(page))

如果你想看到“进度”,你可以这样做:

def __init__(self, *args, **kwargs):
    self.parsed_pages = 0
    self.total_pages = 210000
    super().__init__(*args, **kwargs)


def start_requests(self)
     for i in range(1, self.total_pages):
         yield scrapy.Request(
            url=f'https://someurl.com?page={str(i)}',
            meta={'page': i}
         )

def parse(self, response):
    page = response.meta.get('page')
    self.parsed_pages += 1
    print(f'Parsed {str(self.parsed_pages)} of {str(self.total_pages)}')'

如果你想暂停10分钟,我不建议使用一些睡眠功能。因为那样会阻塞代码。 (如果你没有其他蜘蛛,我想你可以做到,但这不是一个很好的做法)。

相反,我会安排蜘蛛以 运行 为间隔并限制为 10 000 页。

或者,如果您只需要限制发送的请求数量,您可以将 settings.py 中的 DOWNLOAD_DELAY 设置为某个整数,以减少目标服务器上的负载。

反响很好!例如,我正在考虑在 if 语句中使用 sleep。

如果parsed_pages == 100*x time.sleep(rand(20,150) 否则: