Bir web sayfasında oturum açmak ve daha sonra kullanmak üzere çerezleri almak için Python nasıl kullanılır?


146

Python kullanarak web sayfasını indirmek ve ayrıştırmak istiyorum, ancak ona erişmek için birkaç çerez setine ihtiyacım var. Bu nedenle öncelikle web sayfasına https üzerinden giriş yapmam gerekiyor. Oturum açma anı, /login.php'ye iki POST parametresinin (kullanıcı adı, şifre) gönderilmesini içerir. Oturum açma isteği sırasında, tanımlama bilgilerini yanıt başlığından almak ve bunları /data.php web sayfasını indirme isteğinde kullanabilmek için saklamak istiyorum.

Bunu python'da (tercihen 2.6) nasıl yaparım? Mümkünse sadece yerleşik modülleri kullanmak istiyorum.

Yanıtlar:


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()açmak istediğiniz sayfanın düz html'sidir ve openeroturum çerezinizi kullanarak herhangi bir sayfayı görüntülemek için kullanabilirsiniz .


1
Bu güvenli mi? Bu, paket dinleyicilerin düz metin parolaları görmesine izin vermez mi? Https kullanmak daha güvenli olur mu?
Heartinpiece

2
@Heartinpiece Evet, sunucu sunuyorsa HTTPS kullanmalısınız.
Harley Holcombe

Teşekkürler ... ama giriş yaptığımızı ve sth yayınlamak istediğimizi hayal edin ... gönderi verileri için bu ileti dizisinde coockie nasıl ayarlanır?
MLSC

Büyük kod yazıyorsanız istek kitaplığını kullanmanızı önemle tavsiye ederiz. (kişisel deneyim)
swapnil jariwala

156

İşte mükemmel istek kitaplığını kullanan bir sürüm :

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'Bu örnekte gerçekten gerekli mi , yoksa istekle birlikte gönderilen fazladan bir parametre mi?
Ted

1
@Ted Bu kısım tamamen gerekli.
Sanghyun Lee

@Ted Belki bu örnekte gereklidir. Programımda buna ihtiyaç yoktu.
Highstaker

Bu bildiğim en iyi şey. Web sitesine göre verilere ihtiyacınız olabilir.
Jithin Pavithran
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.