gpt4 book ai didi

python - 如何在 Scrapy 中暂停爬虫

转载 作者:行者123 更新时间:2023-12-05 06:14:23 25 4
gpt4 key购买 nike

我是 scrapy 的新手,我需要在收到响应错误(如 407、429)后暂停蜘蛛。
此外,我应该在不使用 time.sleep() 的情况下执行此操作,而是使用中间件或扩展。

这是我的中间件:

from scrapy import signals
from pydispatch import dispatcher

class Handle429:
def __init__(self):
dispatcher.connect(self.item_scraped, signal=signals.item_scraped)

def item_scraped(self, item, spider, response):
if response.status == 429:
print("THIS IS 429 RESPONSE")
#
# here stop spider for 10 minutes and then continue
#

我阅读了有关 self.crawler.engine.pause() 的内容,但如何在我的中间件中实现它,并设置自定义暂停时间?
还是有另一种方法可以做到这一点?谢谢。

最佳答案

我的问题已经解决了。首先,中间件可以有默认的 foo,比如 process_responseprocess_request

settings.py

HTTPERROR_ALLOWED_CODES = [404]

然后,我更改了我的中间件类:

from twisted.internet import reactor
from twisted.internet.defer import Deferred

#replace class Handle429
class HandleErrorResponse:

def __init__(self):
self.time_pause = 1800

def process_response(self, request, response, spider):
# this foo called by default before the spider
pass

然后我找到了一个代码,可以帮助我在没有 time.sleep()

的情况下暂停 spider
#in HandleErrorResponse
def process_response(self, request, response, spider):
print(response.status)
if response.status == 404:
d = Deferred()
reactor.callLater(self.time_pause, d.callback, response)

return response

它的工作。
我无法完全解释 reactor.callLater() 是如何工作的,但我认为它只是停止了 scrapy 中的事件循环,然后你的响应将被发送到蜘蛛。

关于python - 如何在 Scrapy 中暂停爬虫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62909305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com