网站内容抓取(PHP5中抓取一个网站的提取信息是非常有价值的)

优采云 发布时间: 2022-03-23 02:08

  网站内容抓取(PHP5中抓取一个网站的提取信息是非常有价值的)

  很多时候,获取 网站 并从特定标签中提取信息非常有价值。这种基本机制可用于在网络上搜索有价值的信息。在其他时候,您可能需要获得

  <IMG>

  标签和 SRC 属性,或标签和相应的 HREF 属性的列表。可能性是无止境。

  1、首先新建一个捕获类:capture.php

  class Capture {

public $content;

  2、获取目标的内容网站。乍一看,我们似乎应该发出一个 cURL 请求,或者干脆使用 file_get_contents()。这些方法的问题是我们最终不得不进行大量的字符串操作,并且可能不得不过度使用可怕的正则表达式。为了避免这一切,我们将简单地利用已经存在的 PHP 7 类 DOMDocument。所以我们创建了一个 DOMDocument 实例并将其设置为 UTF-8。我们不关心空格并使用方便的 loadHTMLFile() 方法将 网站 的内容加载到对象中:

  public function getContent($url)

{

if (!$this->content) {

if (stripos($url, 'http') !== 0) {

$url = 'http://' . $url;

}

$this->content = new DOMDocument('1.0', 'utf-8');

$this->content->preserveWhiteSpace = FALSE;

// @ used to suppress warnings generated from // improperly configured web pages

@$this->content->loadHTMLFile($url);

}

return $this->content;

}

  请注意,我们在调用 loadHTMLFile() 方法之前添加了 @。这不是为了掩盖 PHP 中的错误编码(!)

  就像经常发生在 5 中一样!相反,当解析器遇到编写不佳的 HTML 时,@ 会抑制结果通知。相反,当解析器遇到写得不好的 HTML 时,@

  生成的通知被禁止。大概我们可以捕获这些通知并记录它们,也许给我们的 Capture 类一个诊断功能。

  3、接下来,提取感兴趣的标签。为此,我们使用 getElementsByTagName() 方法。如果我们希望提取所有标记,我们可以提供 * 作为参数:

  public function getTags($url, $tag)

{

$count = 0;

$result = array();

$elements = $this->getContent($url)

->getElementsByTagName($tag);

foreach ($elements as $node) {

$result[$count]['value'] = trim(preg_replace('/\s+/', ' ', $node->nodeValue));

if ($node->hasAttributes()) {

foreach ($node->attributes as $name => $attr)

{

$result[$count]['attributes'][$name] =

$attr->value;

}

}

$count++;

}

return $result;

}

  4、提取某些属性而不是标签也可能有意义。所以我们为此定义了另一种方法。在这种情况下,我们需要解析所有标签并使用 getAttribute()。您会注意到 DNS 域有一个参数。我们添加此参数以使扫描保持在同一域内(例如,如果您正在构建网络树):

  public function getAttribute($url, $attr, $domain = NULL)

{

$result = array();

$elements = $this->getContent($url)

->getElementsByTagName('*');

foreach ($elements as $node) {

if ($node->hasAttribute($attr)) {

$value = $node->getAttribute($attr);

if ($domain) {

if (stripos($value, $domain) !== FALSE) {

$result[] = trim($value);

}

} else {

$result[] = trim($value);

}

}

}

return $result;

}

  5、最终执行。例如,访问传入的?url=&amp;tag=h2得到文章标题,根据网站结构进行修改。

  参考

  有关 DOM 的更多信息,请参阅 PHP 参考 DOMDocument。

  用于构建深度网络扫描仪的扩展。

  有时您需要扫描 网站,但要更深一层。例如,您要构建 网站 网络树。这可以通过查找所有标签并按照 HREF 属性进入下一页来完成。获得子页面后,您可以继续扫描以完成树状图。比如抓取一张图片为例:?url=&amp;tag=img

<p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线