【问题标题】:Scrapy Middleware return ResponseScrapy 中间件返回响应
【发布时间】:2018-09-29 07:27:07
【问题描述】:

使用 Scrapy 下载器中间件时,您找不到所需的内容。你是构建一个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

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

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    来自docs

    process_response(request, response, spider) process_response() 应该 要么:返回 Response 对象,返回 Request 对象或引发 忽略请求异常。

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

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

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

    【讨论】:

    • 我知道。问题是在我使用response.selector.xpath 之后,FilePipelines 出现问题,它说响应没有对象选择器。文档中的任何地方都没有提到。
    【解决方案2】:

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

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

    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><'>
    

    我没有看到在代码中创建了新的响应,但是从问题的开头(“你构建一个响应对象并返回那个(...)”)我怀疑 sn-p 可能是不完整,#2 返回的响应可能是手动创建的Response

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多