0

0

PHP 爬虫实战:从百度搜索结果中提取所需数据

PHPz

PHPz

发布时间:2023-06-13 10:22:40

|

2272人浏览过

|

来源于php中文网

原创

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

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

思路

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

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

在考虑我们需要获取哪些数据时,让我们以“PHP 爬虫”这个关键词为例。如果我们在百度上搜索这个关键词,我们能够看到以下信息:

  • 搜索结果的总数量
  • 每个搜索结果的标题
  • 每个搜索结果的描述
  • 每个搜索结果的网址

那么,我们就可以将我们的目标定义为从百度搜索结果中提取出每个结果的标题、描述和网址。

立即学习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 代码片段中,可以看到每个搜索结果都嵌套在 <div class="result c-container "> 标签内。每个搜索结果都有一个标题,对应的 HTML 格式为 <h3 class="t">,其中链接地址嵌套在 <a> 标签内。每个搜索结果都有一个描述,对应的 HTML 格式为 <div class="c-abstract">。每个搜索结果还有一个网址,在 <a> 标签内含有 class="c-showurl"

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

编写代码

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

Rose.ai
Rose.ai

一个云数据平台,帮助用户发现、可视化数据

下载
  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速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

258

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

766

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

219

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

245

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

547

2023.12.06

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号