【问题标题】:Scraping simple javascript page抓取简单的javascript页面
【发布时间】:2012-04-20 02:48:33
【问题描述】:

我想抓取这个网站的数据(http://www.oddsportal.com/matches/soccer),以便以这种方式获取包含比赛信息和赔率信息的纯文本文件:

00:30   Criciuma - Atletico-PR                    1:2   2.70    3.24    2.41    
10:45   Vier-und Marschlande - Concordia Hamburg  0:0   4.00    3.53    1.68    
10:45   Germania Schnelsen - ASV Bergedorf 85     2:3   1.95    3.37    3.23    
10:45   Barmbecker SG - Altona                    0:2   3.67    3.37    1.82

我以前用 w3m 做这个,但现在他们似乎将 html 更改为 javascript 并且 w3m 不起作用。数据仅包含在一个 div 中。这是一个条目

<tr xeid="862487"><td class="table-time datet t1333724400-1-1-0-0 ">17:00</td><td class="name table-participant" colspan="2"><a href="/soccer/italy/serie-b-2011-2012/brescia-marmi-lanza-verona-862487/">Brescia - Verona</a></td><td class="odds-nowrp" xoid="40456791" xodd="xzc0fxzxa">-</td><td class="odds-nowrp" xoid="40456793" xodd="cz0ofxz9c">-</td><td class="odds-nowrp" xoid="40456792" xodd="cz9xfcztx">-</td><td class="center info-value">17</td></tr>

我能做什么?

【问题讨论】:

  • 您能否提供更多关于他们如何使用 Javascript 的信息?这将决定潜在的解决方案。
  • 我仍然可以看到 HTML 源代码中的值。
  • @Fenisko 我不能。怎么可能?
  • 不知道。在 Firefox 中,我可以在可识别的 HTML 中看到表格。所以我想用 BeautifulSoup 工作 20 分钟 ;-)。
  • @Fenisko - 仅仅因为你可以在 Firefox 中看到它并不意味着它在响应中。

标签: javascript screen-scraping web-scraping w3m


【解决方案1】:

如果他们使用 Javascript 从服务获取数据并将其呈现在 DIV 中,W3M 将不会显示使用该数据更新的 div,因为它不支持 Javascript。

你有两个选择:

  • 对他们的 Javascript 进行逆向工程以找出数据的来源,并查看您是否可以直接查询该数据源以获取他们用于更新 DIV 的 XML 或 JSON。然后你可以完全跳过抓取。但是,他们可能不希望您这样做,并且可能已经保护了数据源以防止它发生。或者他们可能没有。

  • 在开始抓取之前使用执行 Javascript 的浏览器。这样,您将使用数据填充 div。 W3M-js 可能 为您执行此操作,或者您可能想尝试其他方法(lynx 或 links)。 This question 似乎是相关的。

ETA:也许PhantomJS 会在这里有所帮助?

【讨论】:

  • 我不知道如何从他们的服务中获取数据。 “在开始抓取之前使用执行 Javascript 的浏览器”是什么意思?我需要以自动方式在不同时间收集数据。
  • 如果您查看在其 div 中构建内容的源 JS,它可能表明它从哪里获取数据。您可以获得相同的数据(以 XML 或 JSON 格式)并在他们没有保护数据的情况下跳过抓取。就浏览器而言:因为他们使用 JS 来呈现数据,所以他们指望他们的查看器启用了 JS。 W3M 不支持 JS,所以它不渲染数据。我会相应地更新我的答案。
  • w3m-js 似乎已经从网络上消失了 :(
  • 我同意你所说的,除了关于保护数据的部分。如果您可以在浏览器中看到数据,那么您可以抓取它。
  • 也许吧。我可以想象服务被设置为在请求中需要某些标准(例如 cookie 或类似的会话令牌);这样的标准当然可以以某种方式被模仿或欺骗,但它会使定期从服务中提取数据变得不那么简单。
【解决方案2】:

最简单的方法(虽然可能不是最好的)是使用 selenium/watir。在红宝石中我会这样做:

require 'watir-webdriver'
require 'csv'
@browser = Watir::Browser.new
@browser.goto 'http://www.oddsportal.com/matches/soccer/'
CSV.open('out.csv', 'w') do |out|
    @browser.trs(:class => /deactivate/).each do |tr|
        out << tr.tds.map(&:text)
    end
end

【讨论】:

  • 是的,还有 jruby 和 htmlunit。我想你会发现 /odd/ 只会给出奇数行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2020-03-06
  • 2022-11-17
相关资源
最近更新 更多