#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
настройку.