如何使用scrapy登录没有表单元素的scrapy

时间:2018-05-27 08:18:50

标签: python 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

1 个答案:

答案 0 :(得分:2)

Web抓取是关于请求和响应,因此您只需模拟所有用户请求。 FormRequest只是帮助我们避免使用表单进行额外的工作。在这种情况下,您需要正确登录Request

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