如何根据单个scrapy.Spider的不同命令设置不同的IP?

时间:2019-02-11 17:24:41

标签: python authentication proxy scrapy web-crawler

我要刮一堆纸,大约20万。 我通常使用Tor和Polipo代理来隐藏我的蜘蛛行为,即使它们是有礼貌的,我们也不知道。因此,如果我登录,使用一个帐户并更改IP是没有用的。因此,这就是为什么我可以在网站上创建多个帐户并使用如下参数设置我的Spider的原因:

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

并在我有多个帐户的情况下以几个命令对其进行爬网。

我设法用spider.py结尾处的以下代码检查ip:

    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 :(得分:0)

如果获得代理列表,则可以使用DOWNLOADER_MIDDLEWARES中的“ scrapy_proxies.RandomProxy”从列表中为每个新页面选择一个随机代理。

在蜘蛛设置中:

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

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

使用此方法,无需在蜘蛛脚本中添加任何内容