我需要抓取需要登录的网站。我正在尝试创建一个session
并登录,因为我必须在登录后刮掉不同的页面。但是无法找出它无法正常工作的原因。
import requests
from bs4 import BeautifulSoup
login_data = {
"log":"login",
"login":"my email",
"password":"my password"
}
session = requests.session()
session.post(login_url, data=login_data)
response = session.get(url)
html = response.text
soup = BeautifulSoup(html, "html.parser")
print(soup.title.get_text())
标题显示它无效。
这是网站表单。
<form method="post" id="signin-form" class="form-horizontal">
<input type="hidden" name="referer" value="" />
<div class="form-group">
<label for="email_text" class="col-sm-4 control-label">Your login (email):</label>
<div class="col-sm-8">
<input type="email" class="form-control" id="email_text" value="" name="login" autofocus
data-validation='{"parent":".form-group","events":["keyup","blur"],"rules":[{"name":"notblank"},{"name":"email"}]}' />
</div>
</div>
<div class="form-group">
<label for="password_text" class="col-sm-4 control-label">Password:</label>
<div class="col-sm-8">
<input type="password" class="form-control" id="password_text" name="password"
data-validation='{"parent":".form-group","rules":[{"name":"min","min":5}]}' />
</div>
</div>
<div class="form-group">
<div class="col-sm-8 col-sm-offset-4">
<div class="checkbox">
<label>
<input type="checkbox" name="rememberme"> Remember me on this computer
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<button type="submit" class="btn btn-default btn-lg" name="log">Log into your account</button>
<a class="btn btn-default btn-lg mobile-show-inline-block" href="/account/create/">Create account</a>
<a href="/account/lostpassword" class="btn btn-link btn-lg">Forgot your password?</a>
</div>
</div>
</form>
N.B:不建议我使用selenium
。我可以使用selenium
执行此操作并对其进行测试,但我必须坚持使用requests
,因为selenium
会弹出控制台,即使我使用PhantomJS
。
答案 0 :(得分:3)
首先尝试登录页面。也许它设置了一些预计会出现在帖子中的cookie。
答案 1 :(得分:1)
我知道这个问题是很久以前提出的,但是无论如何,我会为仍然对此有困难的人提出解决方案: 我建议检查您要发布的表单是否接受某种隐藏的输入,问题示例就是这样做的。这非常频繁,并且有时如果我们不注意它,则有时会阻止我们登录到该站点。 因此,假设该网站中存在这样的形式:
<form method='post' id='signin-form' class='big-form'>
<input type="hidden" id="whatever" name="foo" value="check">
<input type="text" id="u" name="user">
<input type="password" id="pwd" name="pass">
</form>
在这种情况下,变量login_data
应该像这样:
login_data = {
"foo":"check",
"user":"your username",
"pass":"your password",
}
已执行此操作,并且如果网站未检查标题,则通过请求模块登录到网站应该没有问题。
答案 2 :(得分:0)
您可能遗漏了一些标题。我会拦截网络浏览器发出的请求,以查看您丢失的内容,然后将这些标题添加到您的请求中。
您可以在官方文档中找到有关如何执行此操作的信息,请点击此处:http://docs.python-requests.org/en/master/user/quickstart/#custom-headers