当前位置: 首页 > 知识库问答 >
问题:

使用selenium、bs4或请求从交互式图表中抓取数据

夹谷星剑
2023-03-14

我想从本页的图表中提取数据:http://188.166.44.172/match/live-stats/100941310

我尝试了请求和bs4,但没有获得任何数据,我也尝试了selenium,也没有数据。

以下是使用请求的代码:

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0'}

session = requests.Session()
r = session.get(u, timeout=30, headers=headers)    

soup = BeautifulSoup(r.content, 'html.parser')

for i in soup.find_all('rect'):
    if i.has_attr("onmouseover"):
        text = i.get('onmouseover')
        print(text)

和使用硒的代码:

from selenium import webdriver
from bs4 import BeautifulSoup
u = "http://188.166.44.172/match/live-stats/100941310"

driver = webdriver.Chrome(executable_path=r"C:/chromedriver.exe", options=options)

driver.get(url)

soup = BeautifulSoup(driver.page_source, 'html.parser')

for i in soup.find_all('rect'):   #I also tried soup.select('*')
    if i.has_attr("onmouseover"):
        text = i.get('onmouseover')
        print(text)

有没有办法用python从这些图表中提取数据?

共有1个答案

栾瑞
2023-03-14

你没有得到任何回报的原因是因为所有的图表都是由JavaScript动态生成的,例如,使用bs4,你将不会读取这些。

但是,图表的数据嵌入在HTML中。你可以解析它并绘制它。

以下是方法:

import ast
import re

import requests
import matplotlib.pyplot as plt

target_url = "http://188.166.44.172/match/live-stats/100941310"
page_source = requests.get(target_url).text

raw_attack_data = ast.literal_eval(
    re.search(r"var all_attack = (\[.*\])", page_source).group(1),
)
all_attack = [i[1] for i in raw_attack_data if isinstance(i, list)]

plt.plot(all_attack, label="attack")
plt.legend(loc="lower right")
plt.show()

这会给你一个这样的图:

正如我所说的,你需要的所有东西都在源代码中,所以你必须使用这些值。

源代码如下所示:

其中内部列表的第一个值是游戏时间,第二个值是图表上绘制的统计值。

请注意,有些数组在{}中有值。这些是图表上的图标标记。您可以使用i抵抗(i, list)过滤掉它们,因为它们可以很容易地解析为dicts,如上所示。

编辑:

是的,可以获取部门和团队信息,因为所有信息都在HTML中。我对最初的答案做了一些修改,得出了以下结论:

import ast
import re

import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt

target_url = "http://188.166.44.172/match/live-stats/100941310"
page_source = requests.get(target_url).text


def get_match_info(html_source: str) -> list:
    return [
        i.getText(strip=True) for i
        in BeautifulSoup(html_source, "lxml").select("h1 a")
    ]


def get_stats(html_source: str, search_str: str) -> tuple:
    raw_data = ast.literal_eval(
        re.search(fr"var {search_str} = (\[.*\])", html_source).group(1),
    )
    filtered = [i[1] for i in raw_data if isinstance(i, list)]
    game_time = [i[0] for i in raw_data if isinstance(i, list)]
    return game_time, filtered


division, home, away = get_match_info(page_source)

time_, attack_home = get_stats(page_source, "dangerous_home")
_, attack_away = get_stats(page_source, "dangerous_away")

plt.suptitle(f"{division} - {home} v {away}")
plt.ylabel("Attack")
plt.xlabel("Game time")
plt.plot(time_, attack_home, color="blue", label=home)
plt.plot(time_, attack_away, color="black", label=away)
plt.legend(loc="lower right")
plt.show()

这将生成一个绘图:

 类似资料:
  • 我在这个网站上拼凑了一个来自IB留档/示例和论坛的脚本。我得到了我想要的单个符号的输出,但是,如果我使用股票列表,我无法找到将股票代码传递到DF输出文件的方法。我的解决方法是创建一个使用列表序列的字典(见下文),但是每次使符号基本上毫无意义时,IB api的输出都会略有变化。我下面使用的列表通常有20个名称,但可能会改变,我把它删掉以便于查看。 @Brian/和其他开发人员,如果有一种方法可以为每

  • 我想从一个旅游景点中获取每家酒店的价格,我正在提取名称和安排,但问题是,价格显示了后clic安排,我不知道如何处理它。 我想得到的结果是: {'Julius':[('Petit Déjeuner','216'),('Demi pension','264')] 如果你们中的任何一个能帮助我,我把我的代码放在你们的处置中,并提前感谢你们。

  • 原文:Interactive navigation 所有图形窗口都带有导航工具栏,可用于浏览数据集。 以下是工具栏底部的每个按钮的说明: Home(首页)、Forward(前进)和Back(后退)按钮: 这些类似于 Web 浏览器的前进和后退按钮。 它们用于在之前定义的视图之间来回浏览。 它们没有意义,除非你已经使用平移和缩放按钮访问了其他地方。 这类似于尝试在访问新页面之前单击 Web 浏览器上

  • Jaspersoft Studio(专业版)使用一个JavaScript库高图并生成HTML5交互式图表。是否可以像这里一样在Jaspersoft Studio中创建饼图-http://www.highcharts.com/demo/pie-drilldown-即单击出现的饼图的特定部分并闪烁一个平滑过渡到向下钻取报告?是否可以在预览模式下创建和显示这样的报告?

  • 问题内容: 我在下面的这段代码中遇到了问题,该代码几乎逐字从Firebase SDK Java文档复制而来。我是真正的语言(例如Java)的新手,它来自PHP和JavaScript的webdev背景。 基本上,addListenerForSingleValueEvent不会触发以向我返回数据。我注意到这是因为系统打印输出不会触发,因此我认为监听事件没有触发。 我怀疑这与我有限的知识有关,函数本身是

  • hover配置通过options.hover改变。全局hover配置位于Chart.defaults.global.hover。要配置哪些事件触发图表交互,请参阅事件。 名称 类型 默认值 描述 mode String 'nearest' 设置工具提示中出现的元素。有关详细信息,请参考交互模式。 intersect Boolean true 如果为true,则hover仅适用于鼠标位置的图表进行相