0

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

我尝试了后者,但在response has no attribute selector与 FilesPipeline 一起使用时不断得到。

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

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

4

2 回答 2

0

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

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

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.

于 2018-09-27T18:31:11.090 回答
0

文档

process_response(request, response, spider) process_response() 应该:返回一个 Response 对象,返回一个 Request 对象或引发 IgnoreRequest 异常。

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

如果它返回一个 Request 对象,中间件链就会停止,返回的请求会被重新调度以供将来下载。这与从 process_request() 返回请求的行为相同。

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

于 2018-09-23T06:37:31.377 回答