了解如何从头开始使用 PHP 轻松创建和编写您自己的简单网络抓取工具。
PHP(HyPertext PreProcessor超文本预处理器)是一种用于网络开发的脚本语言,可用于收集网络数据。在这篇文章中,我们将介绍:
为什么使用PHP
开始使用 PHP
通过 3 个简单的步骤使用 PHP 进行网页抓取
为什么使用PHP
PHP 目前支持约 40% 的网络,包括 WordPress 和 Slack 等网站。在 Web 开发方面,它是更流行的服务器端脚本语言之一。对于那些使用 MySQL 的人来说,他们的数据库是密切相关的。它是一种相对容易学习的语言,具有良好的文档和库,可以减少开发时间。
开始使用 PHP
本指南将介绍一种手动网络抓取的方法,您可以将机器人发送到网络服务器并使用 PHP 作为基础编程语言收集数据。这与使用可以简化流程的 全自动数据收集工具相反。
网络抓取工具将通过向服务器发送 HTTP 请求然后收集网站代码来发挥作用。然后,我们将教您如何解析检索到的信息。
以下是可能出现在您希望抓取的网站标题中的代码片段示例:
<html><body><h1>This is a heading!</h1></body></html>
一旦检索到此代码,就需要对其进行解析,以便分析人员可以阅读和理解文本。在此示例中,解析后,您将得到以下纯文本:
‘This is a heading!’
开始之前,请确保您的计算机上安装了PHP。
通过 3 个简单的步骤使用 PHP 进行网页抓取
第一步:收集目标网站的代码
首先输入以下代码:
<?php
$code = file_get_contents (“http://quotes.toscrape.com”);
?>
在编码约定方面:
“<?php”和“?>”用于所有 PHP 文档中命令的开头和结尾。
第二行设置一个名为“$code”的变量,它与相关 URL 的内容有关,在本例中,我们将定位:“http://quotes.toscrape.com”。 这将有助于URL 代码存储在“$code”变量中。
更喜欢全自动网络抓取解决方案?立即获取免费演示
第二步:解析网页
这项工作旨在收集来自该网站的所有报价:

报价网站上的报价文本
右键单击目标页面并单击“查看页面源代码”,将打开一个包含源代码的新窗口。在我们的示例中,您会注意到所有引号都包含在 <span> 标记中,并且带有 itemprop 属性的“text”类也设置为“text”,如下所示:

引用代码示例
我们将首先利用 PHP 去除代码中所有不需要的文本,<span> 标记中出现的引号除外,然后使用“echo”功能将其显示在我们的屏幕上:
<?php
$code = file_get_contents("http://quotes.toscrape.com");
$code = str_replace(">", "<>", $code);
$splitCode = explode("<", $code);
// Find the first occurance of the opening tag of the quotes:
$openingTag = array_search('span class="text" itemprop="text"', $splitCode, true);
// Find the first occurance of the closing tag of the quotes
$closingTag = array_search('/span', $splitCode, true);
// Now, find the text in between the tags
$i = $openingTag;
$total = "";
while ($i < $closingTag) {
$total = $total . $splitCode[$i];
$i = $i + 1;
}
$final = substr($total, 37);
echo $final;
?>
在第 2 行,它将代码中所有出现的“>”替换为“<>”。这样它就可以在第 5 行中与“<”一起拆分。现在,它具有代码中所有标签的数组。在第 8 行,我们的程序找到开始 <span> 标记的位置,并在第 11 行找到 </span> 结束标记的位置。
现在需要做的就是检索这两次事件之间的文本。它通过创建一个名为“i”的变量来实现这一点,该变量的值是开始标记变量的位置。然后它创建一个变量,以便稍后将结果输入。在第 16 行,它开始遍历开始标记后的每个字母,将字母添加到总值,然后增加变量“i”。一旦它通过了结束标签,循环就会停止。
接下来,它会删除最终字符串的前 37 位数字,因为前 37 位数字是我们正在解析的标记中的数字——<span> 标记。最后,它使用“回声函数”检索最终结果。
运行该程序后,它将看起来像这样:
“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
这是我们在没有任何“非人类友好”代码的情况下抓取的网站上显示的第一条引述。
第三步:循环
您可能已经注意到,它只收集第一次出现的情况,之后就没有了。为了解决这个问题,我们可以简单地删除我们刚刚返回的事件,然后重复这个过程,直到我们检索到它们。此外,我们可以通过将抓取过程放入一个函数中来简化我们的代码,以便它可以在我们需要的时候运行。尝试使用此代码:
<?php
$code = file_get_contents("http://quotes.toscrape.com");
$code = str_replace(">", "<>", $code);
$splitCode = explode("<", $code);
functionparseCode($splitCode) {
// Find the first occurance of the opening tag of the quotes:
$openingTag = array_search('span class="text" itemprop="text"', $splitCode, true);
// Find the first occurance of the closing tag of the quotes:
$GLOBALS[closingTag] = array_search('/span', $splitCode, true);
// Now, find the text in between the tags
$i = $openingTag;
$total = "";
while ($i < $GLOBALS["closingTag"]) {
$total = $total . $splitCode[$i];
$i = $i + 1;
}
// Run the function, then update splitCode to delete the previous occurance// that it can be repeated for the next quote, then loop through 3 times// (You can change how many times):parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
?>
您可能已经注意到,我们之前的代码已被输入到名为“parseCode”的函数中,其中包含一个名为“$splitCode”的参数,以便它可以访问代码,然后“回显”结果。'parseCode' 函数在第 27 行运行,然后在第 28 行,我们的程序删除了之前出现的结束标记,以便可以复制它。第 27 行和第 28 行只是简单地重复了大约3 次,以便程序可以识别一种模式并发现下一次出现的情况。
最后,我们将结束标记作为一个具有“$GLOBALS”超全局范围的“全局变量”输入,在第 21 行,我们在它返回的每一行周围输入 <p> 标记,这样它将为每个新的新行创建一个新行引用它解析的。这是结果:
“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
“There are only two ways to live your life. One is as though nothing is a miracle. TheOther is as though everything is a miracle.”
“Try not to become a man of success. Rather become a man of value.”
结果正是我们想要的。没有代码,只有可读的文本。几乎任何目标站点都可以复制此过程,例如从 eBay 中抓取目标数据点,比如产品定价、评论和 SKU(库存单位)。
总结
使用 PHP 在网络上抓取目标数据可能是一个有效的过程,尽管速度较慢/手动过程。公司可能想要考虑的一种可行替代方案是简单地购买现成的数据集。这可以节省时间和资源,使您和您的团队可以将所有注意力转移到扩展业务、确保客户满意度以及专注于核心产品开发上。