python - 下载器中间件忽略对 scrapy 中某个 URL 的所有请求

标签 python screen-scraping scrapy

我试图在 Scrapy 中定义一个自定义下载器中间件,以忽略对特定 URL 的所有请求(这些请求是从其他 URL 重定向的,因此我无法在一开始生成请求时将它们过滤掉)。

我有以下代码,其想法是在响应处理阶段捕获此代码(因为我不确定请求重定向到其他请求的工作方式),检查 URL,如果它与我匹配'试图过滤掉然后返回 IgnoreRequest 异常,如果没有,照常返回响应,以便继续处理。

from scrapy.exceptions import IgnoreRequest
from scrapy import log

class CustomDownloaderMiddleware:

    def process_response(request, response, spider):
        log.msg("In Middleware " + response.url, level=log.WARNING)
        if response.url == "http://www.achurchnearyou.com//":
            return IgnoreRequest()
        else:
            return response

然后我将其添加到中间件字典中:

DOWNLOADER_MIDDLEWARES = {
    'acny.middlewares.CustomDownloaderMiddleware': 650
}

值为 650,我认为应该让它直接在 RedirectMiddleware 之后运行。

但是,当我运行爬虫时,我收到一条错误消息:

ERROR: Error downloading <GET http://www.achurchnearyou.com/venue.php?V=00001>: process_response() got multiple values for keyword argument 'request'

此错误发生在抓取的第一个页面上,我无法弄清楚为什么会发生 - 我想我已按照手册中的说明进行操作。我做错了什么?

最佳答案

我找到了解决我自己问题的方法 - 在 Python 中创建类和方法是一个愚蠢的错误。上面的代码需要是:

from scrapy.exceptions import IgnoreRequest
from scrapy import log

class CustomDownloaderMiddleware(object):

   def process_response(self, request, response, spider):
       log.msg("In Middleware " + response.url, level=log.WARNING)
       if response.url == "http://www.achurchnearyou.com//":
           raise IgnoreRequest()
       else:
           return response

即方法需要有一个self参数作为第一个参数,类需要继承自object

关于python - 下载器中间件忽略对 scrapy 中某个 URL 的所有请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076399/

相关文章:

python - 使用 cross_val_score 计算的指标与从 cross_val_predict 计算的相同指标有何不同?

python - 协方差矩阵的对角元素不是 1 pandas/numpy

php - 抓取 Xbox Live 成员(member)当前事件

javascript - 当使用 ng-click 指令单击按钮时,如何防止在使用 puppeteer 抓取期间打开新选项卡?

c# - 可以在开关 {case} 中使用通配符或字符串 "contains"吗?注意 : wordy

Python 匹配元组的问题

python - 从已卸载的wheel生成requirements.txt

python - Scrapy-elasticsearch插件问题

python - 动态设置scrapy请求回调

python - scrapy 用户超时导致连接失败