0

我按照scrapy-zyte-smartproxy文档将代理使用集成到我的蜘蛛中。现在我的蜘蛛无法登录。

4

1 回答 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 回答