Запросы Python — управление файлами cookie

Я пытаюсь автоматически получить некоторый контент с сайта с помощью запросов (и bs4)

У меня есть скрипт, который получает файл cookie:

def getCookies(self):
    username = 'username'
    password = 'password'
    URL = 'logonURL'
    r = requests.get(URL, auth=('username', 'password'))
    cookies = r.cookies

дамп куки выглядит так:

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie ASP.NET_SessionId=yqokjr55ezarqbijyrwnov45 for URL.com/>, <Cookie BIGipServerPE_Journals.lww.com_80=1440336906.20480.0000 for URL.com/>, <Cookie JournalsLockCookie=id=a5720750-3f20-4207-a500-93ae4389213c&ip=IP address for URL.com/>]>

Но когда я передаю объект cookie на следующий URL-адрес:

 soup = Soup(s.get(URL, cookies = cookies).content)

это не работает - я вижу, сбрасывая суп, что я не даю веб-серверу свои учетные данные должным образом

Я попытался запустить сеанс запросов:

def getCookies(self):
    self.s = requests.session()
    username = 'username'
    password = 'password'
    URL = 'logURL'
    r = self.s.get(URL, auth=('username', 'password'))

и получаю то же никакой радости.

Я посмотрел заголовок через liveHttp в FF, когда захожу на 2-ю страницу, и вижу совсем другую форму:

Cookie: WT_FPC=id=264b0aa85e0247eb4f11355304127862:lv=1355317068013:ss=1355314918680; UserInfo=Username=username; BIGipServerPE_Journals.lww.com_80=1423559690.20480.0000; PlatformAuthCookie=true; Institution=ReferrerUrl=http://logonURL.com/?wa=wsignin1.0&wtrealm=urn:adis&wctx=http://URL.com/_layouts/Authenticate.aspx?Source=%252fpecnews%252ftoc%252f2012%252f06440&token=method|ExpireAbsolute; counterSessionGuidId=6e2bd57f-b6da-4dd4-bcb0-742428e08b5e; MyListsRefresh=12/13/2012 12:59:04 AM; ASP.NET_SessionId=40a04p45zppozc45wbadah45; JournalsLockCookie=id=85d1f38f-dcbb-476a-bc2e-92f7ac1ae493&ip=10.204.217.84; FedAuth=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U2VjdXJpdHlDb250ZXh0VG9rZW4gcDE6SWQ9Il9mMGU5N2M3Zi1jNzQ5LTQ4ZjktYTUxNS1mODNlYjJiNGNlYzUtNEU1MDQzOEY0RTk5QURCNDFBQTA0Mjc0RDE5QzREMEEiIHhtbG5zOnAxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3Mtc2VjdXJlY29udmVyc2F0aW9uLzIwMDUxMiI+PElkZW50aWZpZXI+dXJuOnV1aWQ6ZjJmNGY5MGItMmE4Yy00OTdlLTkwNzktY2EwYjM3MTBkN2I1PC9JZGVudGlmaWVyPjxJbnN0YW5jZT51cm46dXVpZDo2NzMxN2U5Ny1lMWQ3LTQ2YzUtOTg2OC05ZGJhYjA3NDkzOWY8L0luc3RhbmNlPjwvU2VjdXJpdHlDb250ZXh0VG9rZW4+

Я отредактировал имя пользователя, пароль и URL-адреса из вопроса по очевидным причинам.

Я упускаю что-то очевидное? есть ли другой / правильный способ захвата файла cookie - текущий метод, который я использую, не работает.

РЕДАКТИРОВАТЬ:

Это самостоятельная версия сеансового кода:

s = requests.session()
username = 'username'
password = 'password'
URL = 'logonURL.aspx'
r = s.get(URL, auth=('username', 'password'))
URL = r"URL.aspx"
soup = Soup(s.get(URL).content)

читая дамп супа, я вижу в html, что он говорит мне, что у меня нет доступа - эта строка появляется только через браузер, когда вы не вошли в систему.


person Jay Gattuso    schedule 13.12.2012    source источник
comment
Вы уверены, что процесс аутентификации на самом деле является запросом GET, а не POST?   -  person voithos    schedule 13.12.2012
comment
Очень хороший вопрос. Как бы я сказал? (liveHTTP говорит: GET /ig_res/default/ig_dialogwindow.css HTTP/1.1)   -  person Jay Gattuso    schedule 13.12.2012
comment
Если вы пытаетесь войти на сайт, попробуйте войти в систему с помощью обычного браузера и наблюдайте за запросами, которые отправляются на сервер. Если у вас есть Chrome, вы можете использовать встроенные инструменты разработчика. Если вы используете Firefox, вы можете использовать Firebug. В качестве примечания, большинство отправлений на основе форм (например, форма входа) являются запросами POST.   -  person voithos    schedule 13.12.2012
comment
Нет, это файл CSS (таблицы стилей). Попробуйте просто использовать POST и посмотрите, что произойдет. Например, r = s.post(URL, auth=('username', 'password')) в вашем запросе на основе сеанса.   -  person voithos    schedule 13.12.2012
comment
Я вышел из системы, затем снова вошел в систему. Первый заголовок, который я вижу, — это GET /ig_res/default/ig_dialogwindow.css HTTP/1.1, в котором есть объект с именем Cookie: WT_FPC=id= etc — это та же строка, которую я предложил ранее. Я думаю, это делает его заголовком POST...   -  person Jay Gattuso    schedule 13.12.2012
comment
ХОРОШО. Я пробовал, то же самое. В настоящее время у вас нет доступа к этой статье   -  person Jay Gattuso    schedule 13.12.2012
comment
Нет, это не так. Почтовый запрос начинается с POST. То, что вы видите, — это запрос GET для таблицы стилей (ваш браузер запрашивает у сервера таблицу стилей, чтобы он мог красиво отображать страницу).   -  person voithos    schedule 13.12.2012
comment
Вы пытаетесь отправить сообщение на страницу, которую хотите получить? Сначала вам нужно отправить POST на URL-адрес входа, затем ПОЛУЧИТЬ нужную страницу (используя тот же сеанс).   -  person voithos    schedule 13.12.2012
comment
Да, я отправил учетные данные. Я ударю его снова, просто чтобы убедиться! Юп. Нет радости. Спасибо хоть! Я ценю ваши указатели.   -  person Jay Gattuso    schedule 13.12.2012


Ответы (2)


У меня была аналогичная проблема, и я нашел помощь в этом вопросе. Баночка сеанса была пуста, и для получения файла cookie мне нужно было использовать сеанс.

session = requests.session()
p = session.post("http://example.com", {'user':user,'password':password})
print 'headers', p.headers
print 'cookies', requests.utils.dict_from_cookiejar(session.cookies)
print 'html',  p.text
person arhuaco    schedule 02.10.2013

Вы должны повторно использовать весь объект session, а не связанный cookiejar. Используйте self.s для всех ваших запросов.

Если ваши запросы по-прежнему не выполняются при повторном использовании сеанса, они будут завершаться ошибкой по другой причине, а не потому, что вы неправильно возвращаете файлы cookie.

Обратите внимание, что если вам нужно использовать auth=('username', 'password'), то аутентификация основана на HTTPAuth, а не на основе файлов cookie. Вам необходимо пройти одну и ту же аутентификацию для всех вызовов. Сессия запросов может сделать это и для вас:

s = requests.session(auth=('username', 'password'))

Однако, если страница входа представляет собой форму с полем имени пользователя и пароля, вместо этого вам нужно будет вызвать цель формы. Проверьте, является ли форма POST или GET, и проверьте имена полей:

s.post(loginTarget, {usernamefield=username, passwordfield=password, otherfield=othervalue})

и вообще не использовать HTTP-аутентификацию.

person Martijn Pieters    schedule 13.12.2012
comment
Я добавил самостоятельный пример сеансовой версии - это правильно? - person Jay Gattuso; 13.12.2012