我想使用Python从https://www.bovada.lv/sports/football/nfl抓取所有NFL投注行/信息。
在SO社区的帮助下,我找到了NFL游戏的API:https://www.bovada.lv/services/sports/event/v2/events/A/description/football/nfl
您可以在我的pastebin上查看有关代码的更多信息: https://pastebin.com/tmAenaBD
到目前为止,这是我的代码:
#Just a heads up...The code loads slow since it is printing the entire source
import requests
source = requests.get("https://www.bovada.lv/services/sports/event/v2/events/A/description/football/nfl").json()
print(source)
我可以在代码中看到数据,但是,我不知道如何解析它。有什么建议吗?
我要寻找的投注行信息包括所有游戏的以下内容(本周共13场比赛):
1)游戏日期
2)游戏时间
3)团队(每场比赛两支球队)
4)点差(赔率)
5)获胜又名“钱线”(赔率)
6)总数又名“大/小”(赔率)
这是第一款游戏的照片:
如果可能,我希望所有游戏。
我是新手,没有任何编码经验。感谢您能提供的任何帮助,对于您的时间和精力,我深表感谢。
答案 0 :(得分:2)
您几乎在那里。您已经到达端点,并将源转换为python对象(或python对象的集合),.json()
就是这样做的。
因此,现在您正在寻找一种访问所需数据的系统方法,但是您不确定数据的结构...因此,解决该问题的最简单方法就是查看它。
Python具有内置功能,可帮助您找出什么对象。您最好的朋友是函数type()
。让我们看看source
是什么:
>>> type(source)
<class 'list'>
好的,所以source是一个列表,因此我们可以测试它的长度:
>>> len(source)
1
好的,所以它是一个列表,里面只有一个元素。列表中包含什么?
>>> type(source[0])
<class 'dict'>
好的,所以source
是一个list
,里面有一个dict
。 dict
必须位于所有数据所在的位置,请隔离它:
>>> data = source[0]
Python dict
具有一些方便的功能,这些功能也可以进行检查。首先,我们可以看看keys
的{{1}}是什么:
data
因此只有2个键,一个称为>>> data.keys()
dict_keys(['path', 'events'])
,另一个称为path
。在寻找每个游戏的投注信息时,让我们看一下events
键,首先我们将看到它的含义:
events
好的,大概是NFL比赛的清单,该清单的内容是什么类型:
>>> type(data['events'])
<class 'list'>
>>> len(data['events'])
13
所以它们都是>>> set(type(e) for e in data['events'])
{<class 'dict'>}
,它们都具有相同的结构吗?
dicts
是的,所有结构都相同。是什么结构?
>>> all(data['events'][0].keys() == e.keys() for e in data['events'][1:])
True
同样,您必须先了解实际的一切,然后才能进行推理:
>>> data['events'][0].keys()
dict_keys(['id', 'description', 'type', 'link', 'status', 'sport', 'startTime', 'live', 'awayTeamFirst', 'denySameGame', 'teaserAllowed', 'competitionId', 'notes', 'numMarkets', 'lastModified', 'competitors', 'displayGroups'])
在这些键中,只有两个将集合作为值>>> for k, v in data['events'][0].items():
... print(k, type(v))
...
id <class 'str'>
description <class 'str'>
type <class 'str'>
link <class 'str'>
status <class 'str'>
sport <class 'str'>
startTime <class 'int'>
live <class 'bool'>
awayTeamFirst <class 'bool'>
denySameGame <class 'bool'>
teaserAllowed <class 'bool'>
competitionId <class 'str'>
notes <class 'str'>
numMarkets <class 'int'>
lastModified <class 'int'>
competitors <class 'list'>
displayGroups <class 'list'>
和competitors
。因此,任何市场数据都必须包含在其中任何一个中。
我不会为您做全部工作,但我希望您能理解。当您使用没有任何文档的外部数据源时,请系统地检查对象,以了解您要处理的内容。