刮擦中间件返回响应



当使用Scrapy Downloader中间件时,你找不到你需要的东西。您是构建一个Response对象并返回该对象,还是返回随process_response一起传入的response变量?

我尝试了后者,但在与FilesPipeline一起使用时一直response has no attribute selector

class CaptchaMiddleware(object):
def process_response(self, request, response, spider):
download_path = spider.settings['CAPTCHA_STORE']
# 1
captcha_images = parse_xpath(response, CAPTCHA_PATTERN, 'image')
if captcha_images:
for url in captcha_images:
url = response.urljoin(url)
print("Downloading %s" % url)
download_file(url, os.path.join(download_path, url.split('/')[-1]))
for image in os.listdir(download_path):
Image.open(image)
# 2
return response

如果我在#1返回,FilesPipeline运行正常并下载文件,但如果我在#2返回,它会返回错误response has no attribute selector

从文档中:

process_response(请求、响应、蜘蛛( process_response(( 应该 任一项:返回一个响应对象,返回一个请求对象或引发一个 忽略请求异常。

如果它返回响应(它可以是相同的给定响应,或者 全新的(,该响应将继续使用 链中下一个中间件的process_response((。

如果它返回一个 Request 对象,则中间件链将停止,并且 返回的请求将重新安排为将来下载。这 与从中返回请求的行为相同 process_request((。

如果它引发 IgnoreRequest 异常,则 请求 (Request.errback( 被调用。如果没有代码处理引发的 异常,它将被忽略且不记录(与其他异常不同(。

来自 https://doc.scrapy.org/en/latest/topics/request-response.html#textresponse-objects 的文档:

文本响应对象将编码功能添加到基本响应 类,仅用于二进制数据,例如图像, 声音或任何媒体文件。

Response对象没有selector属性,TextResponse和子类具有:

In [1]: from scrapy.http import Response, TextResponse                                                                                                                                                                                                                          
In [2]: Response('http://example.org', body=b'<html><body><div>Something</div></body></html>').selector                                                                                                                                                                         
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-6fdd116632d2> in <module>
----> 1 Response('http://example.org', body=b'<html><body><div>Something</div></body></html>').selector
AttributeError: 'Response' object has no attribute 'selector'
In [3]: TextResponse('http://example.org', body=b'<html><body><div>Something</div></body></html>').selector                                                                                                                                                                     
Out[3]: <Selector xpath=None data='<html><body><div>Something</div></body><'>

我没有看到代码中正在创建新的响应,但是从问题的开头开始("您是否构建了一个响应对象并返回该对象(...我怀疑该代码段可能不完整,#2返回的响应可能是手动创建的Response

最新更新