【发布时间】: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