使用python登录网站
我正在尝试使用python脚本登录Wikipedia,但尽管遵循了说明,我还是无法让它工作使用python登录网站,python,authentication,cookies,login,Python,Authentication,Cookies,Login,我正在尝试使用python脚本登录Wikipedia,但尽管遵循了说明,我还是无法让它工作 import urllib import urllib2 import cookielib username = 'myname' password = 'mypassword' cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) opener.addheaders = [(
import urllib
import urllib2
import cookielib
username = 'myname'
password = 'mypassword'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6")]
login_data = urllib.urlencode({'wpName' : username, 'wpPassword' : password})
opener.open('http://en.wikipedia.org/w/index.php?title=Special:UserLogin', login_data)
resp = opener.open('http://en.wikipedia.org/wiki/Special:Watchlist')
我得到的只是“你没有登录”页面。我尝试使用脚本登录到另一个站点,但结果相同。我怀疑这要么和饼干有关,要么我错过了一些非常简单的东西。但是我就是找不到它。您需要在POST请求中添加标题
内容类型:application/x-www-form-urlencoded
。如果您检查发送到登录URL的原始请求(借助诸如的工具),您将看到它实际上发送了4个参数:wpName
,wpPassword
,wplginattest
和wplgintoken
。前3个是静态的,您可以随时填写,但第4个需要从登录页面的HTML中解析。除了其他3个值之外,您还需要将解析的这个值发布到登录URL才能登录
以下是使用和的工作代码:
将这两行相加
r = bs(response.content)
print r.get_text()
我应该能够理解我是否登录了,对吗?我一直看到“请登录查看或编辑您的观察列表上的项目。”但我使用的是上面给出的干净代码,以及我的登录名和密码
错误在哪里?我还添加了以下行,并认为自己未登录
page = response.text.encode('utf8')
if page.find('Not logged in'):
print 'You are not logged in. :('
else:
print 'YOU ARE LOGGED IN! :)'
Wikipedia现在强制使用HTTPS并需要其他参数,而wploginattent变成了wploginattent,以下是KZ初始答案的更新版本:
import requests
from bs4 import BeautifulSoup as bs
def get_login_token(raw_resp):
soup = bs(raw_resp.text, 'lxml')
token = [n.get('value', '') for n in soup.find_all('input')
if n.get('name', '') == 'wpLoginToken']
return token[0]
payload = {
'wpName': 'my_username',
'wpPassword': 'my_password',
'wploginattempt': 'Log in',
'wpEditToken': "+\\",
'title': "Special:UserLogin",
'authAction': "login",
'force': "",
'wpForceHttps': "1",
'wpFromhttp': "1",
#'wpLoginToken': '',
}
with requests.session() as s:
resp = s.get('https://en.wikipedia.org/w/index.php?title=Special:UserLogin')
payload['wpLoginToken'] = get_login_token(resp)
response_post = s.post('https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login',
data=payload)
response = s.get('https://en.wikipedia.org/wiki/Special:Watchlist')
登录网站时,请尝试使用WireShark或类似工具检查所有数据包,您可以在其中查看web应用程序实际发送到服务器的内容。您可以使用
live http header firefox
或chrome developer tools
查看单击登录按钮后发送的所有请求。如我所见,您在login\u data
.Hmm中缺少一些内容,这意味着我需要先获得一个令牌,并将其与我的用户名和密码一起发送?@Conti这是正确的,您需要以某种方式解析该令牌。我在下面的例子中使用了BeautifulSoup。太棒了,这就成功了!非常感谢。:)我已经在使用BeautifulSoup进行解析,但我不知道请求。它看起来比urllib平滑得多。从现在开始,我将使用它。@Conti很乐意提供帮助,是的请求
非常棒:)@KayZhu-将[]访问方法切换到.get(),以允许不存在的属性;具体地说,有些表单不会将“name”属性分配给所有输入元素,因此n.get('name','')
在处理这些属性时不会抛出keymessing异常
import requests
from bs4 import BeautifulSoup as bs
def get_login_token(raw_resp):
soup = bs(raw_resp.text, 'lxml')
token = [n.get('value', '') for n in soup.find_all('input')
if n.get('name', '') == 'wpLoginToken']
return token[0]
payload = {
'wpName': 'my_username',
'wpPassword': 'my_password',
'wploginattempt': 'Log in',
'wpEditToken': "+\\",
'title': "Special:UserLogin",
'authAction': "login",
'force': "",
'wpForceHttps': "1",
'wpFromhttp': "1",
#'wpLoginToken': '',
}
with requests.session() as s:
resp = s.get('https://en.wikipedia.org/w/index.php?title=Special:UserLogin')
payload['wpLoginToken'] = get_login_token(resp)
response_post = s.post('https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login',
data=payload)
response = s.get('https://en.wikipedia.org/wiki/Special:Watchlist')