V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuegj1010
V2EX  ›  程序员

Python +selenum 自动化获取的网页不是 js 渲染之后的

  •  
  •   xuegj1010 · 2018-07-10 17:08:41 +08:00 · 2200 次点击
    这是一个创建于 2330 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 selenium 请求网页,登陆之后返回的是一段 js,并不是渲染之后的页面,body 里面一个元素都没有,请问该怎么解决 下面是返回的源码

    <HTML><HEAD>
    <SCRIPT src="/prpall/common/pub/UICommon.js"></SCRIPT>
    
    <SCRIPT language=javascript>
    
    
        var riskCodeCount = 291;
        var riskCodes = new Array();
    
    	  riskCodes[0] = new Array('01', '0101', '财产基本保险');
    
    	  riskCodes[1] = new Array('01', '0102', '财产综合保险');
    
    	  riskCodes[2] = new Array('01', '0104', '财产一切险');
    
    
        var classCodeArrays = new Array();
    
    	  classCodeArrays[0] = new Array('01', '企业财产保险');
    
    	  classCodeArrays[1] = new Array('02', '货运保险');
    
    	  classCodeArrays[2] = new Array('03', '普通家财保险');
    
    
    
      	var comCodeArrays = new Array() ;
    
                comCodeArrays[0] = new Array('2320000000', '江苏分公司');
    
                comCodeArrays[1] = new Array('2320100000', '南京分公司');
    
                comCodeArrays[2] = new Array('2320101000', '南京市江宁支公司');
    
    
      try
      {
        parent.document.frames("fraTitle").loadPageForSubmit(riskCodeCount,riskCodes,'01');
    
        parent.document.frames("fraTitle").loadClassForm(14,classCodeArrays);
        parent.document.frames("fraTitle").loadComCode(comCodeArrays);
    
        parent.document.frames("fraTitle").setTitleInfo("王婧嫣","江苏分公司","0101");
        parent.document.frames("fraTitle").setOptionClassCode("01");
    
        parent.document.frames("fraTitle").setOptionRiskCode("0101");
        parent.document.frames("fraTitle").setOptionComCode(2320000000);
        parent.document.frames("fraTitle").controlShow(false,true);
    
    
    
        top.fraTop.rows = "0,0,82,*";
        if(1==0)
        {
          parent.document.frames("fraTitle").setComCode("2320000000");
          parent.document.frames("fraTitle").spanCom.style.display = "";
          parent.document.frames('fraTitle').spanComCode.style.display = "none";
          parent.document.frames('fraTitle').spanComCode1.style.display = "none";
        }
        else
        {
          parent.document.frames("fraTitle").spanCom.style.display = "none";
        }
        var strTemp = "<img class=button name='menuPowerImage' src='/prpall/common/images/butHide.gif' onClick='showHideFrame();'>";
        parent.document.frames('fraTitle').spanMenuPowerImage.innerHTML = strTemp;
        if(parent.fraSet.cols=="0%,*")
        {
          parent.document.frames('fraTitle').showHideFrame();
        }
    
        parent.fraRight.cols = "*";
        parent.fraRight.rows = "100%,0%,*";
        //非车险的 UICodeGet.jsp
        parent.fraCode.window.location = "/prpall/commonship/pub/UICodeGet.jsp"; //用 commship 下面的 codeget
        parent.fraMenu.window.location = "/prpall/commonship/pub/UIMenuShip.jsp";
    
      }
      catch(e)
      {
      }
    </SCRIPT>
    </HEAD>
    <BODY></BODY></HTML>
    
    16 条回复    2018-07-12 12:44:31 +08:00
    xuegj1010
        1
    xuegj1010  
    OP
       2018-07-10 17:17:06 +08:00
    代码太长了截取了一部分,请问这段代码是什么意思,怎样才能获取我想要的 dom 元素呢?
    gitopen
        2
    gitopen  
       2018-07-10 18:06:18 +08:00 via Android
    用 selenium 把滚动条拖到页面最底部,页面就渲染了
    xuegj1010
        3
    xuegj1010  
    OP
       2018-07-10 18:13:07 +08:00
    @gitopen 没有滚动条啊
    jimmyczm
        4
    jimmyczm  
       2018-07-10 18:50:18 +08:00
    js 加密貌似就会这样
    ex2vkf
        5
    ex2vkf  
       2018-07-10 19:17:48 +08:00 via iPhone
    用 scrapy-splash
    xuegj1010
        6
    xuegj1010  
    OP
       2018-07-10 20:34:52 +08:00
    @jimmyczm 公司自己的系统,给自己用的,没有必要加密吧?明天去问问开发。项目刚启动就就掉坑里了,呵呵
    xuegj1010
        7
    xuegj1010  
    OP
       2018-07-10 20:42:56 +08:00
    @ex2vkf 亲,不是写爬虫啊,自动化测试,splash 不好用吧
    xiaqi
        8
    xiaqi  
       2018-07-11 07:47:57 +08:00 via Android
    看上面代码,应该是个 iframe。



    你用的哪个 driver ?
    用 chrome 或 firefox 应该不会有问题呀。
    xuegj1010
        9
    xuegj1010  
    OP
       2018-07-11 10:38:52 +08:00
    @xiaqi 公司的项目比较老,只能在 ie 上面跑,所以用的是 IEDriverServer.exe 和 phantomjs.exe ,最终是要用 phantomjs.exe ,这两个驱动返回的结果都是上面的 js。所以比较郁闷。这段代码应该是会生产一个用于操作的菜单,ie 浏览器中可以显示,但是我用 selenium 看不到 frame。。。
    xuegj1010
        10
    xuegj1010  
    OP
       2018-07-11 10:39:58 +08:00
    @xiaqi 用不了 chrome 和 firefox
    xiaqi
        11
    xiaqi  
       2018-07-11 21:33:55 +08:00 via Android
    @xuegj1010 额,这样好像不是很好讨论,来我群:717924460
    xuegj1010
        12
    xuegj1010  
    OP
       2018-07-12 10:06:21 +08:00
    @xiaqi 已加,麻烦同意一下
    xuegj1010
        13
    xuegj1010  
    OP
       2018-07-12 10:14:08 +08:00
    ![avatar]( https://note.youdao.com/yws/api/personal/sync ? method=download&fileId=WEB1d79c8da188730ba773fe359955cad99&version=2640&cstk=bOiTnvTt)
    xuegj1010
        15
    xuegj1010  
    OP
       2018-07-12 10:19:26 +08:00
    上面的图片好像可以用,登陆前后用 F12 查看 html 结构是一样的,但是用 selenium 请求回来的页面却是上面的 js 代码。请问该怎么解决?
    xuegj1010
        16
    xuegj1010  
    OP
       2018-07-12 12:44:31 +08:00
    问题已经解决,登陆之后需要切换一下,driver.switch_to.default_content()就可以找到对应的页面了,感谢各位的回答。谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2261 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:12 · PVG 00:12 · LAX 08:12 · JFK 11:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.