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

时间:2017-11-20 19:00:24

标签: python scrapy

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

为此,我写了一个Downloader Middleware

scrapy.http.response.Response

但是,我的抓取工具没有按预期响应。我希望收到的响应对象为Responsebind differently,我希望能够从Response对象创建HtmlResponse以使用XPath。

实际发生了什么?

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

其次,我无法使用XPath提取数据。似乎我无法解码response.encoding中的字节。 ascii正在输出chardet。然后我尝试使用None来确定要使用的编码,它在中间件中输出ISO-8859-1,而在蜘蛛的解析方法中输出var k = "2017-11-20 03:35 PM"; var timeZone = "Asia/Karachi"; // Offset UTC +5:00 hours, so should be 10:35 AM var p = "2017-11-20 11:50 AM"; var timeZone = "US/Eastern"; // Offset UTC -5:00 hours, so should be 16:50 PM 。为什么?再一次,我不能说,但我会喜欢!

你能帮帮我吗?感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

希望这会有所帮助;)

相关问题