我按照scrapy-zyte-smartproxy文档将代理使用集成到我的蜘蛛中。现在我的蜘蛛无法登录。
问问题
242 次
1 回答
0
为此,我们必须使用crawlera 会话,此外,我们需要禁用crawlera cookie。有一个旧的PR,但它仍然没有合并并且不起作用。您需要在文件中创建自己的 scrapy 中间件your_project/middleware.py
,以便为每个蜘蛛请求附加 crawlera 标头。
from scrapy import Request
class ZyteSmartProxySessionMiddleware(object):
def process_spider_output(self, response, result, spider):
def _set_session(request_or_item):
if not isinstance(request_or_item, Request):
return request_or_item
request = request_or_item
header = b'X-Crawlera-Session'
session = response.headers.get(header)
error = response.headers.get(b'X-Crawlera-Error')
session_is_bad = error == b'bad_session_id'
if session is not None and not session_is_bad:
request.headers[header] = session
request.headers['X-Crawlera-Cookies'] = 'disable'
return request
return (_set_session(request_or_item)
for request_or_item in result or ())
settings.py
在您的文件中启用此中间件。
SPIDER_MIDDLEWARES = {
'your_project.middlewares.ZyteSmartProxySessionMiddleware': True,
}
启动会话附加X-Crawlera-Session: create
标头到您的scrapy蜘蛛内的登录请求。
def parse(self, response):
auth_data = {'username': self.user, 'password': self.password}
request = FormRequest.from_response(response, formdata=auth_data,
callback=self.redirect_to_select)
request.headers.setdefault('X-Crawlera-Session', 'create')
return request
请注意,根据文档,此后蜘蛛将变慢。
使用相同 IP 的每个请求之间有 12 秒的默认延迟。对于更受欢迎的域,这些延迟可能会有所不同。
于 2021-08-18T18:57:47.453 回答