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.

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.


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)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.