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

标签 python authentication proxy scrapy web-crawler

我有很多页面需要抓取,大约有 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 爬行蜘蛛 -a 用户名=Bidule -a 密码=TMTC#cmd1

scrapy 爬行蜘蛛 -a 用户名=Truc -a 密码=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

最佳答案

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

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

关于python - 如何根据单个scrapy.Spider的不同命令设置不同的IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54635927/

相关文章:

python - Jupyterhub : where is get_config defined and how do I create a custom Authenticator?

匿名用户身份验证

java - Java获取系统HTTP代理配置的方法

java - JSoup在爬取时设置代理IP

python - 使用请求时握手错误

python - 从 CSV 文件中提取列以用作 NetworkX 中的节点列表

django - Django base.html 中的动态变量

linux - 公司代理背后的 Linux 上的 dotnet restore、NuGet 和 VS Code 问题

python - 在 Django 中使用观察者模式的问题

python - 如何为Python 3.1 ubuntu服务器10.04安装请求​​模块?