如何通过python执行特定js代码并获取js代码获取到的数据

如何通过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中的方法,对它进行参数的传递。