簡體   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