繁体   English   中英

有没有办法从网站的源代码以编程方式运行 javascript function

[英]Is there a way to programmatically run a javascript function from the source of a website

在basketball-reference.com上,有一个伤病页面,显示了NBA目前的所有伤病情况。 我想开始存档这些数据,以记录每天在 NBA 受伤的人。 除了简单地作为一个篮球统计螺母之外,这将是一个贝叶斯 Model 的输入,它可以预测队友受伤的球员上场时间。

现在,我可以每天一次简单地将 go 转到他的页面,单击Get Table as a CSV" button ,然后将其复制并粘贴到文件中,但这似乎是一项 cron 工作。

我可以抓取原始的sr-min.js并对其进行解析,但get_csv_output(e)页面已经在其文件中随时可用事实上,如果我打开开发者控制台并输入

get_csv_output("injuries")

我把所有的 csv 作为字符串倾倒出来。 当我可以简单地使用这个 function 时,感觉就像重新发明轮子一样可怕。

不知何故,我的脑海里有一个脱节。 我不知道如何访问页面,运行 js function,并保存 output 而无需通过 Z8E00596AD8DE2213FF8ZF8D8478D5362 启动完整的 chrome 驱动程序实例。 这感觉就像一个简单的问题,我只是不知道一个简单的解决方案。

我并不特别关心解决方案使用什么语言,尽管我更喜欢 python、bash 或其他一些轻量级解决方案。

请让我知道我是否天真。

编辑:页面是https://www.basketball-reference.com/friv/injuries.cgi

编辑 2:接受的答案是供将来参考的绝佳解决方案。

我最终做了

curl https://www.basketball-reference.com/friv/injuries.cgi | python3 convert_injury_html_to_csv.py > "$(date +'%Y%m%d')".tsv

python 脚本在哪里...

import sys
from bs4 import BeautifulSoup


def parse_injury_html(html_doc):
    soup = BeautifulSoup(html_doc, "html.parser")
    injuries_table = soup.find(id="injuries")
    for row in injuries_table.tbody.find_all("tr"):
        if row.get('class', None) == "thead":
            continue
        name = row.th
        team, update, description = row.find_all("td")
        yield((name.string, team.string, update.string, description.string))


def main():
    for (name, team, update, description) in parse_injury_html(sys.stdin.read()):
        print(f"{name}\t{team}\t{update}\t{description}")


if __name__ == '__main__':
    main()

您可以更直接地运行该 JS function 中的代码。 Node.js是一个独立的 JS 引擎,因此您可以使用它来运行完全相同的 function。

function 很可能只是发出 HTTP 请求从服务器下载数据,可能会进行一些温和的数据操作。 node 和浏览器 JS 之间的网络层并不相同,但有可用的 polyfills。 如果 JS function 正在使用 fetch API,则可以使用node-fetch ,或者如果它使用 XHR 样式的请求, xmlhttprequest

由于代码可能是一个简单的数据获取,它可能很简单,可以对正在发生的事情进行逆向工程,并用您喜欢的任何语言编写自己的脚本来发出相同类型的 HTTP 请求。 观察开发人员工具的网络选项卡中发生的事情应该会告诉您它从哪里获取数据。

仅执行此 function 不会有任何好处,因为它必须在该伤害页面的上下文中执行。 如果您查看它的代码,它会有效地解析 html 数据。 奇怪的做事方式,但我看到更糟。 没关系。

最简单的解决方案是使用打开页面并调用 function 的东西,就像在 devtools 中那样。 Barmar建议 Selenium,但我个人更喜欢 puppeteer。 它通过 NodeJS 运行,它以无窗口模式打开 Chrome,并在任何站点上执行任何打开的 API。 在我们的例子中 - get_csv_output function。

之后,您可以对结果字符串做任何您想做的事情。 将其转储到数据库或保存到文件。

puppeteer 代码示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM