Как установить разные IP в соответствии с разными командами одного scrapy.Spider? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть куча страниц, около 200 000. Я обычно использую прокси Tor и Polipo, чтобы скрыть поведение своих пауков, даже если они вежливы, мы никогда не узнаем.Поэтому, если я войду в систему, это бесполезно использовать одну учетную запись и изменить IP.Вот почему я могу создать несколько учетных записей на веб-сайте и установить моего паука с аргументами, подобными приведенным ниже:

class ASpider(scrapy.Spider):
    name = "spider"
    start_urls = ['https://www.a_website.com/compte/login']

    def __init__ (self, username=None, password=None):
        self.username = username
        self.password = password

    def parse(self, response):
       token = response.css('[name="_csrf_token"]::attr(value)').get()
       data_log = {
                '_csrf_token': token,
                '_username': self.username,
                '_password': self.password
                 }
        yield scrapy.FormRequest.from_response(response, formdata=data_log, callback=self.after_login) #No matter the rest

И запустить несколько таких же пауков, как:

scrapy crawl spider -a username=Bidule -a password=TMTC #cmd1

scrapy crawl spider -a username=Truc -a password=TMTC #cmd2

и отсканировать его по нескольким командам, так как у меня есть несколько учетных записей.

Мне удалось проверить ip с помощью кода, следующего в конце spider.py:

    yield scrapy.Request('http://checkip.dyndns.org/',meta={'item':item_cheval}, callback=self.checkip)

def checkip(self, response):
    print('IP: {}'.format(response.xpath('//body/text()').re('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')[0]))

возвращает одинаковый IP-адрес в обеих запущенных командах.Так что моему прокси не удается назначить разные IP-адреса каждому пауку.

Кто-то сказал мне о bindadress, но я понятия не имею, как он работает и действительно ли он дает то, что я ожидаю.

Примечания: я использую это в моих middlewares.py:

class ProxyMiddleware(object):

    def process_request(self, request, spider):
        request.meta['proxy'] = settings.get('HTTP_PROXY')

, и это в моих settings.py:

# proxy for polipo
HTTP_PROXY = 'http://127.0.0.1:8123'
....
DOWNLOADER_MIDDLEWARES = {
    'folder.middlewares.RandomUserAgentMiddleware': 400,
    'folder.middlewares.ProxyMiddleware': 410, #Here for proxy
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None}

Это скопированные шаблоны, которые я вставил в свой код, и это работает, но я не владею этим навыком.

Версия Scrapy: 1.5.0, версия Python: 2.7.9, версия Tor: 0.3.4.8, Vidalia: 0.2.21

1 Ответ

0 голосов
/ 21 февраля 2019

Если вы получаете список прокси, вы можете использовать 'scrapy_proxies.RandomProxy' в DOWNLOADER_MIDDLEWARES, чтобы выбрать случайный прокси из списка для каждой новой страницы.

В настройках вашего паука:

DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
'scrapy_proxies.RandomProxy': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

PROXY_LIST = 'path/proxylist.txt'
PROXY_MODE = 0

С помощью этого метода нечего добавить в скрипт паука

...