Невозможно изменить запрос в промежуточном программном обеспечении с помощью Scrapy - PullRequest
0 голосов
/ 27 декабря 2018

Я нахожусь в процессе сбора общедоступных данных, касающихся метеологии для проекта (наука о данных), и для эффективного выполнения этого мне нужно изменить прокси-сервер, используемый в моих запросах на удаление, в случае кода ответа 403.

Для этого я определил промежуточное программное обеспечение для загрузки в такой ситуации:

class ProxyMiddleware(object):    
    def process_response(self, request, response, spider):
        if response.status == 403:
            f = open("Proxies.txt")
            proxy = random_line(f) # Just returns a random line from the file with a valid structure ("http://IP:port")
            new_request = Request(url=request.url)
            new_request.meta['proxy'] = proxy
            spider.logger.info("[Response 403] Changed proxy to %s" % proxy)
            return new_request
        return response

После правильного добавления класса в settings.py я ожидал, что это промежуточное ПО будет иметь дело с 403ответы, генерируя новый запрос с новым прокси, следовательно заканчивая 200 ответом.Наблюдаемое поведение состоит в том, что он фактически выполняется (я вижу информацию Logger об Измененном прокси), но новый запрос, похоже, не выполнен.Вместо этого я получаю следующее:

2018-12-26 23:33:19 [bot_2] INFO: [Response] Changed proxy to https://154.65.93.126:53281
2018-12-26 23:33:26 [bot_2] INFO: [Response] Changed proxy to https://176.196.84.138:51336

... неопределенно со случайными прокси, что заставляет меня думать, что я все еще получаю 403 ошибки, и прокси не меняется.

Читая документацию , относящуюся к process_response , он сообщает:

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

Возможно ли, что "в будущем" не будет "сразу после его возвращения"?Как мне сделать, чтобы изменить прокси для всех запросов с этого момента?

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Попробуйте это:

class ProxyMiddleware(object):    
    def process_response(self, request, response, spider):
        if response.status == 403:
            f = open("Proxies.txt")
            proxy = random_line(f)
            new_request = Request(url=request.url)
            new_request.meta['proxy'] = proxy
            spider.logger.info("[Response 403] Changed proxy to %s" % proxy)
            return new_request
        else:
            return response

Лучше было бы использовать вместо этого модуль случайных прокси scrapy:

'DOWNLOADER_MIDDLEWARES' : {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620
},
0 голосов
/ 27 декабря 2018

Scrapy по умолчанию отбрасывает повторяющиеся запросы на один и тот же URL, так что, вероятно, это происходит с вашим пауком.Чтобы проверить, что это ваш случай, вы можете установить следующие параметры:

DUPEFILTER_DEBUG=True
LOG_LEVEL='DEBUG'

Чтобы решить эту проблему, вы должны добавить dont_filter=True:

new_request = Request(url=request.url, dont_filter=True)
...