Scrapy从动态表格中提取数据

3
我正在尝试从网站http://www.oddsportal.com/basketball/usa/nba/results/中的table="table-main"中提取所有TD值。
我正在使用Scrapy和Python 2.7。
从Scrapy Shell中,我可以通过以下方式获取表格:
response.xpath('//*[@id="tournamentTable"]')

英译中:

但我似乎无法获得该表格的任何TR或TD。

response.xpath('//*[@id="tournamentTable"]/tbody')

and response.xpath('//*[@id="tournamentTable"]/tbody/tr')

返回一个空列表。我怀疑这个表可能是动态创建的。请问有人能帮我从那个表中抓取所有团队名称、分数和赔率吗?我已经卡在这里一段时间了。
这个问题与人们推荐的重复问题不同:Scrapy not finding table,因为那个问题是关于获取表格,而这个问题是关于获取表格中的数据。

可能是Scrapy找不到表格的重复问题。 - eLRuLL
1个回答

1

是的,结果需要通过额外调用网站API来加载。在这种情况下,请求将被发送到http://fb.oddsportal.com/ajax-sport-country-tournament-archive/3/MmbLsWh8/X0/1/-1/1/?_=1446338252826

我不确定您是否可以在爬虫中硬编码URL,因为至少URL的这些部分 3 和MmbLsWh8 实际上是来自主页上的 script 标记:

<script type="text/javascript">
    //<![CDATA[
    var op = new OpHandler();if(!page)var page = new PageTournament({"id":"MmbLsWh8","sid":3,"cid":200,"archive":true});var menu_open = null;vJs();op.init();if(page && page.display)page.display();    var sigEndPage = true;
    try
    {
        if (sigEndJs)
        {
            globals.onPageReady();
        }
    } catch (e)
    {
    }

    //]]>
</script>

此外,还有一个名为_的参数,看起来像是时间戳。
调用此AJAX URL将返回一个JSONP响应,其中包含NBA结果的HTML代码。您需要从响应中提取HTML代码(例如使用正则表达式),将其提供给Selector并提取结果。以下是一些示例代码,可帮助您入门:
$ scrapy shell http://www.oddsportal.com/basketball/usa/nba/results/
In [1]: fetch("http://fb.oddsportal.com/ajax-sport-country-tournament-archive/3/MmbLsWh8/X0/1/-1/1/?_=1446338252826")
In [2]: import re
In [3]: pattern = re.compile(r'"html":"(.*?)"}', re.MULTILINE | re.DOTALL)
In [4]: import scrapy
In [5]: selector = scrapy.Selector(text=pattern.search(response.body).group(1))
In [6]: # TODO: now use the selector to extract the desired data

谢谢,这个程序已经完成了我大部分需要的功能。但是它没有爬取包含在a href节点中的赔率。有什么建议可以修改以包括赔率吗? - SeekingAlpha
我该如何找到请求的URL?我已经在Chrome中尝试了“开发者工具->网络->XHR”,但它并不在那里。谢谢。 - quanly_mc
请查看以下网站:https://stackoverflow.com/questions/61012634/scrapy-get-dynamic-table-data - johnrao07

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接