Bagaimana cara menggunakan Python untuk masuk ke halaman web dan mengambil cookie untuk penggunaan nanti?

146

Saya ingin mengunduh dan mem-parsing halaman web menggunakan python, tetapi untuk mengaksesnya saya memerlukan beberapa cookie. Karena itu saya harus masuk lebih dari https ke halaman web terlebih dahulu. Momen login melibatkan pengiriman dua params POST (nama pengguna, kata sandi) ke /login.php. Selama permintaan login saya ingin mengambil cookie dari header respon dan menyimpannya sehingga saya dapat menggunakannya dalam permintaan untuk mengunduh halaman web / data.php.

Bagaimana saya melakukan ini dengan python (sebaiknya 2.6)? Jika memungkinkan saya hanya ingin menggunakan modul builtin.

mandom
sumber

Jawaban:

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()adalah html lurus dari halaman yang ingin Anda buka, dan dapat Anda gunakan openeruntuk melihat halaman apa saja menggunakan cookie sesi Anda.

Harley Holcombe
sumber
1
Apakah ini aman? Apakah ini tidak akan memungkinkan paket sniffer melihat kata sandi plaintext? Apakah menggunakan Https akan lebih aman?
Heartinpiece
2
@Heartinpiece Ya, jika server menawarkannya, Anda harus menggunakan HTTPS.
Harley Holcombe
Terima kasih ... tapi bayangkan kita login dan ingin memposting sth ... bagaimana cara mengatur coockie di utas ini untuk data posting?
MLSC
Sangat merekomendasikan untuk menggunakan perpustakaan permintaan jika Anda menulis kode besar. (pengalaman pribadi)
swapnil jariwala
157

Berikut ini versi menggunakan pustaka permintaan yang sangat baik :

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)
Boden Garman
sumber
3
Apakah 'action': 'login'sebenarnya diperlukan dalam contoh ini, atau hanya parameter tambahan yang dikirimkan bersama permintaan?
Ted
1
@Ted Bagian itu benar-benar dibutuhkan.
Sanghyun Lee
@ Ted Mungkin diperlukan dalam contoh khusus ini. Itu tidak diperlukan dalam program saya.
Highstaker
Ini yang terbaik yang saya tahu. Anda mungkin harus data sesuai situs web.
Jithin Pavithran