zoukankan      html  css  js  c++  java
  • selenium js

      这几天的任务量比较大,还有一个挺棘手的网站cfda,不巧的是数据量还挺大,40W关于企业信息。上来就是debugger pause,调试中断,开始还是挺懵逼的,但这个还算简单毕竟google,百度,就能解决。经过初步的分析,有一个难点,关于跨网页,一个字串,以及cookies是一个网页一变,要解决这个问题,其实就是去读懂js,node 或者自己python实现,虽然是可以实现,但肯定是需要花一些时间的,那不如直接selenium上手搞起来,毕竟能解决问题的方法就是好方法。

      其实,cfda还是挖了一些坑的,在浏览器检测机制,因为一直用chrome比较顺手,也就用chromedriver比较多一点,这下一上来就奇怪了,点击之后返回数据为空,这明显是被发现了。但又是哪里暴露了呢?

    browser.find_element_by_css_selector("#content table a:nth-child(1)").click()
    

      直接点击既然不行,那么会不会是需要鼠标悬停,然后再点击。那么就祭出原生js,考验我js功底的时候到了

    go_detail_js = "var div=document.getElementById('content');" 
                           "var c=div.getElementsByTagName('a')[1].click();"
    browser.execute_script(go_detail_js)
    

      这里复习一遍原生js选择元素的语法

    document.getElementById("domId")
    document.getElementsByName("domName")
    document.getElementsByTagName("tagName")
    document.getElementsByClassName("classNames")
    

      然而实际上问题并不是出在鼠标点击事件上面。。。。而是检测到了chromedriver,于是使用FireFox解决了这个问题。

      但最大的收获点不是这个,因为可利用的资源要尽可能的利用起来,与我们公司的前端讨论了一下这个问题,前端给出了一种更激动人心的写法,以至于我都不需要去写查找元素的js代码。只需要去寻找传递数据的js函数即可

    go_page_js = 'location.href="javascript:devPage(%s)";' % page
    
    return_list_js = 'location.href = "javascript:viewList();"'
    
    browser.execute_script(go_page_js)
    

      本身在浏览器控制台即可执行这些语句,果然前端教做人,毕竟使坏的都是这些前端啊。

    还有一些注意点就是time.sleep需要等待页面加载完成后,才能获取page_source,以及异常处理,毕竟直接在浏览器上运行这些js代码,天有不测风云,总有出错的时候,这里需要在遇上这些情况的时候加上那么一句browser.refresh().

      这样就万事大吉了,速度嘛,肯定比requests慢点,但是多进程就可以解决这个问题。

      

  • 相关阅读:
    优化网站性能之数据库架构篇
    使用 P3P 规范让 IE 跨域接受第三方 cookie
    使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
    将代码库从 SVN 迁移至 Git 并保留所有 commit 记录
    如何高效利用GitHub
    Mysql bin-log日志文件处理
    man手册页
    glibc/libc/blib区别
    列式数据库的简单分析
    Linux中如何设置服务自启动?
  • 原文地址:https://www.cnblogs.com/zenan/p/9892174.html
Copyright © 2011-2022 走看看