Программный сброс TCP-соединения в Scrapy - PullRequest
1 голос
/ 27 июня 2019

В настоящее время я сканирую веб-сайт, который запрещает использование IP-адресов, если он запросил слишком много страниц за короткий промежуток времени.Когда это происходит, это дает 403 status code в ответе.Если IP-адрес не обновляется, сканер не выполнит все следующие запросы.

Поэтому я добавил HTTP-прокси, это концентратор, на котором размещены сотни IP-адресов, и назначается случайный один для каждого TCP-соединения.

>>> import requests
>>> proxies = {"https": "https://user:pass@proxyservice.com"}
>>> s = requests.Session()
>>> 
>>> print("\n persisted connection:")
>>> for i in range(3):
>>>     print(s.get("https://ifconfig.co", proxies=proxies).text)
>>>
>>> print("\n new connection every request:")
>>> for i in range(3):
>>>     print(requests.get("https://ifconfig.co", proxies=proxies).text)

persisted connection:
123.123.123.123
123.123.123.123
123.123.123.123

new connection every request:
123.111.111.111
123.222.222.222
123.110.110.110

Я работаю со Scrapy в своем проекте, он использует постоянное соединение по умолчанию, что означает, что он будет использовать один и тот же прокси-IP для каждого соединения:

class TestSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['ifconfig.co']
    custom_settings = {
        "CONCURRENT_REQUESTS": 2
    }

    def __init__(self):
        self.url = "https://ifconfig.co"
        self.headers = {"user-agent": "curl"}
        self.proxy = "https://user:pass@proxyservice.com"

    def start_requests(self):
        # We have 2 concurrent requests (persisted connections).
        yield Request(url=self.url, headers=self.headers, meta={"proxy": self.proxy}, dont_filter=True)
        yield Request(url=self.url, headers=self.headers, meta={"proxy": self.proxy}, dont_filter=True)

    def parse(self, response):
        self.logger.info(response.text)
        yield Request(url=self.url, headers=self.headers, meta={"proxy": self.proxy}, dont_filter=True)

Что дает нам:

2019-06-27 12:13:21 [test] INFO: 181.xx.xx.197

2019-06-27 12:13:21 [test] INFO: 38.xx.xx.199

2019-06-27 12:13:21 [test] INFO: 181.xx.xx.197

2019-06-27 12:13:22 [test] INFO: 38.xx.xx.199

2019-06-27 12:13:22 [test] INFO: 181.xx.xx.197

2019-06-27 12:13:22 [test] INFO: 38.xx.xx.199

2019-06-27 12:13:22 [test] INFO: 181.xx.xx.197

2019-06-27 12:13:23 [test] INFO: 181.xx.xx.197

2019-06-27 12:13:23 [test] INFO: 38.xx.xx.199

2019-06-27 12:13:23 [test] INFO: 181.xx.xx.197

2019-06-27 12:13:24 [test] INFO: 38.xx.xx.199

Как я могу сбросить соединение TCP с прокси-сервером, чтобы я мог получить новый IP-адрес, когда ответ дает 403?

1 Ответ

0 голосов
/ 27 июня 2019

Оказывается, что прокси-служба, которую я использую (https://luminati.io), поддерживает принудительное обновление IP, добавляя параметр в поле имени пользователя.

имя пользователя-session-% rndint: pass@proxyservice.com

И изменение региона IP с помощью: имя пользователя-страна-нам: pass@proxyservice.com

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