Python 请求:网站返回状态后无法识别登录<200>

问题描述 投票:0回答:1

我正在尝试从 letterboxd.com 获取电影信息,但是当我尝试获取我想要使用的页面的 HTML 时,我得到的 HTML 与我的浏览器不同。所以,我尝试通过

requests
Session
登录。但即使从响应中获得 <200> 状态后,我在页面上执行的任何 GET 都无法识别我的凭据(这也不会更改我获得服务的 HTML)。

我已经验证我的 User-Agent 标头与浏览器提供的相同(所有其余标头都是

requests
默认值),并查看 HTML 以确保我提供了所有必需的信息。我肯定错过了什么。以下是网站
<form>
部分的 HTML:

<form method="post" action="#" id="signin" class="signin signin-form js-header-signin-form js-signin" data-url="/user/login.do" data-recaptcha-action="signin" novalidate='novalidate' autocorrect='off' autocapitalize='off'>
    <input type="hidden" name="__csrf" value="placeholder" />
    <input type="hidden" name="authenticationCode" value="" />
    <fieldset class="fieldset">
        <div class="fields">
            <div class="col">
                <label for="username">Username</label>
                <input type="email" name="username" id="username" class="field signin-field" tabindex="1" data-focus-control="signingIn" autocomplete='email' inputmode='email' value="" />
            </div>
            <div class="col">
                <label for="password">Password</label>
                <input type="password" name="password" id="password" class="field signin-field" tabindex="2" autocomplete='current-password' value="" />
            </div>
            <div class="signin-actions">
                <label for="remember" class="option-label -checkbox -small">
                    <input type="checkbox" name="remember" id="remember" class="checkbox" tabindex="3" value="true" /><i class="substitute"></i>
                    <span class="focus">Remember<span class="mob-hide"> me</span></span>
                </label>
                <p class="reset" tabindex="5"><a class="reset-password-link" href="/user/request-password-reset" target="_top">Forgotten<span class="elongated"> username or password</span>?</a></p>
            </div>
            <div class="col buttons">
                <div class="button-container"><input type="submit" value="Sign in" class="button -action button-green" tabindex="4" /><i></i></div>
                <div class="close js-close-signin">&times;</div>
            </div>
        </div>
    </fieldset>
    <div id="signin-message" class="errormessage"></div>
</form>

由此我尝试找到POST的相关数据,并编写了如下代码:

user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"    # from browser

login = {'__csrf': 'a0b859246d2044858517',     # from Chrome Inspector, after login
         'authenticationCode': '',             # this was left null in browser
         'username': 'my_user',                # from name='username' in an <input> element
         'password': 'my_pass',                # from name='password'
         'remember': 'true',                   # from name='remember'
         'submit':   'Sign In'}                # from type='submit'

with requests.Session() as s:
    s.headers['User-Agent'] = user_agent

    p = s.post("https://letterboxd.com/user/login.do",   # from data-url member in <form> element
               data=login,
               auth=('my_user', 'my_pass'))

    print(p.status_code)

这段代码的输出是

200
。然而,当我在同一会话中获取主页时,响应 HTML 中的 JS 脚本表明我“未”登录,特别是在这一行中: analytic_params['user_type'] = 'Visitor';

requests
登录后,此内容保持不变。在我的浏览器中,登录后该行显示如下:

analytic_params['user_type'] = 'Member';

我一定缺少一些身份验证,或者一些简单的东西。我对此很陌生,所以洞察力会很有帮助!
    

用户 GTK 给出的答案是,Letterboxd 使用 Ajax 加载其数据,这会更改浏览器中的 URL。问题不在于登录凭据(也许并不奇怪)。从我的目标
html python-3.x web-scraping python-requests
1个回答
0
投票
(尽管最小)获取电影信息所需的全部内容是使用以下 URL:

https://letterboxd.com/films/ajax/popular/page/1

/ajax/
 是添加的全部内容)。这仅提供图像、标题和各个电影页面的链接,但这足以获取您可能想要的所有其余信息。
	

© www.soinside.com 2019 - 2024. All rights reserved.