Làm cách nào để sử dụng Python để đăng nhập vào trang web và truy xuất cookie để sử dụng sau này?


146

Tôi muốn tải xuống và phân tích trang web bằng python, nhưng để truy cập nó, tôi cần một vài bộ cookie. Do đó tôi cần đăng nhập qua https vào trang web trước. Thời điểm đăng nhập liên quan đến việc gửi hai thông số POST (tên người dùng, mật khẩu) đến /login.php. Trong yêu cầu đăng nhập, tôi muốn lấy cookie từ tiêu đề phản hồi và lưu trữ chúng để tôi có thể sử dụng chúng trong yêu cầu tải xuống trang web /data.php.

Làm thế nào tôi có thể làm điều này trong python (tốt nhất là 2.6)? Nếu có thể tôi chỉ muốn sử dụng các mô-đun dựng sẵn.

Câu trả lời:


147
import urllib, urllib2, cookielib

username = 'myuser'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'j_password' : password})
opener.open('http://www.example.com/login.php', login_data)
resp = opener.open('http://www.example.com/hiddenpage.php')
print resp.read()

resp.read()là html thẳng của trang bạn muốn mở và bạn có thể sử dụng openerđể xem bất kỳ trang nào bằng cookie phiên của mình.


1
Cái này có an toàn không? Điều này có cho phép người đánh hơi gói xem mật khẩu văn bản không? Sử dụng Https sẽ an toàn hơn?
Heartinunch

2
@Heartinunch Có, nếu máy chủ cung cấp, bạn nên sử dụng HTTPS.
Harley Holcombe

Cảm ơn bạn ... nhưng hãy tưởng tượng chúng tôi đã đăng nhập và muốn đăng sth ... làm thế nào để đặt coockie trong chuỗi này cho dữ liệu bài đăng?
MLSC

Rất khuyến khích sử dụng thư viện yêu cầu nếu bạn đang viết mã lớn. (kinh nghiệm cá nhân)
hoán đổi jariwala

157

Đây là phiên bản sử dụng thư viện yêu cầu tuyệt vời :

from requests import session

payload = {
    'action': 'login',
    'username': USERNAME,
    'password': PASSWORD
}

with session() as c:
    c.post('http://example.com/login.php', data=payload)
    response = c.get('http://example.com/protected_page.php')
    print(response.headers)
    print(response.text)

3
'action': 'login'thực sự cần thiết trong ví dụ này không, hay nó chỉ là một tham số phụ được gửi cùng với yêu cầu?
Ted

1
@Ted Phần đó là hoàn toàn cần thiết.
Sanghyun Lee

@Ted Có lẽ nó được yêu cầu trong ví dụ cụ thể này. Nó không cần thiết trong chương trình của tôi.
Highstaker

Đây là điều tốt nhất tôi biết. Bạn có thể phải dữ liệu theo trang web.
Jithin Pavithran
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.