【问题标题】:Scrapy extract data from dynamic tableScrapy从动态表中提取数据
【发布时间】:2016-02-01 04:18:55
【问题描述】:

我正在尝试从网站的 table="table-main" 中提取所有 TD 值:http://www.oddsportal.com/basketball/usa/nba/results/

我正在使用 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,因为这个问题是关于获得桌子的。这个问题是关于获取表中的数据。

【问题讨论】:

标签: python python-2.7 web-scraping scrapy


【解决方案1】:

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

我不确定你是否可以在你的蜘蛛中硬编码 URL,因为至少有这些 URL 的 3MmbLsWh8 部分实际上来自主页上的 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 并提取结果。一些来自 shell 的示例代码可以帮助您入门:

$ 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 节点中包含的赔率。关于可以修改哪些内容以包含赔率的任何提示?
  • 如何找到请求的 url?我在 chrome 中尝试了“开发者工具 -> 网络 -> XHR”,但它不存在。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2021-12-01
  • 2018-11-15
  • 2016-03-11
  • 2018-05-23
  • 2022-01-22
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多