使用 Python 抓取 Web 数据
Scraping Web data with Python
抱歉,如果这不是回答这个问题的地方,但我不确定还有什么地方可以问。
我正在尝试从 rotogrinders.com 抓取数据,我 运行 遇到了一些挑战。
特别是,我希望能够使用这种格式的 url 抓取以前的 NHL 游戏数据(显然你可以更改其他日期数据的日期):
https://rotogrinders.com/game-stats/nhl-skater?site=draftkings&date=11-22-2016
但是,当我进入该页面时,我注意到数据被分解成页面,我不确定如何让我的脚本获取单击 "all"按钮在页面底部。
在 python 中有没有办法做到这一点?也许有些图书馆允许点击按钮?或者有什么方法可以通过巧妙地了解 URL/request?
而无需实际单击按钮来获取数据
其实,在这种情况下,事情并没有那么复杂。当您单击 "All" 时,不会发出任何网络请求。所有 数据都已经存在 - 在 HTML 的 script
标签内,您只需要提取它即可。
使用 requests
(to download the page content), BeautifulSoup
的工作代码(解析 HTML 并找到所需的 script
元素),re
(从中提取所需的 "player" 数组脚本)和 json
(将数组字符串加载到 Python 列表中):
import json
import re
import requests
from bs4 import BeautifulSoup
url = "https://rotogrinders.com/game-stats/nhl-skater?site=draftkings&date=11-22-2016"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
pattern = re.compile(r"var data = (\[.*?\]);$", re.MULTILINE | re.DOTALL)
script = soup.find("script", text=pattern)
data = pattern.search(script.text).group(1)
data = json.loads(data)
# printing player names for demonstration purposes
for player in data:
print(player["player"])
打印:
Jeff Skinner
Jordan Staal
...
William Carrier
A.J. Greer
抱歉,如果这不是回答这个问题的地方,但我不确定还有什么地方可以问。
我正在尝试从 rotogrinders.com 抓取数据,我 运行 遇到了一些挑战。
特别是,我希望能够使用这种格式的 url 抓取以前的 NHL 游戏数据(显然你可以更改其他日期数据的日期): https://rotogrinders.com/game-stats/nhl-skater?site=draftkings&date=11-22-2016
但是,当我进入该页面时,我注意到数据被分解成页面,我不确定如何让我的脚本获取单击 "all"按钮在页面底部。
在 python 中有没有办法做到这一点?也许有些图书馆允许点击按钮?或者有什么方法可以通过巧妙地了解 URL/request?
而无需实际单击按钮来获取数据其实,在这种情况下,事情并没有那么复杂。当您单击 "All" 时,不会发出任何网络请求。所有 数据都已经存在 - 在 HTML 的 script
标签内,您只需要提取它即可。
使用 requests
(to download the page content), BeautifulSoup
的工作代码(解析 HTML 并找到所需的 script
元素),re
(从中提取所需的 "player" 数组脚本)和 json
(将数组字符串加载到 Python 列表中):
import json
import re
import requests
from bs4 import BeautifulSoup
url = "https://rotogrinders.com/game-stats/nhl-skater?site=draftkings&date=11-22-2016"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
pattern = re.compile(r"var data = (\[.*?\]);$", re.MULTILINE | re.DOTALL)
script = soup.find("script", text=pattern)
data = pattern.search(script.text).group(1)
data = json.loads(data)
# printing player names for demonstration purposes
for player in data:
print(player["player"])
打印:
Jeff Skinner
Jordan Staal
...
William Carrier
A.J. Greer