Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python登录网站_Python_Authentication_Cookies_Login - Fatal编程技术网

使用python登录网站

使用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 = [(

我正在尝试使用python脚本登录Wikipedia,但尽管遵循了说明,我还是无法让它工作

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')