Scrap Middleware ответ - PullRequest
       10

Scrap Middleware ответ

0 голосов
/ 23 сентября 2018

При использовании промежуточного программного обеспечения Scrapy Downloader вы не можете найти то, что вам нужно.Вы создаете объект 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

Если я вернусь в #1, FilesPipeline будет работать правильно и загрузить файлы, но если я вернусь в #2, он вернет ошибку response has no attribute selector

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Из документов на 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><'>

Я не вижу создания нового ответав коде, но с самого начала вопроса («Создаете ли вы объект Response и возвращаете это (...)»), я подозреваю, что фрагмент кода может быть неполным, и ответ, возвращенный на #2, может быть создан вручнуюResponse.

0 голосов
/ 23 сентября 2018

Из документов :

process_response (запрос, ответ, паук) process_response () должен либо: вернуть объект Response, вернуть объект Request или вызвать исключение IgnoreRequest.

Если он возвращает Ответ (это может быть тот же данный ответ или совершенно новый), этот ответ будет продолжать обрабатываться с помощью process_response () следующего промежуточного программного обеспечения в цепочке.

Если он возвращает объект запроса, цепочка промежуточного программного обеспечения останавливается, а возвращенный запрос перепланируется для загрузки в будущем.Это такое же поведение, как если бы запрос возвращался из process_request ().

Если он вызывает исключение IgnoreRequest, вызывается функция errback запроса (Request.errback).Если никакой код не обрабатывает возникшее исключение, оно игнорируется и не регистрируется (в отличие от других исключений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...