+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2021-03-02 16:00     阅读(720)     评论(0)     点赞(11)     收藏(2)


0

1

2

3

4

5

6

7

8

下面的脚本包含三个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();
    }
  ]], css, maxwait))
end

解决方案


暂无回答

0

1

2

3

4

5

6

7



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/869966/75e61b05016831cb0cc7/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

11 0
收藏该文
已收藏

评论内容:(最多支持255个字符)