我正在尝试构建一个网络爬虫来从 MWO Mercs 中提取我的统计数据。为此,需要登录该页面,然后浏览 6 个不同的统计页面以获取数据(稍后将进入数据库,但这不是我的问题)。
登录表单如下(从https://mwomercs.com/login?return=/profile/stats?type=mech)-来看,有两个字段需要数据EMAIL和PASSWORD并且需要发布。它应该然后打开 http://mwomercs.com/profile/stats?type=mech 。之后我需要一个 session 来循环浏览各种统计页面。
我尝试过使用 urllib、mechanize 和 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>
最佳答案
在提交表单数据时,请求文档非常简单且易于遵循。请仔细阅读: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/