python - 使用 scrapy 使用 Downloader Middleware 中的 XPath 或 CSS 选择器解析数据

标签 python scrapy

我需要从响应中提取数据,以确保我的代理尚未列入黑名单(仅获取 HTTP 状态是不够的)。

为此,我编写了一个下载器中间件

class TestXPathMiddleware(object):
    def process_response(self, request, response, spider):
        print(request.url)
        print(type(response))
        if (isinstance(response, HtmlResponse)):
            print('HtmlResponse, XPath should be available')
            print(response.encoding)
            print(response.xpath('//div'))
        return response

但是,我的抓取工具没有按预期响应。我希望收到的响应对象将是 scrapy.http.response.Response 作为 read in the doc我希望能够从 Response 对象创建一个 HtmlResponse 来使用 XPath。

到底发生了什么?

中间件捕获的一些响应是Response,但其他一些响应是直接HtmlResponse。 (看起来蜘蛛中第一个解析方法的响应是 Response,其他(来自更深层次的解析方法)是 HtmlResponse 。为什么?我不能说,但我会喜欢:)

其次,我无法使用 XPath 提取数据。看来我无法解码来自 response.body 的字节。 response.encoding 正在输出 ascii。然后我尝试使用 chardet 来确定要使用的编码,它在中间件中输出 None 而在中间件中输出 ISO-8859-1蜘蛛的解析方法。为什么?再一次,我不能说,但我很乐意!

你能帮我吗?谢谢

最佳答案

明白了! 例如,通过 HTTP 传输的数据通常使用 gzip 进行压缩。我当前的下载器中间件是在实际解压缩响应的 scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware 之前触发的。

因此,为了确保在解压缩响应后调用我的自定义 process_response 方法,我需要将我的 TestXPathMiddleware 放在 HttpCompressionMiddleware 之前。完成此操作后,我可以正确解码响应。

或者我可以使用 COMPRESSION_ENABLE=False 禁用 HttpCompressionMiddleware。这将发送 HTTP 请求并要求非压缩响应。

希望这会有所帮助;)

关于python - 使用 scrapy 使用 Downloader Middleware 中的 XPath 或 CSS 选择器解析数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47399217/

相关文章:

python - 在 Pandas 中创建一个新列,如果另外两列中有数据,则该新列为 True

python - 在独立的scrapy脚本中使用自定义中间件

python - 为什么函数装饰器中的 **kwargs 值与函数中的值不同?

python - matplotlib热图反转数据?

python - 使用Python Docx删除空行

python - 在 Python 中聚合一个字典中的值以填充另一个字典

python - 从嵌套的 HTML 中提取文本内容,同时排除一些特定的标签;废料

python - Scrapyd在具有动态ip的服务器上部署项目

python - 在scrapy中并行运行1个网站的多个蜘蛛?

python - ScrapyJs(scrapy+splash)无法加载脚本,但splash服务器运行良好