如何使用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

  1. 转到所需的页面并在浏览器中打开开发人员工具(例如Chrome)
  2. 检查preserve log选项卡中的Network选项。
  3. 在页面填写凭据并按login按钮。
  4. 找出登录请求(按下按钮后)
  5. 检查请求中的Headers选项卡,找出请求类型和参数(可以使用一些查询字符串参数获取GET或使用某些Form Data进行POST
  6. 在您的代码中尝试使用简单的scrapy Request而不是FormRequest重现登录请求

以上是关于如何使用scrapy登录没有表单元素的scrapy的主要内容,如果未能解决你的问题,请参考以下文章

scrapy基础知识之 使用FormRequest.from_response()方法模拟用户登录:

Python Scrapy 验证码登录处理

单击 Scrapy 中的按钮

scrapy--模拟登陆

在 Scrapy 响应中执行内联 JavaScript

如何使用Scrapy制作Twitter Crawler? [关闭]