【问题标题】:Scraping digit values from a webpage?从网页中抓取数字值?
【发布时间】:2011-02-05 07:11:46
【问题描述】:

我想从网站上抓取 17 个值。

这是包含数据的页面的网址:http://www.bungie.net/stats/reach/online.aspx

在页面的左下方有标题为“ONLINE PLAYLIST”的无序列表 我想抓取包含此类信息的每个列表项中的玩家数量。数字只能是数字,即没有逗号。

【问题讨论】:

  • 您只想要数字而不想要名称?或者你需要名字吗?

标签: php regex web-scraping


【解决方案1】:
$c = curl_init();
curl_setopt_array($c, array(
    CURLOPT_URL => 'http://www.bungie.net/stats/reach/online.aspx',
    CURLOPT_RETURNTRANSFER => true,
    ));
$r = curl_exec($c);
curl_close($c);

preg_match_all('|([^<>]+)</a> </h4>\s*([0-9,]+) Players|s', $r, $m);
$teams = array_combine($m[1], $m[2]);
foreach ($teams as &$v) $v = str_replace(',','',$v);
echo '<pre>'.print_r($teams,1).'</pre>';

目前的输出:

Array
(
    [NOBLE MAP PACK] => 997
    [RUMBLE PIT] => 4117
    [LIVING DEAD] => 6638
    [TEAM SLAYER] => 7730
    [MLG] => 586
    [TEAM SWAT] => 6358
    [TEAM SNIPERS] => 2145
    [TEAM OBJECTIVE] => 758
    [MULTI TEAM] => 1707
    [BIG TEAM BATTLE] => 5706
    [INVASION] => 2881
    [FIREFIGHT] => 2780
    [SCORE ATTACK] => 1121
    [CO-OP CAMPAIGN] => 695
    [TEAM ARENA] => 393
    [DOUBLES ARENA] => 680
    [FFA ARENA] => 120
)

编辑:修复了名称捕获组,以便捕获“CO-OP”,而不仅仅是“OP”。

【讨论】:

  • 是的,非常感谢,有什么方法可以在不使用浏览器的情况下每 15 分钟运行一次此脚本?
  • @AndrewFerrara ,谷歌搜索“cron 工作”,看看如何做到这一点。
  • @Mark Eirich 也是唯一的事情是当我尝试这样做时$nmp = $teams[NOBLE MAP PACK];print $nmp; php 认为 PACK 是打包/解包功能......
  • 我想我只是将其更改为获取 $m[2] 数组
  • 如果要指定数组的特定元素,则必须将键放在引号中,如下所示:$nmp = $teams['NOBLE MAP PACK'];print $nmp;
【解决方案2】:

在我看来,这里只需要一点正则表达式。我最近在 PERL 中做了类似的事情,这并不是非常棘手,并且在网上也有很多有用的线程和教程。

检查页面,看起来每个列表项都分配了一个名为“glowBox”的类。我会尝试获取页面的全文/源代码,然后进行过滤,以便您只有以此类开头的部分。或者,您可以使用前瞻或后瞻来检查数字是否在“之前或之后”。一旦缩小范围,您将需要一个捕获组来提取数字作为您以后可以使用的东西。在PERL,捕获的字符串会自动分配给变量 $1、$2、$3...等。如果您只是遍历执行正则表达式的无序列表的每一行,您应该只需要 $1 来捕获数字。

您的捕获组可能如下所示:(\d+)

括号使它成为一个捕获组,\d 它只会匹配数字字符,而 + 意味着为了捕获任何东西,\d 必须至少匹配一次。不确定您的要求是什么,但如果您同时需要名称和数字,PERL 可以轻而易举地从页面中抓取必要的数据并将其转换为带有键/值对的散列。

一定要看看http://www.regexr.com,有点像 CSS 禅宗花园的正则表达式。您可以将整个页面源粘贴到其中并使用正则表达式,直到它找到您想要的,并且只找到您想要的。有关正则表达式奇怪语法的更多信息和解释,请从 here 开始,显然,请使用 google。

编辑:似乎为时已晚。

【讨论】:

  • 还不算太晚。您的答案很好,因为它具有教育意义,而不是简单地解决问题。继续努力!
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2022-01-21
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多