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

问题描述 投票:0回答:3

使用 PHP 的 DOMDocument->loadHTML()

 系统获取以下数据(
</b>标签后的 4.0m)的最佳方法是什么?我猜是某种 CSS 样式选择器?

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



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

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



obj=#

最小/最大值是已知的(我需要刮掉多少页),我想逐步抓取所有这些值,并输出
name
description
price
(不太关心到目前为止的上升/下降百分比)到 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"> `

如果有人可以提供有关如何解决此问题的任何基本提示,我们将不胜感激!

php html web-scraping curl html-parsing
3个回答
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 这样的好工具,任何人都可以编写简单的表达式;)


0
投票
您可以使用简单 HTML DOM 解析器 -

http://simplehtmldom.sourceforge.net/

使用以下方法提取内容:

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

然后使用 PHP str 函数定位 4.0m。


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;
}

您需要使针完全正确,包括任何尾随空白。
    

© www.soinside.com 2019 - 2024. All rights reserved.