小编典典

Scrapy-如何管理cookie /会话

scrapy

我对cookie如何与Scrapy一起使用以及如何管理这些cookie感到有些困惑。

网站的运作方式:
当你访问网站时,你将获得一个会话cookie。

当你进行搜索时,该网站会记住你搜索的内容,因此当你执行诸如转到下一页结果之类的操作时,该网站就会知道它正在处理的搜索。

我的剧本:
我的spider的起始网址为searchpage_url

parse()搜索页面由请求,搜索表单响应被传递到search_generator()

search_generator()然后yield使用FormRequest和搜索表单响应进行很多搜索请求。

每个FormRequests和后续的子请求都需要具有自己的会话,因此需要具有自己的单个cookiejar和会话cookie

我已经看过文档中有关阻止cookie合并的meta选项的部分。这实际上是什么意思?这是否意味着发出请求的spider将在其余生中拥有自己的cookiejar

如果这些cookie处于每个spider级别,那么当产生多个蜘蛛时如何工作?是否可以仅使第一个请求生成器生成新的spider,并确保从那时起仅该spider处理将来的请求?

我假设我必须禁用多个并发请求。否则,一个蜘蛛将在同一会话cookie下进行多个搜索,而将来的请求将仅与最近进行的搜索有关?

我很困惑,任何澄清都将受到欢迎!

编辑:
我刚刚想到的另一个选择是完全手动管理会话cookie,并将其从一个请求传递到另一个请求。

我想那将意味着禁用cookie ..,然后从搜索响应中获取会话cookie,并将其传递给每个后续请求。

这是你在这种情况下应该做的吗?


阅读 1475

收藏
2020-04-08

共1个答案

小编典典

只需在你的Spider的start_requests方法中使用以下代码即可:

for i, url in enumerate(urls):
    yield scrapy.Request("http://www.example.com", meta={'cookiejar': i},
        callback=self.parse_page)

请记住,对于后续请求,你每次都需要显式重新附加cookiejar:

def parse_page(self, response):
    # do some processing
    return scrapy.Request("http://www.example.com/otherpage",
        meta={'cookiejar': response.meta['cookiejar']},
        callback=self.parse_other_page)
2020-04-08