乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python selenium的js擴(kuò)展實(shí)現(xiàn)

       看見就非常 2015-09-18

      python寫的數(shù)據(jù)采集,對(duì)一般有規(guī)律的頁(yè)面用 urllib2 + BeautifulSoup + 正則就可以搞定。 但是有些頁(yè)面的內(nèi)容是通過js生成,或者通過js跳轉(zhuǎn)的,甚至js中還加入幾道混淆機(jī)制;對(duì)這種涉及頁(yè)面腳本解析的內(nèi)容,前面的方式便很無力。

      這時(shí)我們需要能解析、運(yùn)行js的引擎——瀏覽器,而python selenium能提供程序與瀏覽器的交互接口,再加上phantomjs這個(gè)可以后臺(tái)運(yùn)行的瀏覽器,即使用 selenium + phantomjs 便可以解決以上的問題。

      selenium可以操作頁(yè)面的元素,并且提供執(zhí)行js腳本的接口。但其調(diào)用js腳本后并不能直接返回執(zhí)行的結(jié)果,這樣再采集內(nèi)容的過程中就會(huì)受到一些限制。 比如我們想使用頁(yè)面中的函數(shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換,或者獲取iframe里的內(nèi)容,這些js產(chǎn)生數(shù)據(jù)要傳回比較麻煩。

      所以我便寫一個(gè)簡(jiǎn)化js數(shù)據(jù)回傳的擴(kuò)展 exescript.py

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      #
      # created by heqingpan
      
      _init_js="""
      (function (){
      if (window.__e)
      { return;
      }
      var e=document.createElement('div');
      e.setAttribute("id","__s_msg");
      e.style.display="none";
      document.body.appendChild(e);
      window.__e=e;
      })();
      window.__s_set_msg=function(a){
          window.__e.setAttribute("msg",a.toString()||"");
      }
      """
      _loadJsFmt="""
      var script = document.createElement('script');
      script.src = "{0}";
      document.body.appendChild(script);
      """
      _jquery_cdn="
      _warpjsfmt="__s_set_msg({0})"
      
      class ExeJs(object):
          def __init__(self,driver,trytimes=10):
              from time import sleep
              self.driver=driver
              driver.execute_script(_init_js)
              while trytimes >0:
                  try:
                      self.msgNode=driver.find_element_by_id('__s_msg')
                      break
                  except Exception:
                      sleep(1)
                      trytimes -= 1
              if self.msgNode is None:
                  raise Exception()
          def exeWrap(self,jsstr):
              """ jsstr 執(zhí)行后有返回值,返回值通過self.getMsg()獲取 """
              self.driver.execute_script(_warpjsfmt.format(jsstr))
          def loadJs(self,path):
              self.execute(_loadJsFmt.format(path))
          def loadJquery(self,path=_jquery_cdn):
              self.loadJs(path)
          def execute(self,jsstr):
              self.driver.execute_script(jsstr)
          def getMsg(self):
              return self.msgNode.get_attribute('msg')
      
      

      打開ipython上一個(gè)例子,獲取博客園首頁(yè)文章title列表

      from selenium import webdriver
      import exescript
      
      d=webdriver.PhantomJS("phantomjs")
      d.get(")
      exejs=exescript.ExeJs(d)
      exejs.exeWrap('$(".post_item").length')
      print exejs.getMsg()
      #out: 
      """
      20
      """
      
      jsstr="""(function(){
      var r=[];
      $(".post_item").each(function(){
        var $this=$(this);
        var $h3=$this.find("h3");
        r.push($h3.text());
      });
      return r.join(',');})()"""
      exejs.exeWrap(jsstr)
      l=exejs.getMsg()
      for title in l.split(','):
          print title
      
      #out:
      """
      mac TeamTalk開發(fā)點(diǎn)點(diǎn)滴滴之一——DDLogic框架分解上
      The directfb backend was supported together with linux-fb backend in GTK+2.10
      Science上發(fā)表的超贊聚類算法
      功能齊全、效率一流的免費(fèi)開源數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出工具(c#開發(fā),支持SQL server、SQLite、ACCESS三種數(shù)據(jù)  庫(kù)),每月借此處理數(shù)據(jù)5G以上
      企業(yè)級(jí)應(yīng)用框架(三)三層架構(gòu)之?dāng)?shù)據(jù)訪問層的改進(jìn)以及測(cè)試DOM的發(fā)布
      Unity3D 第一季 00 深入理解U3D開發(fā)平臺(tái)
      Welcome to Swift (蘋果官方Swift文檔初譯與注解二十一)---140~147頁(yè)(第三章--集合類型)
      appium簡(jiǎn)明教程(11)——使用resource id定位
      SQL語(yǔ)句匯總(終篇)—— 表聯(lián)接與聯(lián)接查詢
      fopen警告處理方式
      AndroidWear開發(fā)之HelloWorld篇
      AMD and CMD are dead之KMD.js版本0.0.2發(fā)布
      SQL語(yǔ)句匯總(三)——聚合函數(shù)、分組、子查詢及組合查詢
      DevExpress GridControl功能總結(jié)
      ASP.NET之Jquery入門級(jí)別
      2014年前端面試經(jīng)歷
      grunt源碼解析:整體運(yùn)行機(jī)制&grunt-cli源碼解析
      跟用戶溝通,問題盡量分析清楚,以及解決問題
      ASP.NET之Ajax系列(一)
      算法復(fù)雜度分析
      """
      

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多