微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

完成一个非常基本的 Scrapy-Splash“执行”命令需要多长时间?

如何解决完成一个非常基本的 Scrapy-Splash“执行”命令需要多长时间?

下面的脚本包含三个 Lua 函数,这些函数执行此站点登录过程,同时尝试最大限度地减少显式等待时间以加快完成时间。该脚本旨在登录,以便我可以保存此会话并在稍后的步骤中在多个并发请求中使用它。所有这些都在起作用;然而,我最快的时间是 12 秒,平均时间在 17 秒左右。同时,手动登录并进入网站的仪表板最多需要 8 秒。根据我对每一步超时的尝试,实际的 javascript 和元素操作需要 1-2 秒,而显式等待又需要 3 秒。我尝试完全消除返回的任何数据,但没有任何影响(即使有,我需要无论如何返回的信息);我还禁用了所有可以用于渲染的媒体源和图像。我还能做些什么来尝试减少此登录所需的时间?我的结论是否有误?

function main(splash)
  splash.private_mode_enabled = false
  assert(splash:go{
    splash.args.url,headers=splash.args.headers,http_method=splash.args.http_method,body=splash.args.body,})  
  
  assert(splash:wait(1))

  --USERNAME ENTRY
  wait_for_element(splash,'#idp-discovery-username')
  local username = assert(splash:select('#idp-discovery-username'))
  username:send_text('username')
  assert(splash:wait(0))
  
  --CLICK NEXT BUTTON
  assert(splash:runjs('document.querySelector("#idp-discovery-submit").click()'))

  assert(splash:wait(2))
  
  --PASSWORD ENTRY
  wait_for_element(splash,'#okta-signin-password')
  local password = assert(splash:select('#okta-signin-password'))
  password:send_text('password')
  assert(splash:wait(0))
  
  --CLICK LOGIN BUTTON
  --local time_up_to_login_button_click = os.clock() - start_time
  assert(splash:runjs('document.body.querySelector("#okta-signin-submit").click()'))
  assert(splash:wait(0))

  assert(wait_restarting_on_redirects(splash,4,3))
  
  local entries = splash:history()
  local last_response = entries[#entries].response

  return {
    url = splash:url(),headers = last_response.headers,cookies = splash:get_cookies(),}
end

function wait_restarting_on_redirects(splash,time,max_redirects)
  local redirects_remaining = max_redirects
  while redirects_remaining > 0 do
      local ok,reason = splash:wait{time=time,cancel_on_redirect=true}
      if reason ~= 'redirect' then
          return ok,reason
      end
      redirects_remaining = redirects_remaining - 1
  end
  return nil,"too_many_redirects"
end

function wait_for_element(splash,css,maxwait)
  if maxwait == nil then
    maxwait = 3
  end
  return splash:wait_for_resume(string.format([[
    function main(splash) {
      var selector = '%s';
      var maxwait = %s;
      var end = Date.Now() + maxwait*1000;

      function check() {
        if(document.querySelector(selector)) {
          splash.resume('Element found');
        } else if(Date.Now() >= end) {
          var err = 'Timeout waiting for element';
          splash.error(err + " " + selector);
        } else {
          setTimeout(check,200);
        }
      }
      check();
    }
  ]],maxwait))
end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。