2014-05-25 99 views
-1

我已经经历了无数Google结果和堆栈溢出问题,试图找出如何执行以下操作。大多数人建议使用请求会话类来存储会话信息。如何使用Python的请求正确登录到网站?

不幸的是,没有提供的解决方案与我尝试过的任何网站一起工作。很明显,我做错了一些事情,我想弄清楚自己疯狂之前是什么。

我当前的代码:

from requests import session 
from bs4 import BeautifulSoup as bs 

USER = 'leinad177' 
PASSWORD = '' # removed for obvious reasons 

URL = 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin' 

with session() as s: 
    login_data = {'wpName': USER, 
        'wpPassword': PASSWORD} 

    r = s.post(URL, data=login_data) 
    r = s.get('https://en.wikipedia.org/wiki/Special:Preferences') 

    print bs(r.text).find('div', {'id':'mw-content-text'}).p.text.strip() 
    # "Please log in to change your preferences." 

回答

1

你缺少一些POST参数。 wpLoginToken可能是唯一必需的。

wpLoginAttempt:Log in 
wpLoginToken:... 
wpForceHttps:1 

而且,正确的网址是:

https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login 

wpLoginToken也不是一成不变的,你将不得不在登录之前beautifulsoup解析它

如何获得令牌:

from bs4 import BeautifulSoup as bs 
import requests 

s = requests.session() 
URL = 'https://en.wikipedia.org/w/index.php?title=Special:UserLogin' 

req = s.get(URL).text 
html = bs(req) 

wp_login_token = html.find("input", {"name": "wpLoginToken"}).attrs['value'] 
+0

你能够进入更多关于检索wpLoginToken的细节吗? – Leinad177

+0

我编辑了我的帖子并添加了如何获取令牌。 –

+0

非常完美,非常感谢。 – Leinad177