如何使用scrapy登录没有表单元素的scrapy
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用scrapy登录没有表单元素的scrapy相关的知识,希望对你有一定的参考价值。
我尝试登录一些网站,但似乎他们不使用表单来显示登录对话框。因此,当使用FormRequest时,我收到了错误
raise ValueError("No <form> element found in %s" % response)
那么如何在这种情况下使用scrapy登录?
我试图在这个网站上找到一个表单元素(使用带有xpath //表单的chrome devtool)但结果为零
它的登录元素是
<div class="loginModalBody">
<div class="coverLoginModal">
<p class="loginModalTitle">Login </p>
<div class=""><p class="login-msg"></p></div>
<!-- Email -->
<div class="loginCoverInputText">
<input class="loginInputText" id="email-login" role="presentation" autocomplete="off" type="email" name="loginEmail" placeholder="E-mail">
<span class="loginNameInputText">E-mail</span>
<span class="loginLineInputText"></span>
<!-- Error email -->
<div class="dontEnterEmail loginErrorInput"><p class="loginError">Vui lòng nhập email<span class="loginIconError"></span></p></div>
<div class="loginEmailInvalid loginErrorInput"><p class="loginError">Invalid email<span class="loginIconError"></span></p></div>
</div>
<!-- Password -->
<div class="loginCoverInputText">
<input class="loginInputText" id="password-login" autocomplete="new-password" type="password" name="loginPassword" placeholder="Password">
<span class="loginNameInputText">Password</span>
<span class="loginLineInputText"></span>
<!-- Error password -->
<div class="dontEnterPassword loginErrorInput"><p class="loginError">Enter password<span class="loginIconError"></span></p></div>
</div>
<!-- Remember password -->
<label class="loginRememberPassword" id="login-remember-pass" for="loginRememberPassword"><input id="loginRememberPassword" type="checkbox" name="loginRememberPassword"><span></span>Ghi nhớ mật khẩu</label>
<p class="loginForgotPassword forgot-password"> <a href="javascript:void(0)" data-dismiss="modal"><span></span>forgot pass</a></p>
<button class="loginButtonSubmit btn-login" id="btn-login-system" type="button">Login</button>
<p class="loginDontAccount">Do not have account? <a class="not-account" href="javascript:void(0)" data-dismiss="modal" data-toggle="modal" data-target="#modal-signup-system">Register!</a></p>
<p class="loginOr">Or</p>
<button type="button" class="loginByGoogle" onclick="open_login_g()">Login with Google</button>
<button type="button" class="loginByFacebook" onclick="open_login_f()">Login with Facebook</button>
</div>
</div>
我使用的代码是
class Spider(scrapy.Spider):
name = "card"
start_urls = ["https://website/auth/signin"]
login_user = "foo"
login_pass = "bar"
def parse(self, response):
'''Parse login page'''
open_in_browser(response)
return FormRequest.from_response(
response,
formdata={
'email':"username",
'password': "pass"
},
callback=self.parse_home
)
def parse_home(self, response):
open_in_browser(response)
print response
答案
Web抓取是关于请求和响应,因此您只需模拟所有用户请求。 FormRequest
只是帮助我们避免额外的表格工作。在这种情况下,您需要正确登录Request。
- 转到所需的页面并在浏览器中打开开发人员工具(例如Chrome)
- 检查
preserve log
选项卡中的Network
选项。 - 在页面填写凭据并按
login
按钮。 - 找出登录请求(按下按钮后)
- 检查请求中的
Headers
选项卡,找出请求类型和参数(可以使用一些查询字符串参数获取GET或使用某些Form Data
进行POST - 在您的代码中尝试使用简单的scrapy Request而不是
FormRequest
重现登录请求
以上是关于如何使用scrapy登录没有表单元素的scrapy的主要内容,如果未能解决你的问题,请参考以下文章