搜索
首页后端开发php教程PHP 爬虫实战:从百度搜索结果中提取所需数据
PHP 爬虫实战:从百度搜索结果中提取所需数据Jun 13, 2023 am 10:22 AM
php爬虫数据提取

随着互联网高速发展,信息爆炸的时代已经到来。在这样的时代,搜索引擎成为了我们获取信息的主要工具,而这些搜索引擎所提供的海量数据让我们难以想象。然而,对于一些特定领域的研究者或者数据分析员来说,他们所需要的信息可能只是这些搜索结果中的一小部分数据。在这种情况下,我们需要使用爬虫程序来准确地获取我们想要的数据。

在本文中,我们将使用 PHP 编写一个简单的爬虫程序,从百度搜索结果中提取我们所需的数据。这个程序的核心是使用 PHP 的 cURL 库模拟 HTTP 请求,然后使用正则表达式等方法解析 HTML 页面。

思路

在开始编写爬虫程序之前,我们需要先明确几个问题:

  1. 目标:我们想要从百度搜索结果页中爬取什么数据?
  2. URL:我们需要获取哪个 URL 下的数据?
  3. 数据格式:百度搜索结果页的数据是什么格式?

在考虑我们需要获取哪些数据时,让我们以“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爬虫&amp;rsp=1&amp;f=8&amp;ie=utf-8&amp;tn=95754739_hao_pg"
            target="_blank" class="text-underline">python 爬虫</a>实现。相比于 <a
            href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_nsisbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&amp;wd=&amp;eqid=f774f5d00003a46c000000065f51fc9a"
            target="_blank" class="text-underline">PHP</a>,<a
            href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_ns
            isbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&amp;
            wd=&amp;eqid=f774f5d00003a46c000000065f51fc9a" target="_blank"
            class="text-underline">PHP</a> 一般用作...
    </div>
</div>

在以上 HTML 代码片段中,可以看到每个搜索结果都嵌套在 21796805ef09aaa51089021f05184af8 标签内。每个搜索结果都有一个标题,对应的 HTML 格式为 4fadc3c7e100e7abd749338f79a967d5,其中链接地址嵌套在 3499910bf9dac5ae3c52d5ede7383485 标签内。每个搜索结果都有一个描述,对应的 HTML 格式为 fb66738ee24dc0ed63bb579c482ae1b0。每个搜索结果还有一个网址,在 3499910bf9dac5ae3c52d5ede7383485 标签内含有 class="c-showurl"

现在我们已经明确了我们要获取到的数据的格式及我们需要解析的 HTML 数据的格式,我们已经可以开始编写我们的爬虫程序了。

编写代码

我们将我们的 PHP 爬虫代码分成了三个步骤:

  1. 获取百度搜索结果的 HTML 页面
  2. 解析 HTML 页面
  3. 将解析后的数据以数组形式返回

获取百度搜索结果的 HTML 页面

我们可以使用 PHP 的 cURL 库发送 HTTP 请求,从而获取百度搜索结果的 HTML 页面。在这个例子中,我们将搜索页面的 URL 存在 $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);

在这个例子中,我们使用了 cURL 库提供的许多选项。例如,设置请求头来模拟浏览器发送的 HTTP 请求,设置请求方式为 GET,设置超时时间,等等。

解析 HTML 页面

在获取了百度搜索结果的 HTML 页面之后,我们需要解析它来获取我们需要的信息。在这个例子中,我们将使用 PHP 的正则表达式来解析 HTML 页面。

以下是我们使用正则表达式来从 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);

在以上代码中,我们使用了 PHP 的正则表达式来匹配所有的搜索结果。然后,我们使用一个循环来遍历所有的搜索结果,从中提取出我们需要的标题、描述和链接。由于我们从 HTML 中获取到的标题和描述中会含有 HTML 标签,我们使用 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;
}

我们可以接收一个关键字作为参数,然后调用这个函数来获取这个关键字在百度搜索结果中的标题、描述和链接。

结论

在本文中,我们使用 PHP 编写了一个简单的爬虫程序,从百度搜索结果中提取所需数据。这个程序使用 PHP 的 cURL 库模拟 HTTP 请求,并使用正则表达式等方法来解析 HTML 页面。通过这个例子,我们可以深入了解爬虫程序是如何工作的,以及如何使用 PHP 来编写爬虫程序。在实际的项目中,我们可以根据需求修改这个程序来获取我们需要的数据。

以上是PHP 爬虫实战:从百度搜索结果中提取所需数据的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),