javascript - Scrapy 飞溅登录

标签 javascript python scrapy

我曾经使用启动表单请求登录其中一个站点。但是,开发人员更改了它,添加了更多 javascript,我无法弄清楚我做错了什么。我添加了 javascript,它也在该站点中使用。

class MySpider(scrapy.Spider):
name = "lost"
start_urls = ["mysite",]                  ###########changed main loggin form

def start_requests(self):

    for url in self.start_urls:
     yield SplashRequest(
      url, 
      self.parse, 
      args={'wait': 1},
     )

def parse(self, response):
    return SplashFormRequest.from_response(
        response,  
        formdata={'mail': 'mymail', 'pass': 'mypasswd'},
        callback=self.after_login
    )


def after_login(self,response):
    print('This is body '+response.body+' The end of body')
    ### Going to film list ######
    if "Username" in response.body:
        self.logger.error("##Success##")

Javascript:

$(document).ready(function(){
    $('input[name="mail"],input[name="pass"]').keydown(function (e)
    {
        if(e.keyCode == 13)
        {
            login();
        }
    });
});
function login()
{
    mail = $('input[name="mail"]').val();
    pass = $('input[name="pass"]').val();
    if($('input[name="rem"]:checked').length)
        rem = 1;
    else
        rem = 0;
    if(mail.length && pass.length > 5)
    {
        metrikaEvents('LOGIN');
        console.log('OK!');
        $.ajax({
                    type: "POST",
                    url: "/ajaxik.php",
                    dataType : "json",
                    data: 
                    {
                        act:'users',
                        type:'login',
                        mail:encodeURIComponent(mail),
                        pass:encodeURIComponent(pass),
                        rem:encodeURIComponent(rem)
                     },
                    success: function(msg)
                    {
                        if(msg.result == 'ok')
                        {
                            if(msg.error)
                            {
                                switch(msg.error)
                                {
                                    default:
                                        text =   lf_config.errors.user.login_error;
                                    break;
                                }
                                ntfctn(text,'error');
                            }
                            else if(msg.success)
                            {
                              ntfctn(msg.name+lf_config.notifications['user_login'],'information');
                                setTimeout('goTo("/",false)',1000);
//                              goTo('/',false);
                            }
                        }
                    },
        });
    }
}
function loginTogglePass(t)
{
    if($('input[name="'+t+'"]').attr('type') == 'password')
    {
        $('input[name="'+t+'"]').attr('type','text');
        $('input[name="'+t+'"]').prev('div.eye-  icon').removeClass('closed').addClass('opened');
    }
    else
    {
        $('input[name="'+t+'"]').attr('type','password');
        $('input[name="'+t+'"]').prev('div.eye-icon').removeClass('opened').addClass('closed');
    }
}

我看到 javascript 正在寻找“enter”键。但点击按钮也应该有效。谁能把我引向正确的方向?谢谢

最佳答案

借用这个主题的想法

enter Scrapy + splash: can't select element

代替使用 formdata 登录,使用 splash 并逐个检测页面的元素

class MySpider(scrapy.Spider):
name = "lost"
allowed_domains = ["mydomain"]
start_urls = ['myurl']
req = 10
series = {}





def start_requests(self):                               
    script = """
    function main(splash)
        local url = splash.args.url
        assert(splash:go(url))
        assert(splash:wait(10))

        splash:set_viewport_full()

        local search_input = splash:select('input[name=mail]')   
        search_input:send_text("email")
        local search_input = splash:select('input[name=pass]')
        search_input:send_text("password")
        assert(splash:wait(5))
        local submit_button = splash:select('input[class^=primary-btn]')
        submit_button:click()

        assert(splash:wait(10))

        return {
            html = splash:html(),
            png = splash:png(),
        }
      end
    """
    yield SplashRequest(
        'myurl',
        callback = self.after_login,      ###inserting callabck
        endpoint='execute',
        args={
        'lua_source': script,
        'ua': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"
        }
                        )

def parse(self, response):
    script = response.body

关于javascript - Scrapy 飞溅登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41989252/

相关文章:

javascript - 在兄弟组件需要通信的地方构建 ReactJS 组件

JavaScript 对数组元素进行分类并输出为 HTML

Python/Scrapy : yield request without callback

python - 如何在scrapy中配置每个类中记录器的文件名?

python - Scrapy:爬虫不爬行

javascript - 如何仅删除包含此内容的第一个单词?

javascript - 无法在 mozilla firefox 中对新窗口使用 .print()

python - 将 Numpy 数组映射到字符列表

python - 在 python 代码和 c++ 代码 (IPC) 之间共享信息

python - 我有一个 pytorch 图像分类器训练,我想暂停训练并在程序暂停时保存权重。我可以这样做吗?