Python - urllib2和cookielib

22

我试图打开以下网站并检索初始cookie,然后在第二个url-open中使用它,但是如果您运行以下代码,则会输出2个不同的cookie。如何在第二个url-open中使用初始cookie?

import cookielib, urllib2

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

home = opener.open('https://www.idcourts.us/repository/start.do')
print cj

search = opener.open('https://www.idcourts.us/repository/partySearch.do')
print cj

每次输出都显示了两个不同的cookie,如下所示:

<cookielib.CookieJar[<Cookie JSESSIONID=0DEEE8331DE7D0DFDC22E860E065085F for www.idcourts.us/repository>]>
<cookielib.CookieJar[<Cookie JSESSIONID=E01C2BE8323632A32DA467F8A9B22A51 for www.idcourts.us/repository>]>
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
21

这不是urllib的问题。那个网站做了一些奇怪的事情。你需要请求一些样式表来验证你的会话ID:

import cookielib, urllib2

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# default User-Agent ('Python-urllib/2.6') will *not* work
opener.addheaders = [
    ('User-Agent', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11'),
    ]


stylesheets = [
    'https://www.idcourts.us/repository/css/id_style.css',
    'https://www.idcourts.us/repository/css/id_print.css',
]

home = opener.open('https://www.idcourts.us/repository/start.do')
print cj
sessid = cj._cookies['www.idcourts.us']['/repository']['JSESSIONID'].value
# Note the +=
opener.addheaders += [
    ('Referer', 'https://www.idcourts.us/repository/start.do'),
    ]
for st in stylesheets:
    # da trick
    opener.open(st+';jsessionid='+sessid)
search = opener.open('https://www.idcourts.us/repository/partySearch.do')
print cj
# perhaps need to keep updating the referer...

现在它可以工作了 :) 我在我的ipython会话中忘记了opener.addheaders。那段代码应该是可行的(至少对我来说,在Mac上的python 2.6上可以运行)。 - albertov
我发布的代码不够健壮。有时会出现会话卡住的情况,而其他时候则不会。我猜想可能是服务器端实现了一些防止非人类访问的措施(例如:较为严格的会话失效策略)。 - albertov
5
你是怎样得出这个结论的:“你需要请求几个样式表才能验证你的会话ID:”。 我想了解一下具体方法。 - fixxxer

7

虽然不是实际答案(但长得太长,不适合作为评论),但对于试图回答此问题的其他人可能有用。

尽管我已经尽力了,但我还是无法弄清楚这个问题。

在使用Firebug时,该cookie似乎始终保持不变(对于Firefox可以正常工作)。

我添加了urllib2.HTTPSHandler(debuglevel = 1)来调试Python发送的标题,并且它确实重新发送了cookie。

我还添加了所有Firefox请求标题,以查看是否会有所帮助(结果并没有):

opener.addheaders = [
    ('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'),
    ..
]

我的测试代码:

import cookielib, urllib2

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), urllib2.HTTPSHandler(debuglevel=1))
opener.addheaders = [
    ('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'),
    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
    ('Accept-Language', 'en-gb,en;q=0.5'),
    ('Accept-Encoding', 'gzip,deflate'),
    ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'),
    ('Keep-Alive', '115'),
    ('Connection', 'keep-alive'),
    ('Cache-Control', 'max-age=0'),
    ('Referer', 'https://www.idcourts.us/repository/partySearch.do'),
]

home = opener.open('https://www.idcourts.us/repository/start.do')
print cj

search = opener.open('https://www.idcourts.us/repository/partySearch.do')
print cj

我感觉自己漏掉了一些很显然的东西。


1
页面上可能有一些恶意的JavaScript代码。 - jfs

0

我认为这是服务器的问题,它为每个请求设置了一个新的cookie。


1
但是当您从实际浏览器中浏览时,它不会这样做...这就是奇怪的事情。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,