PHP 爬虫实战:从百度搜索结果中提取所需数据
随着互联网高速发展,信息爆炸的时代已经到来。在这样的时代,搜索引擎成为了我们获取信息的主要工具,而这些搜索引擎所提供的海量数据让我们难以想象。然而,对于一些特定领域的研究者或者数据分析员来说,他们所需要的信息可能只是这些搜索结果中的一小部分数据。在这种情况下,我们需要使用爬虫程序来准确地获取我们想要的数据。
在本文中,我们将使用 PHP 编写一个简单的爬虫程序,从百度搜索结果中提取我们所需的数据。这个程序的核心是使用 PHP 的 cURL 库模拟 HTTP 请求,然后使用正则表达式等方法解析 HTML 页面。
思路
在开始编写爬虫程序之前,我们需要先明确几个问题:
- 目标:我们想要从百度搜索结果页中爬取什么数据?
- URL:我们需要获取哪个 URL 下的数据?
- 数据格式:百度搜索结果页的数据是什么格式?
在考虑我们需要获取哪些数据时,让我们以“PHP 爬虫”这个关键词为例。如果我们在百度上搜索这个关键词,我们能够看到以下信息:
- 搜索结果的总数量
- 每个搜索结果的标题
- 每个搜索结果的描述
- 每个搜索结果的网址
那么,我们就可以将我们的目标定义为从百度搜索结果中提取出每个结果的标题、描述和网址。
获取数据的第一步就是要明确我们要获取的 URL。在我们的例子中,我们需要获取的 URL 是这样的:https://www.baidu.com/s?wd=php%20爬虫
。通过在百度搜索栏中输入“php 爬虫”,我们可以自动跳转到这个 URL。
接着,我们需要了解我们将要解析的数据的格式。在我们的例子中,搜索结果以类似下面的 HTML 代码的形式存在:
<div class="result c-container "> <h3 class="t"> <a href="http://www.example.com/" target="_blank" class="c-showurl"> www.example.com </a> <em>PHP</em> 爬虫是什么? - PHP 入门教程 - 极客学院 </h3> <div class="c-abstract"> <span class=" newTimeFactor_before_abs">2天前 - </span> <em>PHP</em> 爬虫是一种方便快捷的数据采集方式 ... 目前的爬虫主要是通过<a href="https://www.baidu.com/s?wd=python%20爬虫&rsp=1&f=8&ie=utf-8&tn=95754739_hao_pg" target="_blank" class="text-underline">python 爬虫</a>实现。相比于 <a href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_nsisbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&wd=&eqid=f774f5d00003a46c000000065f51fc9a" target="_blank" class="text-underline">PHP</a>,<a href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_ns isbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt& wd=&eqid=f774f5d00003a46c000000065f51fc9a" target="_blank" class="text-underline">PHP</a> 一般用作... </div> </div>
在以上 HTML 代码片段中,可以看到每个搜索结果都嵌套在 现在我们已经明确了我们要获取到的数据的格式及我们需要解析的 HTML 数据的格式,我们已经可以开始编写我们的爬虫程序了。 我们可以使用 PHP 的 cURL 库发送 HTTP 请求,从而获取百度搜索结果的 HTML 页面。在这个例子中,我们将搜索页面的 URL 存在 在这个例子中,我们使用了 cURL 库提供的许多选项。例如,设置请求头来模拟浏览器发送的 HTTP 请求,设置请求方式为 GET,设置超时时间,等等。 在获取了百度搜索结果的 HTML 页面之后,我们需要解析它来获取我们需要的信息。在这个例子中,我们将使用 PHP 的正则表达式来解析 HTML 页面。 以下是我们使用正则表达式来从 HTML 页面中提取标题、描述和链接: 在以上代码中,我们使用了 PHP 的正则表达式来匹配所有的搜索结果。然后,我们使用一个循环来遍历所有的搜索结果,从中提取出我们需要的标题、描述和链接。由于我们从 HTML 中获取到的标题和描述中会含有 HTML 标签,我们使用 在以上代码中,我们已经获取了我们需要的数据,现在只需要将结果以数组形式返回即可。我们将我们整个爬虫程序封装成一个函数,将获取到的数据以数组的形式作为返回值: 我们可以接收一个关键字作为参数,然后调用这个函数来获取这个关键字在百度搜索结果中的标题、描述和链接。 在本文中,我们使用 PHP 编写了一个简单的爬虫程序,从百度搜索结果中提取所需数据。这个程序使用 PHP 的 cURL 库模拟 HTTP 请求,并使用正则表达式等方法来解析 HTML 页面。通过这个例子,我们可以深入了解爬虫程序是如何工作的,以及如何使用 PHP 来编写爬虫程序。在实际的项目中,我们可以根据需求修改这个程序来获取我们需要的数据。,其中链接地址嵌套在
标签内。每个搜索结果都有一个描述,对应的 HTML 格式为
标签内含有
class="c-showurl"
。编写代码
获取百度搜索结果的 HTML 页面
$url
变量中。然后创建一个 cURL 的句柄,并设置许多选项,例如:设置 URL、设置请求头、设置代理、设置超时、设置请求方式为 GET,最后执行这个句柄,获取 HTML 页面。<?php
$url = "https://www.baidu.com/s?wd=php%20爬虫";
// 创建curl句柄
$ch = curl_init();
// 设置curl选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
[
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer: https://www.baidu.com/',
'Connection: keep-alive',
]
);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
//执行curl句柄
$result = curl_exec($ch);
解析 HTML 页面
<?php
$result = curl_exec($ch);
// 匹配所有搜索结果
preg_match_all(
'/<div.*?class="result.*?">.*?<h3.*?>.*?<a.*?href="(.*?)".*?>s*(.*?)s*</a>.*?</h3>.*?<div.*?class="c-abstract.*?">(.*?)</div>.*?</div>/',
$result,
$matches
);
// 提取搜索结果中的标题、描述和链接
$data = [];
for ($i=0; $i<count($matches[0]); $i++) {
$data[] = [
'title' => strip_tags($matches[2][$i]), // 去除标题中的 HTML 标签
'description' => strip_tags($matches[3][$i]), // 去除描述中的 HTML 标签
'link' => $matches[1][$i]
];
};
// 关闭curl句柄
curl_close($ch);
strip_tags
函数来将它们去除。将结果返回
<?php
function spider_baidu($keyword) {
$url = "https://www.baidu.com/s?wd=" . urlencode($keyword);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
[
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer: https://www.baidu.com/',
'Connection: keep-alive',
]
);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
$result = curl_exec($ch);
preg_match_all(
'/<div.*?class="result.*?">.*?<h3.*?>.*?<a.*?href="(.*?)".*?>s*(.*?)s*</a>.*?</h3>.*?<div.*?class="c-abstract.*?">(.*?)</div>.*?</div>/',
$result,
$matches
);
$data = [];
for ($i=0; $i<count($matches[0]); $i++) {
$data[] = [
'title' => strip_tags($matches[2][$i]),
'description' => strip_tags($matches[3][$i]),
'link' => $matches[1][$i]
];
};
curl_close($ch);
return $data;
}
结论