【问题标题】:Scraping Web data with Python使用 Python 抓取 Web 数据
【发布时间】:2016-11-25 18:58:12
【问题描述】:

很抱歉,如果这不是这个问题的地方,但我不知道还有什么地方可以问。

我正在尝试从 rotogrinders.com 抓取数据,但遇到了一些挑战。

特别是,我希望能够使用这种格式的 url 抓取以前的 NHL 比赛数据(显然您可以更改其他日期数据的日期): https://rotogrinders.com/game-stats/nhl-skater?site=draftkings&date=11-22-2016

但是,当我进入该页面时,我注意到数据被分解为多个页面,并且我不确定如何让我的脚本获取在单击“全部”按钮后显示的数据页面底部。

有没有办法在 python 中做到这一点?也许一些允许点击按钮的库?或者有什么方法可以通过巧妙地处理 URL/请求来获取数据而无需实际单击按钮?

【问题讨论】:

  • "也许是一些允许点击按钮的库?"硒。
  • 到目前为止你做了什么,如果你展示了一些代码或尝试完成人们更愿意帮助的任务。

标签: python web python-requests screen-scraping


【解决方案1】:

实际上,在这种情况下,事情并没有那么复杂。当您单击“全部”时不会发出网络请求。所有数据都已经存在 - 在 HTML 中的 script 标记内,您只需提取它即可。

工作代码使用requests(下载页面内容)、BeautifulSoup(解析 HTML 并定位所需的script 元素)、re(从脚本中提取所需的“玩家”数组)和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

【讨论】:

  • 非常感谢!我听说过 BeautifulSoup,但之前使用它时运气不佳。显然,我需要阅读更多文档才能真正掌握它的全部功能。再次感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多