数千次获取此数据的最有效方法是什么?

时间:2011-03-14 23:53:27

标签: php html curl html-parsing scrape

使用PHP的 DOMDocument-&gt; loadHTML()系统获取以下数据(</b>标记后的4.0m)的最佳方法是什么?我猜某种CSS-stye选择器?

(LINE 240, always 240) <b>Current Price:</b> 4.0m

我一直在查看文档,但说实话,这对我来说完全不同寻常!此外,我如何能够从以下URL获取数千页的数据:

http://site.com/q=item/viewitem.php?obj=11928

obj=#最小值/最大值已知(我需要抓多少页),我想逐步抓取所有这些值,并输出name descriptionprice(并不是非常关心到目前为止的百分比上升/下降)到MySQL数据库,所以我可以从那里抓取它并在我的网站上显示它。

以下是我感兴趣的主要代码块:

<div class="subsectionHeader"> 
<h2> 
Item Name
</h2> 
</div> 
<div id="item_additional" class="inner_brown_box">  
Description of item goes here.
<br> 
<br> 
<b>Current Price:</b> 4.0m
<br><br> 
<b>Change in Price:</b><br> 
<span> 
<b>30 Days:</b> <span class="rise">+2.5%</span> 
</span> 
<span class="spaced_span"> 
<b>90 Days:</b> <span class="drop">-30.4%</span> 
</span> 
<span class="spaced-span"> 
<b>180 Days:</b> <span class="drop">-33.3%</span> 
</span> 
<br class="clear"> 
</div> </div> <div class="brown_box main_page"> 
<div class="subsectionHeader"> `

如果有人能提供关于如何解决这个问题的任何骨架提示,我们将不胜感激!

3 个答案:

答案 0 :(得分:1)

使用正则表达式解析HTML通常是个糟糕的主意,但在你的情况下,它可能是我的正确/简单方法。它足够快,可能比使用strpos和纯文本模式进行分块更灵活。

使用上面给出的源HTML尝试此示例:

//checked with php 5.3.3
if (preg_match('#<h2>(?P<itemName>[^>]+)</h2>.*?<div[^>]+id=([\'"])item_additional(\2)[^>]*>\s*(?P<description>[^<]+).*?<b>\s*Current\s+Price\s?:?</b>\s*(?P<price>[^<]+)#six',$src, $matches))
{
    print_r($matches);
} 

正则表达式可能看起来过于复杂,但是使用文档和漂亮的工具(如RegexBuddy或Expresso),任何人都可以编写简单的表达式;)

答案 1 :(得分:0)

您可以使用简单HTML DOM解析器 - http://simplehtmldom.sourceforge.net/

使用以下方法提取内容:

echo file_get_html('http://www.google.com/')->plaintext; 

然后使用PHP str函数找到4.0m。

答案 2 :(得分:0)

DOM解析是执行此操作的最有效方法。

如果您想要最快的方式,并且知道HTML结构是一致的,那么可能使用strpos来搜索偏移更快。但是,如果页面结构发生变化,则更有可能破坏。像这样:

$needles = array(
  'name' => "<div class=\"subsectionHeader\">\n<h2>\n"
  'description' => "<div id=\"item_additional\" class=\"inner_brown_box\">\n"
  'price' => "<b>Current Price:</b> "
);
$buffer = file_get_contents("http://site.com/q=item/viewitem.php?obj=1234");
$result = array();
foreach ($needles as $key => $needle) {
  $index1 = strpos($buffer, $needle);
  $index2 = strpos($buffer, "\n", $index1);
  $value = substr($buffer, $index1, $index2 - $index1);
  $result[$key] = $value;
}

您需要完全正确地取针,包括任何尾随空格。