使用scrapy搜寻动态网页以获取数据

乙醇胺

我正在尝试从NBA的官方统计数据中获取一些数据,以用于某些数据分析。我将scrapy用作主要的抓取工具。但是,在检查了网页元素之后,我发现它是使用javascript动态生成的。我对javascript完全陌生,无法弄清楚它是如何工作的(调用哪个js文件,如何将其加载到其中包含数据表以及是否有更容易访问的方式来获取数据)我也有在网络中找到了一些json文件,我不知道该如何使用。

http://stats.nba.com/teamLineups.html?TeamID=1610612739&pageNo=1&rowsPerPage=100&Season=2008-09&sortField=MIN&sortOrder=DES&PerMode=Per48

任何人都可以使用上面的URL指导我,并告诉我网站如何实际运行以加载数据,以及他们如何处理数据以这种方式显示?

关键部分仍然是如何获取数据。我已经看到了使用POST方法来获取数据的答案(对不起,我什至不熟悉GET / POST),但是我仍然不知道如何将其应用于此上下文。

感谢您的慷慨指导!

亚瑟·伯哈特(Arthur Burkhardt)

在此示例中,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Scrapy从动态网页中抓取网址

来自分类Dev

使用django和python的动态网页

来自分类Dev

使用硒解析动态网页

来自分类Dev

创建动态网页

来自分类Dev

VBA HTML 抓取。使用动态网页,但无法指明所需的特定数据点

来自分类Dev

搜寻网站和动态网址

来自分类Dev

在动态网页中使用Python抓取按钮下载csv

来自分类Dev

使用R从动态网页提取文本

来自分类Dev

动态网页的搜索功能

来自分类Dev

无法抓取动态网页

来自分类Dev

网页抓取动态网页Python

来自分类Dev

使用python scrapy进行动态网址爬网

来自分类Dev

Python Scrapy动态网站

来自分类Dev

Python Scrapy动态网站

来自分类Dev

使用BeautifulSoup搜寻网页以获取链接标题和URL

来自分类Dev

在python中使用selenium从动态网站获取数据:如何发现数据库查询的完成方式?

来自分类Dev

Scrapy搜寻器将不会搜寻任何网页

来自分类Dev

我回来后的动态网页

来自分类Dev

如何通过Python抓取动态网页

来自分类Dev

如何查看动态网页是否被更新?

来自分类Dev

动态网页设计,新手

来自分类Dev

在python循环中刷新动态网页

来自分类Dev

如何为从数据库中提取的客户端创建动态网页

来自分类Dev

在asp.net中保存动态网页配置数据的最佳方法

来自分类Dev

使用Ghost.py用python屏幕抓取动态网页

来自分类Dev

如何使用PHP从动态网页中抓取页面链接?

来自分类Dev

使用Selenium从动态网页中抓取内容会返回错误的内容

来自分类Dev

当内容不断变化时,使用Firebug或Chrome开发工具检查动态网页

来自分类Dev

如果在网址中使用https,则不会显示动态网页内容