【问题标题】:How to complete an ADVANCED Web Scrape of NBA player props?如何完成 NBA 球员道具的高级网页抓取?
【发布时间】:2018-11-10 22:53:39
【问题描述】:

我想从https://www.bovada.lv 刮取 NBA 球员的道具投注。我将问题命名为 ADVANCED,因为有多个团队、球员和类别。

这是所要求的 HTML 代码:

https://pastebin.com/UkY071uV

以下链接可将您直接带到篮球部分https://www.bovada.lv/sports/basketball

开始...

NBA 球员道具位于篮球区。如果您单击每个游戏旁边的箭头或“>”,它将带您进入另一个投注页面。如果玩家道具已发布,您可以在页面底部附近的“玩家道具”部分找到它们(注意:道具在游戏开始前发布)。

这是我正在寻找的一位玩家的数据样本:

Total Points - LeBron James (LAL)
28.5     -115     -115

我想抓取所有球员的姓名、类别和投注赔率。不幸的是,我没有走得太远。到目前为止我所学的方法都没有成功。

#import modules

from bs4 import BeautifulSoup
import requests, os
from selenium import webdriver

#initiate Selenium

os.chdir('C:\webdrivers')

#enter user agent

header = {'User-agent' : 'ENTER USER_AGENT HERE'}
options = webdriver.ChromeOptions(); options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.bovada.lv/sports/basketball/nba')
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()

#attempt at printing soup 
print(soup)

我在代码中找不到任何相应的玩家。我认为寻求帮助不会有什么坏处。也许有更多经验的人知道如何做到这一点,或者可以帮助我朝着正确的方向前进。

我是网络抓取的新手,非常感谢您提供的任何帮助。提前感谢您的宝贵时间!

【问题讨论】:

  • 我实际上无法查看,因为该站点在此处不可用,但您是说您需要导航到通过单击篮球部分提供的每个可用页面,然后在您需要的每个道具页面上刮掉显示的信息?您能否使用edit 提供的 sn-p 工具分享最初的第一页 HTML?还是整个页面HTML的pastebin太长了?
  • 您可能可以编写一些简单的东西来抓取页面链接,然后遍历它们导航到它们(如果使用 selenium)调用自定义函数,该函数提取返回列表所需的信息并从中构建最终数据框列表列表。假设所有项目都出现在每个页面上。无论如何,开始的想法。
  • @QHarr... 这有帮助吗?如果需要,我可以再吃一些。
  • 那么,这是您导航到的页面之一?您可以右键单击检查并在开发工具上复制 html 元素(在页面顶部)并将 html 粘贴到 pastebin 中吗?对于您所展示的内容,我只能说 -115 可以由 .bet-price 的 css 选择器选择,但我不知道这种情况发生的频率以及每个道具是否存在(可能但看不到)。另外,看不到其他信息。
  • 由于我无法正确查看页面,因此很难确定,但看起来您最初可以使用类名来隔离信息。例如,标题在 .league-header 的 css 选择器中,然后在 .coupon-content.markets-container 中的其余信息。如果可以查看该页面的人提供进一步的帮助,恐怕会更好。

标签: javascript python selenium web-scraping beautifulsoup


【解决方案1】:

此站点使用内部 JSON api 来获取数据。您的示例的完整 JSON 数据可在此处找到:https://www.bovada.lv/services/sports/event/v2/events/A/description/basketball/nba/los-angeles-lakers-sacramento-kings-201811102200?lang=en

使用 提取数据的示例:

curl -s "https://www.bovada.lv/services/sports/event/v2/events/A/description/basketball/nba/los-angeles-lakers-sacramento-kings-201811102200?lang=en" | \
     jq '.[0].events[0].displayGroups[] | 
         select(.description=="Player Props") | 
         .markets[] | 
         select(.description=="Total Points - LeBron James (LAL)")' 

import requests

r = requests.get('https://www.bovada.lv/services/sports/event/v2/events/A/description/basketball/nba/los-angeles-lakers-sacramento-kings-201811102200?lang=en')

player_props = [
    t["markets"]
    for t in r.json()[0]["events"][0]["displayGroups"]
    if t["description"] == "Player Props"
]
specific_player = [
    t
    for t in player_props[0]
    if t["description"] == "Total Points - LeBron James (LAL)"
]
print(specific_player)

【讨论】:

  • 这是我收到的:for t in r.json()[0]["events"][0]["displayGroups"] IndexError: list index out of range.... I看到您在代码中只输入了 Lebron 的名字。无论如何要刮掉所有玩家的名字@Bertrand Martel?感谢您的尝试。我明天再试一次。
  • 您的原始链接bovada.lv/sports/basketball/nba/… 也不再返回任何数据
  • 我会研究你的代码,看看我能从中学到什么。谢谢@Bertrand Martel!
  • @Andersson 先生,有没有更简单的方法可以做到这一点?每天有很多场比赛。上面的代码看起来只适用于一个游戏和一个玩家。我希望每场比赛都能吸引所有玩家。
  • 我一直在从@Bertrand Martel 的回答中学习。它非常彻底,社区可以从中学到很多东西。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多