gpt4 book ai didi

python - Scrapy 自定义 DownloadMiddleware 不尊重 DOWNLOAD_DELAY

转载 作者:行者123 更新时间:2023-12-04 04:08:53 25 4
gpt4 key购买 nike

我目前正在处理我的 CustomDownloadMiddleware。这主要是由于对下载网页的控制有一定的需要。我的 CustomDownloadMiddleware 如下所示

class MySeleniumDownloadMiddleware:
"""Scrapy middleware handling the requests using selenium"""

def __init__(self, driver):
self.driver = driver
self.cookies = self.driver.get_cookies()

@classmethod
def from_crawler(cls, crawler):
"""Initialize the middleware with the crawler settings"""

driver = init_chromium(crawler.settings.get('SELENIUM_HOSTNAME'))
login(driver, crawler.settings.get('MY_CREDENTIAL'))

middleware = cls(driver=driver)

crawler.signals.connect(middleware.spider_closed, signals.spider_closed)

return middleware


def process_request(self, request, spider):
"""Process a request using the selenium driver if applicable"""

try:
self.driver.get(request.url)
except WebDriverException:
self.driver = init_chromium(spider.settings.get('SELENIUM_HOSTNAME'))
recover_cookie_to_driver(self.driver, self.cookies)
self.driver.get(request.url)

body = str.encode(self.driver.page_source)

# Expose the driver via the "meta" attribute
request.meta.update({'driver': self.driver})

return HtmlResponse(
self.driver.current_url,
body=body,
encoding='utf-8',
request=request
)


def spider_closed(self):
"""Shutdown the driver when spider is closed"""
try:
self.driver.quit()
except WebDriverException:
pass

打开后 issue在github中,我发现问题是需要自定义下载中间件自己处理下载延迟,而 recommendation是通过使用 slot可以在这个文件中找到。但是,我没有找到下载中间件中使用的插槽的任何相关示例。

另外,值得一提的是,我的代码深受 scrapy-selenium 的启发。 ,并找到了一个 issue这为下载延迟提供了潜在的解决方案,但是当我使用 time.sleep(second) 时解决方案、管道和蜘蛛的 parse函数未同时处理,我认为该解决方案不可行。

是否有正确的实现方式 slot进入下载中间件,因此它尊重下载延迟,并且不会妨碍管道和抓取同时处理的能力?如果是,那是什么?

最佳答案

我想我找到了这种行为的原因。
看起来您的请求没有到达使用下载器相关设置的下载器方法(包括 DOWNLOAD_DELAY )。

在一般情况下(根据 scrapy achitecture )会发生这种情况:

  • 下载中间件 process_request修改请求并 - 向下载器发送请求。
    下载器:将请求分配给执行第 4 步中的下载器插槽的请求。(计算下载器相关设置)。收到响应 -> 发送至 process_response方法(scrapy achitecture scheme 的第 5 步)
  • 下载中间件 process_request - 修改响应并 - 将响应发送到 engine .

  • 你在你的情况下的行为会有所不同:
  • 下载中间件 process_request发送 Httpresponse由于 process_request 反对下载程序(不是请求)你的 middleware.Downloader: 的方法不会执行请求 - 因为它已经收到上一步的响应。它会立即向 process_response 发送响应方法。
    5.(同上)下载中间件process_request - 修改响应并 - 将响应发送到 engine .

  • 此行为编码为:
  • 下载器中间件管理器 download 方法。
  • 下载器 fetch 方法(其中调用 DownloaderMiddlewareManager.download)

  • 关于scrapy下载器的当前实现 - DOWNLOAD_DELAY其他一些与下载器相关的设置仅适用于非 selenium 请求。

    关于python - Scrapy 自定义 DownloadMiddleware 不尊重 DOWNLOAD_DELAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62085240/

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