python: urllib2 cách gửi cookie với yêu cầu urlopen


82

Tôi đang cố gắng sử dụng urllib2 để mở url và gửi văn bản cookie cụ thể đến máy chủ. Ví dụ: tôi muốn mở trang web Giải quyết vấn đề cờ vua , với một cookie cụ thể, ví dụ: tìm kiếm = 1. Tôi phải làm nó như thế nào?

Tôi đang cố gắng thực hiện những điều sau:

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

Cảm ơn trước

Câu trả lời:


111

Cookie chỉ là một tiêu đề HTTP khác.

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

Xem các ví dụ về urllib2 để biết các cách khác về cách thêm tiêu đề HTTP vào yêu cầu của bạn.

Có nhiều cách khác để xử lý cookie. Một số mô-đun như cookielib cố gắng hoạt động giống như trình duyệt web - hãy nhớ những cookie nào bạn đã nhận được trước đó và tự động gửi lại chúng theo các yêu cầu sau.


9
Nếu bạn có nhiều cookie, bạn cần nối chúng trong một giá trị tiêu đề duy nhất, được phân tách bằng dấu chấm phẩy. Ví dụ: nếu bạn có một từ điển các giá trị cookie được gọi cookievals, thì hãy sử dụng opener.addheaders.append(('Cookie', "; ".join('%s=%s' % (k,v) for k,v in cookievals.items()))).
Greg Glockner

Điều gì sẽ xảy ra nếu họ sử dụng các tham số khác để mở url?
Andrew

56

Có thể sử dụng cookielib.CookieJar có thể giúp bạn. Ví dụ: khi đăng lên một trang có biểu mẫu:

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()

BIÊN TẬP:

Sau bình luận của Piotr, tôi sẽ giải thích một chút. Từ các tài liệu:

Lớp CookieJar lưu trữ các cookie HTTP. Nó trích xuất các cookie từ các yêu cầu HTTP và trả lại chúng trong các phản hồi HTTP. Các phiên bản CookieJar tự động hết hạn các cookie được chứa khi cần thiết. Các lớp con cũng chịu trách nhiệm lưu trữ và truy xuất cookie từ tệp hoặc cơ sở dữ liệu.

Vì vậy, bất kỳ yêu cầu nào bạn thực hiện với CookieJarphiên bản của mình , tất cả cookie sẽ được xử lý tự động. Kinda giống như trình duyệt của bạn :)

Tôi chỉ có thể nói từ kinh nghiệm của bản thân và 99% trường hợp sử dụng của tôi cho cookie là nhận một cookie và sau đó cần gửi nó cùng với tất cả các yêu cầu tiếp theo trong phiên đó. Đoạn mã trên chỉ xử lý điều đó và nó hoạt động minh bạch.


6
@PiotrDobrogost bạn nói đúng, tôi không gửi một cookie cụ thể có mã này :) Tôi giả sử rằng tôi sẽ nhận được một cookie khi ĐĂNG và CookieJarphiên bản sẽ xử lý nó cho tôi trên tất cả các miền có liên quan từ đó trở đi.
Morten Jensen

2
OP tuyên bố rõ ràng (…) gửi văn bản cookie cụ thể (…) nên đây không phải là câu trả lời.
Piotr Dobrogost

13

Bạn có thể muốn xem thư viện Python Python tuyệt vời có tên là Yêu cầu . Nó làm cho mọi tác vụ liên quan đến HTTP dễ dàng hơn urllib2 một chút. Từ phần Cookie của hướng dẫn bắt đầu nhanh:

Để gửi cookie của riêng bạn đến máy chủ, bạn có thể sử dụng tham số cookie:

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

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

1
Nó dựa trên urllib3, nó hỗ trợ gộp các kết nối như urllib3 và vẫn tồn tại cookie, tiêu đề - hãy xem Requests Session. Nó thật đẹp!
Serge S.

5

Sử dụng cookielib . Trang tài liệu được liên kết cung cấp các ví dụ ở cuối. Bạn cũng sẽ tìm thấy một hướng dẫn ở đây .


Trong hướng dẫn họ đang lưu cookie sau khi nhận được nó từ máy chủ phải không?
Oleg Tarasenko

Cả hai đều lưu cookie được truy xuất từ ​​máy chủ và đưa chúng trở lại máy chủ, vì đây thường là cách cookie hoạt động. Nếu bạn muốn làm điều gì đó khác thường, thì bạn sẽ phải tìm hiểu sâu hơn một chút về thư viện. Tôi khá chắc chắn rằng nó sẽ hỗ trợ bất cứ điều gì bạn muốn làm.
Marcelo Cantos

1

Câu trả lời này không hoạt động vì urllib2mô-đun đã được chia thành nhiều mô-đun trong Python 3. Bạn cần phải làm

from urllib import request
opener = request.build_opener()
opener.addheaders.append(('Cookie', 'cookiename=cookievalue'))
f = opener.open("http://example.com/")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.