网站内容抓取(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=&tag=h2得到文章标题,根据网站结构进行修改。
参考
有关 DOM 的更多信息,请参阅 PHP 参考 DOMDocument。
用于构建深度网络扫描仪的扩展。
有时您需要扫描 网站,但要更深一层。例如,您要构建 网站 网络树。这可以通过查找所有标签并按照 HREF 属性进入下一页来完成。获得子页面后,您可以继续扫描以完成树状图。比如抓取一张图片为例:?url=&tag=img
<p>