Python scrapy使用会话cookie登录

时间:2013-11-29 14:41:52

标签: python cookies web-scraping scrapy

我正在尝试在身份验证后从网站上搜索。我能够从经过身份验证的浏览器会话中获取JSESSIONID cookie,并使用urlopener下载正确的页面,如下所示。

import cookielib, urllib2

cj = cookielib.CookieJar()
c1 = cookielib.Cookie(None, "JSESSIONID", SESSIONID, None, None, DOMAIN,
        True, False, "/store",True, False, None, False, None, None, None)
cj.set_cookie(c1)

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
fh = opener.open(url)

但是当我使用此代码创建scrapy请求时(尝试了dict cookie和cookiejar),下载的页面是未经过身份验证的版本。有谁知道问题是什么?

cookies = [{
    'name': 'JSESSIONID',
    'value': SESSIONID,
    'path': '/store',
    'domain': DOMAIN,
    'secure': False,
}]

request1 = Request(url, cookies=self.cookies, meta={'dont_merge_cookies': False})
request2 = Request(url, meta={'dont_merge_cookies': True, 'cookiejar': cj})

1 个答案:

答案 0 :(得分:1)

您可以从浏览器中获取JSESSIONID。

为什么不让Scrapy simulate a user login给你?

然后,我认为您的JSESSIONID cookie将坚持以下请求:

  • Scrapy对整个蜘蛛使用单个饼干罐(而不是Multiple cookie sessions per spider) 包含所有抓取步骤的生命周期,
  • Cookie中间件的COOKIES_ENABLED设置默认为 真,
  • dont_merge_cookies默认为false:

      

    当某个网站返回cookie(在响应中)时,这些存储在   该域名的Cookie,将在以后的请求中再次发送。   这是任何常规Web浏览器的典型行为。但是,如果,   出于某种原因,您希望避免与现有的Cookie合并   可以通过设置dont_merge_cookies键来指示Scrapy这样做   在Request.meta中为真。

         

    不合并Cookie的请求示例:

    request_with_cookies = Request(url="http://www.example.com",
                                   cookies={'currency': 'USD', 'country': 'UY'},
                                   meta={'dont_merge_cookies': True})