python - 用python登录网页爬取数据

标签 python forms authentication https python-requests

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

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

我尝试过使用 urllibmechanizerequests 但我完全无法找到正确的答案 - 我更愿意使用请求

我确实意识到 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>

最佳答案

在提交表单数据时,请求文档非常简单且易于遵循。请仔细阅读:More Complicated POST requests

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

使用 requests.post() POST 到登录页面后,使用 request 对象检索 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 为您的下一个请求保持最新状态,类似于浏览器的方式。

关于python - 用python登录网页爬取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18519698/

相关文章:

python - 我可以像分类一样进行线性回归预测吗?

php - 使用 PHP 的 JavaScript 表单验证不发送电子邮件

authentication - Google 如何管理多个域之间的身份验证?

javascript - JavaScript 生成的 SVG 中的外部对象

svn - SVN客户端在哪里存储用户认证数据?

javascript - laravel:非 Laravel 页面上的登录表单

python - 按特定字段对文件进行排序

python - 从兄弟目录导入模块以与 py.test 一起使用

python - Python 中的引用分配 - 为什么值没有改变?

Django:ModelChoiceField 删除默认值 --------- 选择