2

我正在尝试使用 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')

我得到的只是“你没有登录”页面。我尝试使用具有相同否定结果的脚本登录另一个站点。我怀疑它要么与 cookie 有关,要么我在这里遗漏了一些非常简单的东西。但我就是找不到它。

4

5 回答 5

2

如果您检查发送到登录 URL 的原始请求(借助Charles Proxy等工具),您会看到它实际上发送了 4 个参数:wpNamewpPassword和。前 3 个是静态的,您可以随时填写它们,但第 4 个需要从登录页面的 HTML 中解析。除了其他 3 个值之外,您还需要将解析的这个值发布到登录 URL 以便能够登录。wpLoginAttemptwpLoginToken

Requests这是使用and的工作代码BeautifulSoup

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',
    #'wpLoginToken': '',
    }

with requests.session() as s:
    resp = s.get('http://en.wikipedia.org/w/index.php?title=Special:UserLogin')
    payload['wpLoginToken'] = get_login_token(resp)

    response_post = s.post('http://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login',
                           data=payload)
    response = s.get('http://en.wikipedia.org/wiki/Special:Watchlist')
于 2012-09-22T22:51:14.570 回答
2

添加这两行

r = bs(response.content)
print r.get_text()

我应该能够理解我是否已登录,对吧?我一直看到“请登录以查看或编辑您的监视列表中的项目”。但我使用的是上面给出的干净代码,以及我的登录名和密码。

错误在哪里?

于 2013-11-03T22:27:19.540 回答
2

维基百科现在强制使用 HTTPS 并需要其他参数,并且 wpLoginAttempt 变成了 wploginattempt,这里是 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')
于 2016-07-14T15:51:57.193 回答
0

您需要在Content-Type: application/x-www-form-urlencodedPOST 请求中添加标头。

于 2012-09-22T21:14:29.717 回答
0

我还添加了以下几行,发现自己没有登录。

page = response.text.encode('utf8')

if page.find('Not logged in'):
    print 'You are not logged in.  :('
else:
    print 'YOU ARE LOGGED IN!  :)'
于 2014-08-02T23:37:18.527 回答