我有很多页面需要抓取,大约有 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/