groupbwt / scrapy-boilerplate

Scrapy project boilerplate done right
MIT License
42 stars 25 forks source link

feat(handlers): add rotating proxies download handler #48

Closed AntonGsv closed 4 years ago

AntonGsv commented 4 years ago

На сейчас ip адреса StormProxy не меняются для домена при использовании их из scrapy(фиксируется первый полученный ip адрес и дальше все запросы на домен идут с него). Подключение этого DOWNLOAD_HANDLER исправляет ситуацию.

Пример:

import re
import scrapy

class IpSpider(scrapy.Spider):
    name = 'ip'
    custom_settings = {
        'CONCURRENT_REQUESTS': 4,
        'DOWNLOAD_TIMEOUT': 4,
        'RETRY_TIMES': 2,
        'COOKIES_ENABLED': False,
        'LOG_LEVEL': 'INFO',
        "DOWNLOAD_HANDLERS": {
            'http': 'helpers.handlers.RotatingProxiesDownloadHandler',
            'https': 'helpers.handlers.RotatingProxiesDownloadHandler'
        },
        'DOWNLOADER_MIDDLEWARES': {
            "middlewares.HttpProxyMiddleware": 543,
        }
    }

    def start_requests(self):
        for i in range(10):
            yield scrapy.Request('https://api.myip.com', self.parse, dont_filter=True)
            yield scrapy.Request('https://httpbin.org/ip?q=', self.parse, dont_filter=True)
            yield scrapy.Request('https://httpbin.org/ip', self.parse, dont_filter=True)

    def parse(self, response):
        self.logger.info('{} {}'.format(response.url, re.sub(r'\s+', '', response.text)))
AntonGsv commented 3 years ago

@KristobalJunta Можно использовать постоянное соединение и вызывать смену ip по необходимости, для этого нужно в download_request при получении meta параметра вызывать следующий метод: self._pool.closeCachedConnections()