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

2024-10-01 17:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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

我把这句话加在中间商的名言上:

^{pr2}$

我认为应该直接用一个650的值重定向它。在

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

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

这个错误发生在第一页爬网,我不知道为什么会发生-我想我已经按照手册上说的做了。我做错什么了?在


Tags: fromimportcomloghttpurlresponserequest
2条回答

如果您知道哪些请求被重定向到有问题的请求,那么类似于:

def parse_requests(self, response):
    ....
    meta = {'handle_httpstatus_list': [301, 302]}
    callback = 'process_redirects'
    yield Request(url, callback=callback, meta=meta, ...)

def process_redirects(self, response):
    url = response.headers['location']
    if url is no good:
        return
    else:
        ...

这样可以避免下载无用的响应。在

您可以随时定义自己的自定义重定向中间件。在

我找到了解决我自己问题的方法——用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继承。在

相关问题 更多 >

    热门问题