我正在尝试从NBA的官方统计数据中获取一些数据,以用于某些数据分析。我将scrapy用作主要的抓取工具。但是,在检查了网页元素之后,我发现它是使用javascript动态生成的。我对javascript完全陌生,无法弄清楚它是如何工作的(调用哪个js文件,如何将其加载到其中包含数据表以及是否有更容易访问的方式来获取数据)我也有在网络中找到了一些json文件,我不知道该如何使用。
任何人都可以使用上面的URL指导我,并告诉我网站如何实际运行以加载数据,以及他们如何处理数据以这种方式显示?
关键部分仍然是如何获取数据。我已经看到了使用POST方法来获取数据的答案(对不起,我什至不熟悉GET / POST),但是我仍然不知道如何将其应用于此上下文。
感谢您的慷慨指导!
在此示例中,JavaScript仅允许在网页上发送,接收和显示内容,而无需为每个请求实际重新加载网页。因此,您无需解析javascript,只需要查找请求的信息,然后模仿该请求,然后解析响应即可。为此,您可以在Firefox中使用Firebug,或在Chrome中使用开发人员工具(在Windows中为ctrl + shift + J,在Mac中为cmd + opt + J)。在Chrome浏览器中,只需单击“网络”标签,然后在网站上单击即可看到请求和响应。
在此特定示例中,当您想要获取“ 2008-09”的克里夫兰队的统计信息时,javascript将发送多个请求。您可能会对感兴趣的节目单请求是这样的:http : //stats.nba.com/stats/teamdashlineups? PlusMinus=N&pageNo=1&GroupQuantity=5&TeamID=1610612739&GameID=&Location=&SeasonType=Regular+Season&Season=2008- 09&PaceAdjust = N&DateFrom =&sortOrder = DES&VsConference =&OpponentTeamID = 0&DateTo =&GameSegment =&LastNGames = 0&VsDivision =&LeagueID = 00&Outcome =&GameScope =&MeasureType = Base&PerMode = Per48&sortField = MIN&SeasonSegth = &&
这是一个易碎的基础蜘蛛的例子。您只需要定义LineupItem,然后可以使用来执行它scrapy crawl stats -o output.json
。
import json
from scrapy.spider import Spider
from scrapy.http import Request
from nba.items import LineupItem
from urllib import urlencode
class StatsSpider(Spider):
name = "stats"
allowed_domains = ["stats.nba.com"]
start_urls = (
'http://stats.nba.com/',
)
def parse(self, response):
return self.get_lineup('1610612739','2008-09')
def get_lineup(self, team_id, season):
params = {
'Season': season,
'SeasonType': 'Regular Season',
'LeagueID': '00',
'TeamID': team_id,
'MeasureType': 'Base',
'PerMode': 'Per48',
'PlusMinus': 'N',
'PaceAdjust': 'N',
'Rank': 'N',
'Outcome': '',
'Location': '',
'Month': '0',
'SeasonSegment': '',
'DateFrom': '',
'DateTo': '',
'OpponentTeamID': '0',
'VsConference': '',
'VsDivision': '',
'GameSegment': '',
'Period': '0',
'LastNGames': '0',
'GroupQuantity': '5',
'GameScope': '',
'GameID': '',
'pageNo': '1',
'rowsPerPage': '100',
'sortField': 'MIN',
'sortOrder': 'DES'
}
return Request(
url="http://stats.nba.com/stats/teamdashlineups?" + urlencode(params),
dont_filter=True,
callback=self.parse_lineup
)
def parse_lineup(self,response):
data = json.loads(response.body)
for lineup in data['resultSets'][1]['rowSet']:
item = LineupItem()
item['group_set'] = lineup[0]
item['group_id'] = lineup[1]
item['group_name'] = lineup[2]
item['gp'] = lineup[3]
item['w'] = lineup[4]
item['l'] = lineup[5]
item['w_pct'] = lineup[6]
item['min'] = lineup[7]
item['fgm'] = lineup[8]
item['fga'] = lineup[9]
item['fg_pct'] = lineup[10]
item['fg3m'] = lineup[11]
item['fg3a'] = lineup[12]
item['fg3_pct'] = lineup[13]
item['ftm'] = lineup[14]
item['fta'] = lineup[15]
item['ft_pct'] = lineup[16]
item['oreb'] = lineup[17]
item['dreb'] = lineup[18]
item['reb'] = lineup[19]
item['ast'] = lineup[20]
item['tov'] = lineup[21]
item['stl'] = lineup[22]
item['blk'] = lineup[23]
item['blka'] = lineup[24]
item['pf'] = lineup[25]
item['pfd'] = lineup[26]
item['pts'] = lineup[27]
item['plus_minus'] = lineup[28]
yield item
这将导致像这样的json记录:
{"gp": 30, "fg_pct": 0.491, "group_name": "Ilgauskas,Zydrunas - James,LeBron - Wallace,Ben - West,Delonte - Williams,Mo", "group_set": "Lineups", "w_pct": 0.833, "pts": 103.0, "min": 484.9866666666667, "tov": 13.3, "fta": 21.6, "pf": 16.0, "blk": 7.7, "reb": 44.2, "blka": 3.0, "ftm": 16.6, "ft_pct": 0.771, "fg3a": 18.7, "pfd": 17.2, "ast": 23.3, "fg3m": 7.4, "fgm": 39.5, "fg3_pct": 0.397, "dreb": 32.0, "fga": 80.4, "plus_minus": 18.4, "stl": 8.3, "l": 5, "oreb": 12.3, "w": 25, "group_id": "980 - 2544 - 1112 - 2753 - 2590"}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句