首页 > 编程问答 >抓取脚本标签中的数据

抓取脚本标签中的数据

时间:2024-08-03 16:16:20浏览次数:12  
标签:javascript python selenium-webdriver web-scraping

任何人都可以建议一种方法来抓取a <script> 标签中的数据,具体来说,在本例中是来自AEMO的30分钟表( https://www.aemo.com.au/aemo/apps/visualizes/ elec-nem-priceanddemand.html )。

要获取数据表,我需要单击在网站上显示该表的按钮或下载按钮。然而,这里的障碍是,当我尝试使用 Selenium 抓取表格时,按钮和表格文本隐藏在 <script> 标签后面。

这是迄今为止我的代码:

# import libraries
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

url = "https://www.aemo.com.au/aemo/apps/visualisations/elec-nem-priceanddemand.html"
browser = webdriver.Safari(executable_path='/usr/bin/safaridriver')
browser.get(url)
try:
    print(browser.page_source)
except:
    print("not found")
finally:
    browser.quit()

和部分结果是:

<body aurelia-app="visualisation-main" data-gr-c-s-loaded="true">
    <div class="splash">
      <div class="message"><span class="icon-spinner"></span></div>
    </div>

    <script src="jspm_packages/system.js"></script>
    <script src="config.js"></script>
    <script>
      System.import('aurelia-bootstrapper');
    </script>


</body></html>

数据在 script 标签中不可见,因为它是由运行在网站上的 JavaScript 代码动态加载的。你的抓取方法需要考虑这一点。以下是如何使用 Selenium 和 BeautifulSoup 从 AEMO 网站抓取数据的步骤:

  1. 使用 Selenium 加载页面并渲染 JavaScript: 你已经正确地使用 Selenium 加载页面了。Selenium 会等待页面及其 JavaScript 内容加载完毕。

  2. 定位包含数据的 script 标签: 你需要检查页面的 HTML 源代码(可以使用浏览器的开发者工具),并找到包含所需数据的 script 标签。查找标签内的特定模式、ID 或类名,以便你能够使用 BeautifulSoup 准确地定位它。

  3. 使用 BeautifulSoup 提取 script 标签的内容: 找到正确的 script 标签后,使用 BeautifulSoup 提取其内容。

  4. 从 JavaScript 代码中解析数据: 提取的 script 标签内容将包含 JavaScript 代码,很可能是一个数组或 JSON 对象。你将需要使用字符串操作或正则表达式来清理数据,并将其转换为可用的 Python 数据结构(例如,列表或字典)。

  5. 将数据结构化为 DataFrame: 最后,使用 pandas 将解析后的数据组织到 DataFrame 中,以便进行进一步的分析或操作。

以下是一个使用修改后的代码示例,展示了这些步骤:

import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import json

url = "https://www.aemo.com.au/aemo/apps/visualisations/elec-nem-priceanddemand.html"
browser = webdriver.Safari(executable_path='/usr/bin/safaridriver')
browser.get(url)

# 等待特定元素加载,表明数据已准备好
wait = WebDriverWait(browser, 10)
element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.highcharts-series-group')))

# 获取页面源代码
page_source = browser.page_source
soup = BeautifulSoup(page_source, 'html.parser')

# 查找包含数据的 script 标签(调整选择器以匹配实际的 HTML 结构)
script_tag = soup.find('script', text=lambda text: 'seriesData' in text)

# 从脚本标签中提取数据
script_content = script_tag.text
start = script_content.find('seriesData:') + len('seriesData:')
end = script_content.find('}],', start) + 2
json_data = json.loads(script_content[start:end])

# 提取相关数据点
data_points = json_data[0]['data']

# 使用 pandas 创建 DataFrame
df = pd.DataFrame(data_points)

# 打印 DataFrame
print(df)

browser.quit()

这段代码首先等待一个特定元素加载,该元素表示数据已经存在于页面上。然后,它找到包含数据的 script 标签,提取 JSON 数据,并将其转换为 pandas DataFrame。

请注意,这只是一个示例,你可能需要根据网站的结构和包含所需数据的 script 标签调整选择器和解析逻辑。

标签:javascript,python,selenium-webdriver,web-scraping
From: 58463113

相关文章

  • 有没有办法阻止 setUp() 为 python 测试用例中的每个测试方法启动浏览器?
    我正在练习编写Web自动化测试用例,并且编写了一些函数来测试登录、在用户主页中查找我的用户名以及测试GitHub的注销功能。然而,我通过经验和阅读了解到setUp()是在每个测试方法之前启动的,而我的问题是在每个测试方法之前它都会打开一个新的浏览器。我希望我的所有测......
  • 尝试使用Python抓取需要先登录的网站但没有成功
    我正在尝试抓取一个需要登录的网站(我的路由器GUI),但无论我做了什么,我都会反复返回登录站点的源代码,而不是成功登录后出现的页面。我做了一些阅读,并意识到我需要返回POST请求的答案。我想我找到了它们并返回了所需的值,但仍然-似乎没有任何效果。我使用https://curl.tri......
  • 给python初学者的一些建议
    写在开篇关于Python,可以这么说,这几年借着数据科学、机器学习与人工智能的东风,Python老树开新花,在风口浪尖上居高不下。Python之所以这么受大家的青睐,是因为它语言简洁,上手容易,让非计算机专业的人员也能快速上手,享受编程开发带来的便利和福利。但Python再简单,它也是一......
  • Python中15个递归函数经典案例解析
    1.阶乘计算阶乘是一个常见的递归应用,定义为n!=n*(n-1)*…*1。deffactorial(n):ifn==0:return1else:returnn*factorial(n-1)print(factorial(5))#输出:1202.斐波那契数列斐波那契数列的每一项都......
  • 如何使用 python (使用服务帐户)在应用程序脚本 Web 应用程序上触发 doGet()?
    我想从返回json的应用程序脚本Web应用程序触发doGet(e)事件。我们的网络应用程序无法在我们的组织域之外访问,因此需要服务帐户。我执行了下面的代码,但“发生错误:401客户端错误”fromgoogle.oauth2importservice_accountfromgoogle.auth.transport.requestsimpor......
  • 如何使用 BeautifulSoup python 查找选择标签的选定选项值
    我正在尝试从python中的htmlselect标签获取选定的值。好吧,当选项属性设置为selected="selected"时,它是成功的,但我试图废弃的网站具有不同的选项属性,例如:-html="""<select><optionvalue="">Pleaseselectavlalue</option><o......
  • 12:Python元组属性
    #元组tuple,元素不可被修改,不能被增加或则删除tu=(111,'alex',(11,22),[(33,44)],True,33,44,)#一般写元组的时候,最后可以加个逗号不报错print(tu)tu=(111,'alex',(11,22),[(33,44)],True,33,44,)v=tu[0]#元组索引print(v)tu=(111,'alex',(11,2......
  • 如何在venv python中安装requirements.txt
    我是Python虚拟环境的初学者,在安装requirements.txt文件时遇到问题。问题是,当我运行命令来安装requirements.txt文件时,没有安装任何内容。平台:WindowsVS代码镜像如何解决这个问题?没有正确激活虚拟环境。请按照以下步骤操作:1.激活虚拟环境:在VSC......
  • 【代码随想录】图论复习(Python版)
    深度优先搜索1.搜索过程一个方向搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)2.代码框架回溯法的代码框架:defbacktracking(参数):if终止条件:存放结果returnfor选择本层集合中的元素(树中节点孩子的数量......
  • 【Python】数据类型之字符串
    本篇文章将继续讲解字符串其他功能:1、求字符串长度功能:len(str)  ,该功能是求字符串str的长度。代码演示:2、通过索引获取字符串的字符。功能:str[a]  str为字符串,a为整型。该功能是获取字符串str索引为a处的字符。注意:字符串的索引是从0开始的。代码演示:注意......