【问题标题】:How to set different IP according to different commands of one single scrapy.Spider?如何根据单个scrapy.Spider的不同命令设置不同的IP?
【发布时间】:2019-02-11 17:24:41
【问题描述】:

我有一堆页面要刮,大约 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

因为我有几个帐户,所以用几个命令来抓取它。

我设法用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

【问题讨论】:

    标签: python authentication proxy scrapy web-crawler


    【解决方案1】:

    如果您获得代理列表,则可以使用 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
    

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

    【讨论】:

    • 对不起,这么晚才回答,我同时做一堆事情。我搜索了是否可以使用 polipo 制作代理列表,但我没有找到任何相关信息。所以我刚刚搜索了代理列表,我发现:proxy-list.download/HTTPS。你的意思是我只需要下载一堆IP地址的文本就可以了吗?
    猜你喜欢
    • 2017-06-07
    • 2019-12-30
    • 2019-11-13
    • 1970-01-01
    • 2021-07-14
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多