我需要从响应中提取数据,以确保我的代理尚未列入黑名单(获取HTTP状态是不够的)。
为此,我写了一个Downloader Middleware
scrapy.http.response.Response
但是,我的抓取工具没有按预期响应。我希望收到的响应对象为Response
为bind 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
。为什么?再一次,我不能说,但我会喜欢!
答案 0 :(得分:1)
知道了!
通过HTTP传输的数据通常使用gzip进行压缩。我当前的下载器中间件是在实际解压缩响应的scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware
之前触发的。
因此,为了确保在解压缩响应后调用我的自定义process_response方法,我需要将TestXPathMiddleware
放在HttpCompressionMiddleware
之前。完成后,我可以正确解码响应。
或者我可以使用HttpCompressionMiddleware
停用COMPRESSION_ENABLE=False
。这将发送HTTP请求并请求非压缩响应。
希望这会有所帮助;)