Почему прокси-серверы выходят из строя в Scrapy, но выполняют успешные запросы в библиотеке python-requests

#python #proxy #scrapy #python-requests #request

#python #прокси #scrapy #python-requests #запрос

Вопрос:

У меня есть список, скажем, из 100 прокси, и для их тестирования я делаю запрос в Google и проверяю ответ. При выполнении этих запросов через python-requests каждый запрос возвращается успешно, но при попытке выполнить то же самое в Scrapy в 99% случаев прокси-серверы терпят неудачу. Я что-то упускаю или неправильно использую прокси в Scrapy?

Прокси-серверы хранятся в файле в формате

 http://123.123.123.123:8080
https://234.234.234.234:8080
http://321.321.321.321:8080
...
  

Вот скрипт, который я использовал для тестирования их с помощью python-requests

 import requests

proxyPool = []
with open("proxy_pool.txt", "r") as f:
    proxyPool = f.readlines()

proxyPool = [x.strip() for x in proxyPool]

for proxyItem in proxyPool:
    # Strip the http/s from the ip
    proxy = proxyItem.rsplit("/")[-1].split(":")
    proxy = "{proxy}:{port}".format(proxy=proxy[0], port=proxy[1])
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", }

    proxySession = requests.Session()
    proxySession.proxies = {"http://": proxy, "https://": proxy}
    proxySession.headers.update(headers)
    resp = proxySession.get("https://www.google.com/")

    if resp.status_code == 200:
        print(f"Requests with proxies: {proxySession.proxies} - Successful")
    else:
        print(f"Requests with proxies: {proxySession.proxies} - Unsuccessful")
    time.sleep(3)
  

и паук для Scrapy

 class ProxySpider(scrapy.Spider):
    name = "proxyspider"

    start_urls = ["https://www.google.com/"]

    def start_requests(self):
        with open("proxy_pool.txt", "r") as f:
            for proxy in f.readlines():
                proxy = proxy.strip()
                headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", }

                yield Request(url=self.start_urls[0], callback=self.parse, headers=headers, meta={"proxy": proxy}, dont_filter=True)

    def parse(self, response):
        self.logger.info(f'Parsing: {response.url}')
        if response.status == 200:
            print(f"Requests with proxies: {response.meta['proxy']} - Successful")
        else:
            print(f"Requests with proxies: {response.meta['proxy']} - Unsuccessful")
  

Ответ №1:

В вашем примере кода, построенном с requests — Вы реализовали несколько сеансов (1 сеанс — 1 прокси).

Однако в настройках scrapy по умолчанию — приложение будет использовать single cookiejar для всех прокси.
Он будет отправлять одни и те же данные cookie для каждого прокси.
Вам нужно использовать cookiejar meta key в своих запросах

Если веб-сервер получает запросы от нескольких IP-адресов с одним sessionId переданным в cookieheaders — это выглядит подозрительно, и веб-сервер может идентифицировать его как бота и запретить все используемые IP-адреса. — вероятно, именно это и произошло.

Комментарии:

1. Большое спасибо за это, похоже, это значительно улучшило количество успешных запросов! Я все еще получаю больше неудачных попыток по сравнению с использованием только библиотеки запросов. Знаете ли вы какие-либо другие вещи, с которыми, возможно, стоит поиграть, чтобы попытаться увеличить количество успешных запросов при использовании scrapy?

2. второе важное различие между вашими requests примерами и scrapy образцами кода — задержки между запросами. На requests вас используется time.sleep . В scrapy требуется установить DOWNLOAD_DELAY настройку.