Python:使用urllib登录网站

9

我想登录这个网站:https://www.fitbit.com/login 这是我使用的代码:

import urllib2
import urllib
import cookielib

login_url = 'https://www.fitbit.com/login'
acc_pwd = {'login':'Log In','email':'username','password':'pwd'}
cj = cookielib.CookieJar() ## add cookies
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/5.0 \
                    (compatible; MSIE 6.0; Windows NT 5.1)')]
data = urllib.urlencode(acc_pwd)
try:
    opener.open(login_url,data,10)
    print 'log in - success!'
except:
    print 'log in - times out!', login_url

我使用chrome检查输入框元素,我尝试了许多密钥对,但都没有起作用。有人可以帮我看看这个网站吗?我应该将正确的数据放入我的变量acc_pwd中吗?

非常感谢。

2个回答

8

您忘记了表单的隐藏字段:

<form id="loginForm" class="validate-enabled failure form" method="post" action="https://www.fitbit.com/login" name="login">
    <input type="hidden" value="Log In" name="login">
    <input type="hidden" value="" name="includeWorkflow">
    <input id="loginRedirect" type="hidden" value="" name="redirect">
    <input id="disableThirdPartyLogin" type="hidden" value="false" name="disableThirdPartyLogin">
    <input class="field email" type="text" tabindex="23" name="email" placeholder="E-mail">
    <input class="field password" type="password" tabindex="24" name="password" placeholder="Mot de passe">
</form>

因此,您可能需要更新:

acc_pwd = {'login':'Log In',
           'email':'username',
           'password':'pwd',
           'disableThirdPartyLogin':'false',
           'loginRedirect':'',
           'includeWorkflow':'',
           'login':'Log In'
          }

这可能会被他们的服务检测到。不过,考虑到字段名称disableThirdPartyLogin,我想知道在实际执行POST之前,是否有脏JavaScript捆绑到表单的提交动作中,实际上添加了一个值。您可能需要使用开发人员工具和分析POST值来检查它。

测试看起来好像没有,但JavaScript添加了一些值,可能是从cookie中获取的:

__fp    w686jv_O1ZZztQ7FkK21Ry2MI7JbqWTf
_sourcePage tJvTQfA5dkvGrJMFkFsv6XbX0f6OV1Ndj1zeGcz7OKzA3gkNXMXGnj27D-H9WXS-
disableThirdPartyLogin  false
email   foo@example.org
includeWorkflow 
login   Log In
password    aeou
redirect    

以下是我使用 requests(比 urllib 更好的 API)完成此操作的方法:

>>> import requests
>>> import cookielib
>>> jar = cookielib.CookieJar()
>>> login_url = 'https://www.fitbit.com/login'
>>> acc_pwd = {'login':'Log In',
...            'email':'username',
...            'password':'pwd',
...            'disableThirdPartyLogin':'false',
...            'loginRedirect':'',
...            'includeWorkflow':'',
...            'login':'Log In'
...           }
>>> r = requests.get(login_url, cookies=jar)
>>> r = requests.post(login_url, cookies=jar, data=acc_pwd)

不要忘记使用get方法进入登录页面,以填充您的cookies jar!

最后,我无法再为您提供帮助,因为我在fitbit.com上没有有效账户,也不需要或想要一个。所以我只能在我的测试中访问登录失败页面。

编辑:

要解析输出,您可以使用:

>>> from lxml import etree
>>> p = etree.HTML(r.text)

例如,要获取错误消息:
>>> p.xpath('//ul[@class="errorList"]/li/text()')
['Lutilisateur nexiste pas ou le mot de passe est incorrect.']

资源:

它们都在pypi上:

pip install lxml requests

HTH


谢谢!不过接下来,我该如何使用 r 呢?我以前从未使用过 request 库。 - MacSanhe
你可以使用 r.status_code 获取状态码,使用 r.cookies 获取 cookie jar(或者你可以使用 jar),你可以使用 r.text 并将其传递给 lxmlBeautifulSoup 来帮助解析结果页面。请访问 http://python-requests.org 了解这个库有多棒 :-) - zmo
我的意思是我通常做的是:1. opener.open(login_url,data)2. 经常使用urllib2.urlopen.request(balabalabala)。所以如果我使用request登录,那么这是否意味着我必须使用request从url中提取html?我尝试了我的常规第二步,但它不起作用。 - MacSanhe
@zmo 是否需要指定所有“loginForm”参数?我问这个问题是因为例如在 eBay 上,一个简单的电子邮件+密码登录表单中有超过十几个参数 - 除了电子邮件/密码外,它们全部都是隐藏参数。他们为什么不能接收它们的默认值呢?谢谢! - golosovsky
这取决于网站的实现,可能需要也可能不需要。想要确定必须尝试有和没有两种情况,并自己看看其行为如何。你也许想要设置所有有意义的值,而不是依赖默认值,因为默认值可能会更改,而确定性对于你的实现总是更安全的。 - zmo

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接