【问题标题】:Retrieving JS script from a website using Python3使用 Python3 从网站检索 JS 脚本
【发布时间】:2020-01-19 20:49:03
【问题描述】:

我想抓取一个网站以获取其“原始”JavaScript 代码。例如,如果我要抓取 this 网站。我会得到一个字符串,其中包含:

这只是给定链接中现有 JS 的一小部分,但我想在一个字符串或字符串数​​组中获取整个 JS。

我尝试了不同的方法来获取这些数据:使用requestsselenium。 简单地加载网站的 HTML 似乎不起作用,因为脚本标签似乎没有加载。

使用selenium,我希望这会起作用:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "https://www.udemy.com"

driver = webdriver.Chrome()
driver.get(url)

wait = ui.WebDriverWait(driver, 10) 
results = wait.until(EC.visibility_of_all_elements_located((By.TAG_NAME, "script")))

print(results)

然后使用results我可以得到一个字符串,但它不起作用。

另一个我想获得的 JS 脚本块的例子:

红色矩形表示 JS 脚本,如您所见,其中有很多,我想以“原始”形式获取它(而不是执行它)。

我的问题是:如何获得字符串格式的“原始”JS 脚本?以及执行此操作的最有效方式(时间方面)是什么?

【问题讨论】:

    标签: javascript python-3.x selenium python-requests


    【解决方案1】:

    您正在寻找.get_attribute('innerHTML')。您也不想使用visibility_of_all_elements_located,因为您正在寻找永远不可见的东西。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    url = "https://www.udemy.com"
    driver = webdriver.Chrome()
    driver.get(url)
    
    #wait = ui.WebDriverWait(driver, 10) 
    #results = wait.until(EC.visibility_of_all_elements_located((By.TAG_NAME, "script")))
    
    wait = WebDriverWait(driver, 10)
    script_tag = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//script")))
    innerHTML_of_script_tag = []
    for script in script_tag:
        innerHTML_of_script_tag.append(script.get_attribute('innerHTML'))
        print(script.get_attribute('innerHTML'))
        print("################################################################")
    
    print("---------------------------------------------------------------------")
    print("---------------------------------------------------------------------")
    print(innerHTML_of_script_tag)
    

    【讨论】:

    • 感谢您的回答!这段代码似乎没有得到网站中找到的整个 JS 脚本。虽然它能够获得一些脚本,但它的一些较大部分(如问题本身的图像所示)丢失并且在innerHTML_of_script_tagprint 语句中为空。这是我无法检索的那些部分。
    • @Omer Hen 当我转到udemy.com 时,我没有从您的屏幕截图中看到这么大的 javascript 块。在看到这段 java 脚本代码之前,您是否以任何方式与页面进行交互?
    • 我添加了另一张图片,展示了大块的 JS 脚本。给定的代码似乎并没有真正捕捉到所有这些。除此之外,我只需加载网站并转到 Chrome 提供的“检查”选项即可查看源代码。我不执行任何特殊操作或与页面交互。
    • @Omer Hen 小更新,这很有趣当我将driver.page_source 打印到文本文件但不在属性innerHTML 中时,我可以看到您正在寻找的块。
    • 这就是我试图找到的解决方案。另外,当我打印driver.page_source 时,我并没有看到大块的 JS 脚本,而只看到了一些较小的块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多