1

我正在尝试构建一个网络爬虫来从 MWO Mercs 中提取我的统计数据。为此,必须登录该页面,然后浏览 6 个不同的统计页面以获取数据(稍后将进入数据库,但这不是我的问题)。

下面给出了登录表单(来自https://mwomercs.com/login?return=/profile/stats?type=mech)-据我所知,有两个字段需要数据EMAILPASSWORD并且需要发布。然后它应该打开http://mwomercs.com/profile/stats?type=mech。之后,我需要有一个会话来循环浏览各种统计页面。

我曾尝试使用urllibmechanizerequests,但我完全找不到正确的答案——我更喜欢使用requests

我确实意识到在stackoverflow中已经提出了类似的问题,但我已经搜索了很长时间没有成功。

感谢您提供的任何帮助

<div id="stubPage">
    <div class="container">
        <h1 id="stubPageTitle">LOGIN</h1>
        <div id="loginForm">
            <form action="/do/login" method="post">

                <legend>MechWarrior Online <a href="/signup" class="btn btn-warning pull-right">REGISTER</a></legend>


                <label>Email Address:</label>
                <div class="input-prepend"><span class="add-on textColorBlack textPlain">@</span><input id="email" name="email" class="span4" size="16" type="text" placeholder="user@example.org"></div>

                <label>Password:</label>

                <div class="input-prepend"><span class="add-on"><span class="icon-lock"></span></span><input id="password" name="password" class="span4" size="16" type="password"></div>

                <br>
                <button type="submit" class="btn btn-large btn-block btn-primary">LOGIN</button>

                <br>
                <span class="pull-right">[ <a href="#" id="forgotLink">Forgot Your Password?</a> ]</span>

                <br>
                <input type="hidden" name="return" value="/profile/stats?type=mech">
            </form>
        </div>
    </div>
</div>
4

1 回答 1

1

提交表单数据时,Requests 文档非常简单易懂。请通读:更复杂的 POST 请求

登录通常归结为保存 cookie 并将其与未来的请求一起发送。

使用 POST 到登录页面后requests.post(),使用请求对象检索 cookie。这是一种方法:

post_headers = {'content-type': 'application/x-www-form-urlencoded'}
payload = {'username':username, 'password':password}
login_request = requests.post(login_url, data=payload, headers=post_headers)
cookie_dict = login_request.cookies.get_dict()
stats_reqest = requests.get(stats_url, cookies=cookie_dict)

如果您仍然有问题,请检查请求的返回码login_request.status_code或页面内容是否有错误login_request.text

编辑:

当您提出请求时,某些网站会多次重定向您。一定要检查request.history物体,看看发生了什么以及为什么你被弹了出来。例如,我总是收到这样的重定向:

>>> some_request.history
(<Response [302]>, <Response [302]>)

历史元组中的每一项都是另一个请求。您可以像普通请求对象一样检查它们,例如,您可以通过输入请求参数request.history[0].url来禁用重定向:allow_redirects=False

login_request = requests.post(login_url, data=payload, headers=post_headers, allow_redirects=False)

在某些情况下,我不得不在进入正确页面之前禁止重定向并添加新的 cookie。尝试使用类似这样的方法来保留现有的 cookie 并向其中添加新的 cookie:

cookie_dict = dict(cookie_dict.items() + new_request.cookies.get_dict().items())

在每次请求后执行此操作将使您的 cookie 为您的下一个请求保持最新,类似于您的浏览器的方式。

于 2013-09-09T04:25:36.943 回答