2011-01-03 2 views
22

Я пытаюсь открыть следующий веб-сайт и извлечь исходный файл cookie и использовать его для второго URL-адреса, но если вы запустите следующий код, он выведет 2 разных файла cookie. Как использовать начальный файл cookie для второго url-open?Python - urllib2 & cookielib

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 

Выход показывает 2 разные куки каждый раз, как вы можете видеть:

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

ответ

21

Это не проблема с urllib. Этот сайт делает некоторые фанки. Вам нужно запросить пару таблиц стилей, чтобы подтвердить ваш идентификатор сеанса:

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... 
+0

Кажется, это больше не работает. Weird действительно ... – albertov

+0

Теперь он работает :) Я оставил «opener.addheaders» болтающимся в моей сессии ipython. Этот код должен работать как есть (работает для меня на python 2.6 на mac как минимум) – albertov

+0

Код, который я опубликовал, не является надежным. Иногда сессия будет придерживаться, а в других случаях это не будет. Я предполагаю, что есть что-то, что реализовано на стороне сервера, чтобы препятствовать доступу, не связанному с человеком (то есть: довольно строгие политики аннулирования сеанса) – albertov

0

Я думаю, это проблема с сервером он устанавливает новый куки для каждого запроса.

+1

Это не так, когда вы просматриваете фактический браузер, хотя ... это странная вещь. – Adrian

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

Смежные вопросы