Python selenium的js擴充套件實現

2021-08-09 23:19:18 字數 2943 閱讀 9899

**:

python寫的資料採集,對一般有規律的頁面用 urllib2 + beautifulsoup + 正則就可以搞定。 但是有些頁面的內容是通過js生成,或者通過js跳轉的,甚至js中還加入幾道混淆機制;對這種涉及頁面指令碼解析的內容,前面的方式便很無力。

這時我們需要能解析、執行js的引擎——瀏覽器,而python selenium能提供程式與瀏覽器的互動介面,再加上phantomjs這個可以後台執行的瀏覽器,即使用 selenium + phantomjs 便可以解決以上的問題。

selenium可以操作頁面的元素,並且提供執行js指令碼的介面。但其呼叫js指令碼後並不能直接返回執行的結果,這樣再採集內容的過程中就會受到一些限制。 比如我們想使用頁面中的函式進行資料轉換,或者獲取iframe裡的內容,這些js產生資料要傳回比較麻煩。

所以我便寫乙個簡化js資料回傳的擴充套件 exescript.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

## created by heqingpan

_init_js="""

(function ()

var e=document.createelement('div');

e.setattribute("id","__s_msg");

e.style.display="none";

window.__e=e;

})();

window.__s_set_msg=function(a)

"""_loadjsfmt="""

var script = document.createelement('script');

script.src = "";

"""_warpjsfmt="__s_set_msg()"

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()

defexewrap(self,jsstr):

""" jsstr 執行後有返回值,返回值通過self.getmsg()獲取 """

self.driver.execute_script(_warpjsfmt.format(jsstr))

defloadjs(self,path):

self.execute(_loadjsfmt.format(path))

defloadjquery(self,path=_jquery_cdn):

self.loadjs(path)

defexecute(self,jsstr):

self.driver.execute_script(jsstr)

defgetmsg(self):

return self.msgnode.get_attribute('msg')

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());

return r.join(',');})()"""

exejs.exewrap(jsstr)

l=exejs.getmsg()

for title in l.split(','):

print title

#out:

"""mac teamtalk開發點點滴滴之一——ddlogic框架分解上

the directfb backend was supported together with linux-fb backend in gtk+2.10

science上發表的超讚聚類演算法

功能齊全、效率一流的免費開源資料庫匯入匯出工具(c#開發,支援sql server、sqlite、access三種資料 庫),每月藉此處理資料5g以上

企業級應用框架(三)三層架構之資料訪問層的改進以及測試dom的發布

unity3d 第一季 00 深入理解u3d開發平台

welcome to swift (蘋果官方swift文件初譯與註解二十一)---140~147頁(第三章--集合型別)

sql語句彙總(終篇)—— 表聯接與聯接查詢

fopen警告處理方式

androidwear開發之helloworld篇

amd and cmd are dead之kmd.js版本0.0.2發布

sql語句彙總(三)——聚合函式、分組、子查詢及組合查詢

devexpress gridcontrol功能總結

asp.net之jquery入門級別

2023年前端面試經歷

grunt原始碼解析:整體執行機制&grunt-cli原始碼解析

跟使用者溝通,問題盡量分析清楚,以及解決問題

asp.net之ajax系列(一)

演算法複雜度分析

"""

Python Selenium環境搭建

安裝python 設定 python 的環境變數 安裝目錄 安裝目錄 scripts 使用 pip安裝 selenium pip install selenium 安裝完python pip工具,在安裝目錄的 scripts 目錄下。在 dos下直接執行 pip install selenium 即...

Python Selenium 學習筆記

1 判斷元素是否存在 try driver.find element.xx a true except a false if a true print 元素存在 elif a false print 元素不存在 2 判斷元素是否顯示 driver.find element by id outputb...

Python Selenium錯誤小結

因為要使用web應用,所以開始用起了,selenium包,安裝倒是挺容易的,但就是出了很多bug。filenotfounderror winerror 2 系統找不到指定的檔案。通過錯誤反饋發現是要把該軟體加到路徑裡面,但是,設定了系統環境變數後發現還是不行,最後,使用了乙個非常原始的方法 brow...