您可以在每个帐户会话中使用多个 cookiejar 并行抓取多个帐户,
请参阅“cookiejar”请求元密钥http://doc.scrapy.org/en/latest/topics/downloader-middleware.html?highlight=cookiejar#std:reqmeta-cookiejar http://doc.scrapy.org/en/latest/topics/downloader-middleware.html?highlight=cookiejar#std%3areqmeta-cookiejar
澄清:
假设我们有一系列帐户settings.py
:
MY_ACCOUNTS = [
{'login': 'my_login_1', 'pwd': 'my_pwd_1'},
{'login': 'my_login_2', 'pwd': 'my_pwd_2'},
]
这是登录页面的链接:http://example.com/login
Create start_requests
蜘蛛中的函数,在这个函数中我们可以循环MY_ACCOUNTS
数组并登录每个帐户:
def start_requests(self):
requests = []
for i, account in enumerate(self.crawler.settings['MY_ACCOUNTS']):
request = FormRequest('http://example.com/login',
formdata={'form_login_name': account['login'], 'form_pwd_name': account['pwd']},
callback=self.parse,
dont_filter=True)
request.meta['cookiejar'] = i
requests.append(request)
return requests
form_login_name
and form_pwd_name
分别是登录表单上的字段名称。
dont_filter=True
用于忽略重复请求的过滤器,因为这里我们发出 POST 请求以在同一页面上登录http://example.com/login
request.meta['cookiejar'] = i
要分隔每个会话(登录)的 cookie,请不要忘记添加cookiejar
子请求中的标识符,假设您想在登录后将 scrapy 重定向到页面:
def parse(self, response):
""" make some manipulation here ... """
yield Request(my_url, meta={'cookiejar': response.meta['cookiejar']}, callback = my_callback)