Я нахожусь в процессе сбора общедоступных данных, касающихся метеологии для проекта (наука о данных), и для эффективного выполнения этого мне нужно изменить прокси-сервер, используемый в моих запросах на удаление, в случае кода ответа 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 ().
Возможно ли, что "в будущем" не будет "сразу после его возвращения"?Как мне сделать, чтобы изменить прокси для всех запросов с этого момента?