如何通过python执行特定js代码并获取js代码获取到的数据
我目前有一段js的代码,它可以在浏览器的控制台执行,目的是把当前网页的某些
元素以及他的内容作为txt保存到本地
但是我的主程序计划要用到python,我怎样通过python执行这段js代码来从网页上获取数据。
1.不能使用python的selenium库
2.在js中我指定了保存路径,但是执行js的时候,浏览器自动把txt下载到了浏览器的默认下载路径
3.如果用python执行这段js,有没有可能,我可以不用把获取到的数据保存到本地,而是python可以直接拿到。
4.这个网页有浏览器认证,不能通过把url直接给js的方式来获取元素。也不能通过类似selenium这类的自动化工具打开。
5.我使用的浏览器是Chrome
下面放上要执行的js代码以及获取的内容的示例
var elements = document.evaluate("//div", document, null, XPathResult.ANY_TYPE, null);
var element = elements.iterateNext();
var output = "";
if (element) {
var children = element.children;
for (var i = 0; i < children.length; i++) {
if (children[i].tagName === "P") {
output += children[i].outerHTML + "\n";
} else if (children[i].tagName === "OL") {
var listItems = children[i].getElementsByTagName("li");
for (var j = 0; j < listItems.length; j++) {
output += listItems[j].outerHTML + "\n";
}
}
}
}
var blob = new Blob([output], {type: "text/plain"});
var a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "p.txt";
// Create a hidden link and simulate a click to trigger the download
a.style.display = "none";
document.body.appendChild(a);
a.click();
// Remove the link from the DOM
document.body.removeChild(a);
// Save the file to the specified location on the E: drive
var file = new File([blob], "p.txt", {type: "text/plain", lastModified: Date.now()});
var fileReader = new FileReader();
fileReader.onload = function() {
var content = fileReader.result;
var request = new XMLHttpRequest();
request.open("PUT", "file:///E:/p.txt", true);
request.send(content);
};
fileReader.readAsArrayBuffer(file);
console.clear();
这个是获取到的数据示例,因为没办法上传图片,因此用百度网盘代替
链接: https://pan.baidu.com/s/1AVMe8h0EEKmb5P6FAMylaw?pwd=xxd9 提取码: xxd9
可以使用Python中的Selenium WebDriver来执行JavaScript代码并获取元素的内容,不过您在问题中指出了不能使用Selenium。因此,您可以考虑使用Python中的requests-html或pyppeteer库。这两个库可以模拟浏览器行为来执行JavaScript并获取元素的内容。此外,如果您只想获取元素的内容,而不是将其保存到本地,可以使用BeautifulSoup库来解析HTML并提取所需元素的内容。
方式一:PyExecJS
PyExecJS 是使用最多的一种方式,底层实现方式是:在本地 JS 环境下运行 JS 代码
支持的 JS 环境包含:Node.js、PyV8、PhantomJS、Nashorn 等
方式二:js2py
js2py作为一个纯 Python 实现的 JS 解释器,可以完全脱离 JS 环境,直接将 JS 代码转换为 Python 代码
方式三:Node.js
实际上是使用 Python 的os.popen执行 node 命令,执行 JS 脚本
首先,确保本地已经安装了 Node.js 环境
修改 JS 脚本,新增一个导出函数 init ,方便内部函数被调用
方式四:PyV8
PyV8 是 Google 将 Chrome V8 引擎用 Python 封装的依赖库
它不依赖本地 JS 环境,运行速度很快
首先,安装依赖库
你可以使用 Python 的模块 PyV8 或者 PyExecJS,它们可以让你在 Python 中执行 JavaScript 代码并返回结果。以下是使用 PyExecJS 模块的一个示例:
import execjs
js_code = """
var elements = document.evaluate("//div", document, null, XPathResult.ANY_TYPE, null);
var element = elements.iterateNext();
var output = "";
if (element) {
var children = element.children;
for (var i = 0; i < children.length; i++) {
if (children[i].tagName === "P") {
output += children[i].outerHTML + "\n";
} else if (children[i].tagName === "OL") {
var listItems = children[i].getElementsByTagName("li");
for (var j = 0; j < listItems.length; j++) {
output += listItems[j].outerHTML + "\n";
}
}
}
}
output
"""
# 创建一个运行环境
ctx = execjs.compile("""
function run(js_code) {
return eval(js_code);
}
""")
# 在运行环境中执行 JavaScript 代码
output = ctx.call("run", js_code)
# 输出结果
print(output)
这个示例会在 Python 中执行你的 JavaScript 代码,并将输出作为字符串返回。你可以根据你的需要修改代码来保存或处理这个字符串。如果你想从 Python 中直接访问 JavaScript 中的对象,可以在 JavaScript 代码中返回 JSON 格式的数据,然后在 Python 中使用 json.loads() 函数将其转换为 Python 对象。
该回答引用ChatGPT
要通过Python执行特定的JavaScript代码并获取该代码获取到的数据,可以使用Selenium和BeautifulSoup库。
Selenium是一个用于自动化Web浏览器的库,可以使用它启动一个Web浏览器,加载JavaScript代码并提取所需的数据。
from selenium import webdriver
from bs4 import BeautifulSoup
# 创建Chrome浏览器实例
driver = webdriver.Chrome()
# 加载要执行的JavaScript代码
driver.get("https://example.com")
result = driver.execute_script("return your_javascript_code;")
# 使用BeautifulSoup解析结果
soup = BeautifulSoup(result, "html.parser")
data = soup.find("div", {"class": "your_class"}).text
# 关闭浏览器
driver.quit()
# 处理数据
print(data)
您可以使用 Python 中的 selenium 和 webdriver 模块来模拟浏览器,并执行该段 JavaScript 代码。以下是一个可能的实现示例:
from selenium import webdriver
# 创建 Chrome 浏览器驱动程序
driver = webdriver.Chrome()
# 打开网页
driver.get("https://example.com/")
# 执行 JavaScript 代码
js_code = """
var elements = document.evaluate("//div", document, null, XPathResult.ANY_TYPE, null);
var element = elements.iterateNext();
var output = "";
if (element) {
var children = element.children;
for (var i = 0; i < children.length; i++) {
if (children[i].tagName === "P") {
output += children[i].outerHTML + "\\n";
} else if (children[i].tagName === "OL") {
var listItems = children[i].getElementsByTagName("li");
for (var j = 0; j < listItems.length; j++) {
output += listItems[j].outerHTML + "\\n";
}
}
}
}
var blob = new Blob([output], {type: "text/plain"});
var a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "p.txt";
// Create a hidden link and simulate a click to trigger the download
a.style.display = "none";
document.body.appendChild(a);
a.click();
// Remove the link from the DOM
document.body.removeChild(a);
// Save the file to the specified location on the E: drive
var file = new File([blob], "p.txt", {type: "text/plain", lastModified: Date.now()});
var fileReader = new FileReader();
fileReader.onload = function() {
var content = fileReader.result;
var request = new XMLHttpRequest();
request.open("PUT", "file:///E:/p.txt", true);
request.send(content);
};
fileReader.readAsArrayBuffer(file);
console.clear();
"""
driver.execute_script(js_code)
# 关闭浏览器
driver.quit()
该示例中,selenium 模块启动了一个 Chrome 浏览器,打开了一个网页。然后,它将 JavaScript 代码保存在变量 js_code 中,并使用 driver.execute_script() 方法在浏览器中执行该代码。您可以根据需要修改代码中的文件保存位置。注意,该示例中需要将 Chrome 浏览器的驱动程序下载到本地,并将其路径添加到系统 PATH 环境变量中。
https://www.ycpai.cn/python/wYeL3UJI.html
不能使用Selenium的话,可以使用Python中的requests库来发送HTTP请求并获取网页内容,然后使用正则表达式或BeautifulSoup库解析HTML并提取所需的数据。
以下是一个简单的示例代码,演示了如何使用requests库获取网页内容,并使用正则表达式提取h1元素的文本:
import re
import requests
# 发送HTTP请求获取网页内容
response = requests.get('https://www.example.com')
# 使用正则表达式提取h1元素的文本
result = re.search('<h1>(.*?)</h1>', response.text).group(1)
print(result)
代码发送HTTP请求获取网页内容,然后使用正则表达式提取h1元素的文本。如果您需要提取更多的元素或数据,可以使用正则表达式或BeautifulSoup库进行解析和提取。
需要注意的是,有些网站可能对爬虫进行了限制,例如需要进行身份验证、需要提交表单、需要处理JavaScript等等,这时可能需要采用其他方法来获取数据,例如使用API接口、爬虫框架等。
python有一些库可以执行js代码,例如execjs、pyv8、pyduktape等,但是它们都有一些限制,例如不能访问浏览器的DOM对象、不能使用浏览器的API、不能发送或接收网络请求等。这些限制可能导致你的js代码无法正常运行,或者无法获取你想要的数据。
这里建议使用pyppeteer(更强大)
为了使用pyppeteer,你需要先安装它,你可以使用pip命令来安装,例如:
pip install pyppeteer
然后,你需要编写python代码来控制浏览器,例如:
import asyncio
from pyppeteer import launch
async def main():
# Launch a headless browser
browser = await launch()
# Create a new page
page = await browser.newPage()
# Go to the target website
await page.goto('https://example.com')
# Enter your username and password
await page.type('#username', 'your_username')
await page.type('#password', 'your_password')
# Click the login button
await page.click('#login')
# Wait for the page to load
await page.waitForNavigation()
# Execute your js code and get the return value
result = await page.evaluate("""
// Your js code here
""")
# Print the result
print(result)
# Close the browser
await browser.close()
# Run the main function
asyncio.get_event_loop().run_until_complete(main())
希望这个方法能够帮助你通过python执行特定js代码并获取js代码获取到的数据。
解决方案:
您可以使用PyExecJS库执行JS代码,并从Python中获取结果。
安装PyExecJS:
pip install PyExecJS
例:
import execjs
js_code = '''
var elements = document.evaluate("//div", document, null, XPathResult.ANY_TYPE, null);
var element = elements.iterateNext();
var output = "";
if (element) {
var children = element.children;
for (var i = 0; i < children.length; i++) {
if (children[i].tagName === "P") {
output += children[i].outerHTML + "\n";
} else if (children[i].tagName === "OL") {
var listItems = children[i].getElementsByTagName("li");
for (var j = 0; j < listItems.length; j++) {
output += listItems[j].outerHTML + "\n";
}
}
}
}
'''
ctx = execjs.compile(js_code)
result = ctx.eval('output')
print(result)
python如何执行js代码,请看我这篇博客:
https://guanzhu-aniu.blog.csdn.net/article/details/123500499
可以使用PyExecJS库来实现,它可以让你在Python中运行JavaScript代码,并从中获取数据。
安装:
pip install PyExecJS
使用:
import execjs
# 读取js文件
with open('test.js', 'r') as f:
js_code = f.read()
# 创建一个execjs的runtime环境
ctx = execjs.compile(js_code)
# 调用js函数,并获取返回值
result = ctx.call('myFunction', 'arg1', 'arg2')
print(result)
不知道你这个问题是否已经解决, 如果还没有解决的话:方法一:使用PyExecJS
它是我们使用最多的一种方法,它可以在一个js环境下去执行另一个js代码,使用它之前,我们需要对它进行安装:
pip3 install PyExecJS
使用方法如下:
def js_from_file(file_name):
"""
读取js文件
:return:
"""
with open(file_name, 'r', encoding='UTF-8') as file:
result = file.read()
return result
使用execjs类
import execjs
from js_code import *
使用call方法
result1 = context1.call("add",4,5)
print(result1)
在这个代码中,我们首先在一个js文件中读取出源代码,然后再使用execjs 类的compile()方法对js中的字符串进行加载,返回一个上下文对象,最后使用了一个call方法,对上下文对象进行调用,传入的参数是4和5,,最后程序运行的结果是9。
方法二:js2py
它是一个js的解释器,它现在已经不需要js环境,就可以实现js代码和Python代码之间的进行转换操作,在使用之前同的要对它先进行安装,安装命令如下:
pip3 install js2py
使用方法如下:
H1=js2py.EvalJs()
H1.execute(js_content)
result = H1.add(4,5)
print(result)
在这段代码中,我们首先使用了一个 js2py 中的EvalJs()方法生成一个上下文对象,任何对js代码进行执行操作,转换从python文件,最后利用对上下文调用js中的方法,对它进行参数的传递。