【问题标题】:Is it possible to modify scrapy Response object in middleware?是否可以在中间件中修改 scrapy Response 对象?
【发布时间】:2017-10-25 07:02:15
【问题描述】:

我从几个欧盟网站上抓取了一些数据,发现有时我对response.xpath() 的调用会破坏文本。例如,我发现像 "& amp;" &#164 和其他类似的 html 实体会翻译成像 \x92\xc3 等损坏的字节。 我找到了一些可行的解决方案 - 在调用 xpath 方法(使用 lxml lib)之前转义 html 实体。看起来像这样:

body_str = str(response.body, response._body_declared_encoding())
unescaped_body = html.unescape(body_str)
response = response.replace(body=unescaped_body)

如果在回调开始时立即调用此类代码以处理响应,这对我来说似乎工作正常。

我现在要做的是将这段代码移动到蜘蛛中间件中,为每个请求或另一个蜘蛛等使用这种方法。但问题是这段代码不会修改内部的响应对象

def process_spider_input(self, response, spider):

似乎response = response.replace(...) 创建了新的局部变量响应,在其他地方没有使用。 我的问题就在标题中:我可以修改蜘蛛中间件中的响应对象吗?

【问题讨论】:

    标签: python python-3.x scrapy


    【解决方案1】:

    我会说最好将Downloader Middlewareprocess_response 方法一起使用并返回Response 对象。

    ...
    def process_response(self, request, response, spider):
        ...
        body_str = str(response.body, response._body_declared_encoding())
        unescaped_body = html.unescape(body_str)
        new_response = response.replace(body=unescaped_body)
        return new_response
    

    【讨论】:

    • 谢谢。你是对的,Downloader Middleware 非常适合替换 Response 对象。不幸的是,我的某些解决方案在那里不起作用,因为在中间件中我不能使用`_body_declared_encoding()`(返回无)并且response.body是原始的并且可能仍然是gziped字节对象。我将对此进行更多了解并尝试找到新的解决方案。再次感谢您回答我的标题问题
    • 我收到错误TypeError: replace() takes no keyword arguments
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2021-10-31
    • 2023-04-07
    相关资源
    最近更新 更多