python : urllib2 urlopen 요청으로 쿠키를 보내는 방법


82

urllib2를 사용하여 url을 열고 특정 쿠키 텍스트를 서버로 보내려고합니다. 예를 들어 특정 쿠키 (예 : search = 1)를 사용하여 사이트를 열고 체스 문제를 해결 합니다. 어떻게하나요?

다음을 시도하고 있습니다.

import urllib2
(need to add cookie to the request somehow)
urllib2.urlopen("http://chess-problems.prg")

미리 감사드립니다

답변:


111

쿠키는 또 다른 HTTP 헤더입니다.

import urllib2
opener = urllib2.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")

요청에 HTTP 헤더를 추가하는 다른 방법 은 urllib2 예제 를 참조하십시오 .

쿠키를 처리하는 방법에는 여러 가지가 있습니다. cookielib 와 같은 일부 모듈은 웹 브라우저처럼 작동하려고합니다. 이전에받은 쿠키를 기억하고 다음 요청에서 자동으로 다시 보냅니다.


9
쿠키가 여러 개인 경우 세미콜론으로 구분 된 단일 헤더 값으로 결합해야합니다. 예를 들어라는 쿠키 값 사전이있는 cookievals경우 opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
그렉 Glockner

urlopen에 다른 매개 변수를 사용하는 경우 어떻게됩니까?
앤드류

56

아마도 cookielib.CookieJar 를 사용 하면 도움이 될 수 있습니다. 예를 들어 양식이 포함 된 페이지에 게시하는 경우 :

import urllib2
import urllib
from cookielib import CookieJar

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# input-type values from the html form
formdata = { "username" : username, "password": password, "form-id" : "1234" }
data_encoded = urllib.urlencode(formdata)
response = opener.open("https://page.com/login.php", data_encoded)
content = response.read()

편집하다:

Piotr의 코멘트 후에 조금 더 자세히 설명하겠습니다. 문서에서 :

CookieJar 클래스는 HTTP 쿠키를 저장합니다. HTTP 요청에서 쿠키를 추출하여 HTTP 응답으로 반환합니다. CookieJar 인스턴스는 필요할 때 포함 된 쿠키가 자동으로 만료됩니다. 서브 클래스는 파일 또는 데이터베이스에서 쿠키를 저장하고 검색하는 역할도합니다.

따라서 CookieJar인스턴스에 대한 요청이 무엇이든 모든 쿠키는 자동으로 처리됩니다. 브라우저처럼 :)

나는 내 경험을 통해서만 말할 수 있으며 쿠키에 대한 99 % 사용 사례는 쿠키를받은 다음 해당 세션의 모든 후속 요청과 함께 쿠키를 보내야하는 것입니다. 위의 코드는이를 처리하고 투명하게 처리합니다.


6
@PiotrDobrogost 당신이 맞아요, 나는이 코드와 함께 특정 쿠키를 보내지 않습니다 :) 나는 POSTing시 하나를받을 것이라고 가정하고 CookieJar인스턴스는 그때부터 모든 관련 도메인에서 나를 위해 그것을 처리 할 것입니다.
Morten Jensen 2012

2
OP 는 특정 쿠키 텍스트 (…)를 보내도록 명시 적으로 (…) 명시 하므로 이것은 답이 아닙니다.
Piotr Dobrogost

13

Requests 라는 훌륭한 HTTP Python 라이브러리를 살펴볼 수 있습니다 . HTTP와 관련된 모든 작업을 urllib2보다 조금 더 쉽게 만듭니다. 에서 쿠키의 빠른 시작 가이드 섹션 :

자신의 쿠키를 서버로 보내려면 cookies 매개 변수를 사용할 수 있습니다.

>>> cookies = dict(cookies_are='working')

>>> r = requests.get('http://httpbin.org/cookies', cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'

1
을 기반으로 urllib3하며 urllib3과 같은 연결 풀링을 지원하고 쿠키, 헤더를 유지합니다 Requests Session. 아름다워!
Serge S.

5

cookielib를 사용하십시오 . 링크 된 문서 페이지는 끝에 예제를 제공합니다. 여기 에서 튜토리얼도 찾을 수 있습니다 .


튜토리얼에서는 쿠키를 서버에서받은 후 저장하고 있지 않습니까?
Oleg Tarasenko

일반적으로 쿠키가 작동하는 방식이므로 서버에서 검색된 쿠키를 저장하고 다시 서버로 반환합니다. 평범하지 않은 일을하고 싶다면 도서관을 좀 더 깊이 파헤쳐 야합니다. 나는 그것이 당신이 원하는 것을 지원할 것이라고 확신합니다.
Marcelo Cantos

1

이 답변은 urllib2모듈이 Python 3에서 여러 모듈로 분할되었으므로 작동 하지 않습니다.

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.