我需要从响应中提取数据,以确保我的代理尚未列入黑名单(仅获取 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/