Python 请求无法登录

Posted

技术标签:

【中文标题】Python 请求无法登录【英文标题】:Python requests fails to log in 【发布时间】:2018-02-15 13:48:28 【问题描述】:

我很欣赏你在这里所做的事情。通常我可以在 *** 的帮助下找出我的问题,但这次我被卡住了。希望你能帮助我!

问题很简单:如何使用Python的请求登录this webpage?

我的步骤:

    获取登录地址 提供登录详细信息。根据 html,我需要提供“电子邮件”和“密码”。 创建会话并使用 post 登录 如果登录成功则检查 HTML

不幸的是,在这种情况下,简单的方法似乎不起作用。比如details的输出是:

<script>
    dataLayer = [
        'environment': 'production',
        'loggedIn': '0',
        'userCode': '',
        'rank': '',
        'totalBalance': '0',
        'overAgeCasino': '0'
    ];
</script>

显然,如果登录成功,'loggedIn' 中的'0' 应该更改为'1'

在一个示例中,我发现您可能必须添加一个“csrftoken”,并且可以在 HTML 中将其作为“隐藏”类型找到。但是,type='hidden' 部分中的名称似乎与此无关,也没有任何价值(link to screenshot of HTML)。 我在其他地方读到 CSFR 令牌也存储在 CookieJar 中,但它不存在:

<RequestsCookieJar[<Cookie phpSESSID=5dib6cf6kpvf29dsn725ljcec7 for .napoleongames.be/>, <Cookie locale=en_GB for .napoleongames.be/>, <Cookie user=false for .napoleongames.be/>]>

我很难相信无法登录,但我已经没有想法了。如果有人知道如何用 urllib(2) 来做,它也很有用。我宁愿不使用 Selenium,因为我无法顺利运行它。

代码:

 import requests
    from bs4 import BeautifulSoup
    from datetime import date

date_str = str(date.today())
login_url = 'https://en-gb.sports.napoleongames.be/user/login'
protected_url = 'proctected_url'

payload = 'email': 'address@example.com',
           'password': '*********'

with requests.Session() as session:
    session.get(login_url)
    login_page = session.post(login_url,
                          data=payload)

    html_body = BeautifulSoup(login_page.content, 'html.parser').find(
        name='body', attrs='id': 'user_login')
    details = html_body.findAll('script')[0]
    page = session.get(protected_url)

标题:

'Date': 'Wed, 06 Sep 2017 23:45:52 GMT', 'Server': 'Apache', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'Cache-Control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Pragma': 'no-cache', 'X-Frame-Options': 'SAMEORIGIN', 'X-Cache-Page': 'MISS', 'Set-Cookie': 'locale=en_GB; Expires=Mon, 05-Mar-2018 23:45:52 GMT; Domain=.napoleongames.be; Path=/, user=false; expires=Mon, 05-Mar-2018 23:45:52 GMT; Max-Age=15552000; path=/; domain=.napoleongames.be, loyalty=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.napoleongames.be', 'Strict-Transport-Security': 'max-age=15768000', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '10840', 'Connection': 'close', 'Content-Type': 'text/html'

【问题讨论】:

不幸的是,许多现代网站框架广泛依赖于 javascript,当然请求无法处理。如果您的工作需要您定期抓取现代网页,我强烈建议您习惯 selenium,它非常棒,可以轻松解决此类问题。 @DanielleM。有一些方法可以处理带有请求的 javascript。 Link @DanielleM。不,这只是为了好玩。我需要弄清楚使用 Selenium 时发生的错误。首先我遇到了一个路径问题,解决方案是降级,但随后 geckodriver 出现问题,然后推荐的解决方案是升级,因此我专注于请求 【参考方案1】:

提交表单时,您应该考虑表单标签内的其他字段,而不仅仅是您需要填写的字段。在这种情况下,当您查看页面源代码时,会在登录时填充另外一个字段。

您可以尝试将其添加到您的有效负载中:

payload = 'email': 'address@example.com',
           'password': '*********'
           'buttons_app_service_user_login[buttonClicked]': 'buttons_app_service_user_login-save'

让我知道这是否有效或您是否遇到其他问题。

【讨论】:

成功,非常感谢!所以关键是使用'id'而不是'value'(它是空的) 是的,初始加载时该值为空,当您尝试使用空的用户名和密码提交登录表单时,您会看到该值正在填充。

以上是关于Python 请求无法登录的主要内容,如果未能解决你的问题,请参考以下文章

无法打开登录请求的数据库“测试”。登录失败。用户 'xyz\ASPNET' 登录失败

实体框架无法打开登录请求的数据库 - 用户登录失败

使用 facebook 登录显示错误为不受支持的请求并且无法登录

无法打开登录请求的数据库“”。登录失败。用户“sa”登录失败

无法打开登录请求的数据库“ASPNETDB”。登录失败。用户 'Philip-Desktop\Philip' 登录失败

无法打开登录请求的数据库“ABC”。登录失败