Python Get頁面並執行js

2021-10-09 08:33:08 字數 3530 閱讀 7701

import re # 字串正則

import argparse # 控制台執行py傳參,用於分割引數

import asyncio # py協程

from aiohttp import clientsession # 利用clientsession get頁面

from bs4 import beautifulsoup # 提取html標籤內容

import execjs # execjs庫呼叫node底層執行js

# 我們最終要執行的是js中的intervalfunc函式,這個函式用於過濾掉不含intervalfunc的js部分

def findtargetjs(text):

url =

if isinstance(text, str):

# find all of url in this string

url = url + re.findall('intervalfunc', text)

elif isinstance(text, list):

# find all of url in this list

for string in text:

url = url + re.findall('intervalfunc', str(string))

else:

raise valueerror("invalid type!")

return url

# 利用execjs執行js,需要知道js裡的函式名並將函式名傳參給call()

# 如果不知道函式名,可以直接os.system("node ***.js")利用shell執行,不過這種前提是要把獲取的資訊放進js檔案裡

# 本函式可傳入一段js文字(request_url),也可傳入一堆js文字組成的list

# request_times是執行js的次數

def dojs(request_url, request_times):

# a single url

if isinstance(request_url, str):

# print(request_url)

for i in range(request_times):

ctx = execjs.compile(request_url)

ctx.call("setinterval")

# url list

elif isinstance(request_url, list):

for i in range(request_times):

for url in request_url:

# print(url)

ctx = execjs.compile(str(url))

ctx.call("setinterval")

else:

raise valueerror("invalid type!")

# async和await表示協利用協程非同步執行

async def request(session, request_url, model):

async with session.get(request_url) as response:

# 這裡get request_url獲取頁面

text = await response.read()

# only request js in html

# model = 1表示請求的頁面是js嵌入在html裡的

if model == 1:

soup = beautifulsoup(text, 'lxml')

# a list which has all of script

list = soup.find_all("script") # 獲取所有script標籤內容

jslist = findtargetjs(list) # 找含有關鍵字的js

dojs(jslist, 1) # 執行js

# only request js

# model = 2表示請求的頁面就是js檔案

elif model == 2:

# text is needed to beautifulsoup

# response.read()獲取的js檔案裡換行、tab、空格等等都變成了轉義字元,先beautifulsoup一下

soup = beautifulsoup(text, 'lxml')

# beautifulsoup是處理html標籤的,js檔案裡沒有這些標籤他會給自動加上和,所以這裡先去掉

# remove html label from soup

targetjstext = re.sub("<]+>", '', str(soup))

# 然後這裡要注意html 中的預留字元會被被替換為字元實體,所以要替換回來,一看**就知道怎麼回事了

# handling html character entities

targetjstext = targetjstext.replace("&", "&").replace("<", "<").replace(">", ">")

# print(str(text))

print(str(targetjstext))

dojs(str(targetjstext), 1)

else:

raise valueerror("invalid model number!")

async def main(model):

async with clientsession() as session:

await request(session, request_url, model)

if __name__ == '__main__':

"""run: python3 j***cuterclient.py -c 800 -u -m 1

"""# 解析傳入的引數

parser = argparse.argumentparser()

parser.add_argument('-c')

parser.add_argument('-u')

# model: 1 = js in html; 2 = only js

parser.add_argument('-m')

args = parser.parse_args()

request_url = args.u if args.u else ""

number_of_requests = args.c if args.c else 1

model = args.m if args.m else 2

# 這下面就是協程的基本寫法了

loop = asyncio.get_event_loop()

task = [asyncio.ensure_future(main(model)) for i in range(number_of_requests)]

loop.run_until_complete(asyncio.wait(task))

loop.close()

使用Dockerfile構建映象並執行Jar包

基於openjdk from openjdk 14 jdk oracle 設定工作目錄,進入到容器中的初始目錄,不存在會自動建立 env mypath root springboot workdir mypath 相對於dockerfile檔案的路徑 add 命令必須提供兩個引數,第乙個引數為 宿主...

子頁面iframe跨域執行父頁面定義的JS方法

問題需求 父頁面與子頁面iframe跨域巢狀,子頁面要觸發父頁面所定義的js方法 父子頁面的資料傳遞。下文中會用到一些檔案 父頁面 parent.html 嵌在父頁面的子iframe頁面 child.html。同域時 iframe 呼叫父頁面的js方法 在同域的情況下,子iframe頁面可以很方便地...

如何檢測頁面滾動並執行動畫

h5頁面動畫,在推廣運營中應用的相當廣泛。越是酷炫的動畫,越能吸引使用者。動畫當然算是比較重要的乙個環節,除此之外不得不提到的就是 動畫滾動互動效果。一 每個section怎樣單獨執行動畫?首先,引入動畫庫,這裡我們使用animate.css 傳送門 1 rel stylesheet href cs...