当前位置: 首页 > news >正文

如何用 PHP 实现一个自定义爬虫框架

随着互联网的不断发展,信息量爆炸式增长,获取有价值的信息已经成为了许多人的需求。在这样的大环境下,爬虫技术逐渐兴起,成为了大数据时代的重要工具之一。爬虫技术的应用十分广泛,其可以用于网络舆情监测、数据分析、信息挖掘等多个领域。本文将介绍如何用 php 实现一个自定义爬虫框架。

一、爬虫框架的原理

爬虫是一种自动化获取网页信息的程序,其通过爬取网页文本,抽取有价值的数据进行分析和利用。爬虫框架是爬虫程序的基础,其包含了自定义的获取、解析、存储等方法。

通过爬虫框架实现爬虫程序,其基本流程如下:

  1. 获取网页信息:通过 HTTP 协议向目标网站发送请求,获取网页文本信息。
  2. 解析网页信息:对网页文本进行解析,抽取目标数据进行处理。
  3. 存储处理结果:将处理后的数据进行存储,以便后续的数据分析和利用。

二、PHP 爬虫框架实现

立即学习“PHP免费学习笔记(深入)”;

  1. 获取网页信息

在 PHP 中,可以通过 CURL 库实现 HTTP 请求。CURL 是一款强大的开源网络库,可以用来在 PHP 中处理 URL(Uniform Resource Locator,统一资源定位符).

代码如下:

1

2

3

4

5

6

7

8

9

10

$ch = curl_init();  // 初始化 cURL

$options array(

    CURLOPT_URL => $url// 请求的 URL

    CURLOPT_RETURNTRANSFER => 1,  // 返回原生的输出内容

    CURLOPT_ENCODING => ''// 自动处理响应头中的 Transfer-Encoding

    CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'// 模拟 user-agent

);

curl_setopt_array($ch, $options);

$result = curl_exec($ch);  // 执行请求

curl_close($ch);  // 关闭请求链接

上述代码中,首先使用 curl_init() 函数初始化 CURL,然后使用 curl_setopt_array() 函数设置 CURL 请求的各项参数,包括请求的 URL、返回原生的输出内容、自动处理响应头中的 Transfer-Encoding,以及模拟 user-agent 等。最后通过 curl_exec() 执行请求,关闭请求链接。执行上述代码后,即可成功获取目标网站的网页信息。

  1. 解析网页信息

在 PHP 中,可以使用 DOMDocument 类对 HTML 文本进行解析,其提供了一套 DOM(Document Object Model,文档对象模型)接口,可以方便地对 HTML 文本进行解析。

代码如下:

1

2

3

4

5

6

7

$doc = new DOMDocument();

$doc->loadHTML($result);  // 加载 HTML 内容

$xpath = new DOMXPath($doc);

$tags = $xpath->query('//tag')  // 获取指定标签

foreach ($tags as $tag) {

    // 对标签内容进行解析

}

上述代码首先创建了一个 DOMDocument 类的对象,然后通过 loadHTML() 函数加载网页文本,然后通过 DOMXPath 类获取指定标签,并对标签内容进行解析。

  1. 存储处理结果

在 PHP 中,可以通过 MySQL 数据库对数据进行存储,其提供了一套 PDO(PHP Data Objects,PHP 数据对象)接口,可以方便地进行数据库操作。

代码如下:

1

2

3

4

5

6

7

$pdo = new PDO('mysql:host=$dbhost;dbname=$dbname', $username, $password); // 连接数据库

$sql = 'INSERT INTO table_name (field1, field2, ...) VALUES (:value1, :value2, ...)'// SQL 语句

$stmt = $pdo->prepare($sql);  // 预处理 SQL 语句

$stmt->bindParam(':param1', $value1);  // 绑定参数

$stmt->bindParam(':param2', $value2);

...

$stmt->execute();  // 执行 SQL 语句

上述代码中,首先使用 PDO 对象连接 MySQL 数据库,然后使用 SQL 语句向指定的数据表中插入数据,通过预处理 SQL 语句,绑定参数后,直接执行 SQL 语句即可将数据成功存储到数据库中。

三、爬虫框架使用案例

在实现了爬虫框架后,我们可以用其对任何的网站进行爬取,下面将演示一个简单的使用案例。例如,我们现在需要爬取知乎的用户信息,首先我们需要获取用户的页面信息:

1

2

$url = "https://www.zhihu.com/people/xxx";

$result = getCurl($url);

然后,我们通过 XPath 对返回的页面信息进行解析,获取目标信息:

1

2

3

4

5

6

7

8

9

10

11

$doc = new DOMDocument();

$doc->loadHTML($result);

$xpath = new DOMXPath($doc);

// 用户名

$username = $xpath->query("//*[@class='ProfileHeader-name']/text()")->item(0)->nodeValue;

// 签名

$userbio = $xpath->query("//div[@class='ProfileHeader-headline']/span//@title")->item(0)->nodeValue;

// 关注数

$following_count = $xpath->query("//*[@class='NumberBoard-itemValue']/text()")->item(2)->nodeValue;

// 粉丝数

$followers_count = $xpath->query("//*[@class='NumberBoard-itemValue']/text()")->item(3)->nodeValue;

最后,我们可以使用 MySQL 数据库将获取到的目标信息存储下来:

1

2

3

4

5

6

7

8

$pdo = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');

$sql = "INSERT INTO `zhihu_users`(`username`, `userbio`, `following_count`, `followers_count`, `updated_at`) VALUES (:username, :userbio, :following_count, :followers_count, NOW())";

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':username', $username);

$stmt->bindParam(':userbio', $userbio);

$stmt->bindParam(':following_count', $following_count);

$stmt->bindParam(':followers_count', $followers_count);

$stmt->execute();

通过上述代码示例,我们可以看到使用 PHP 实现一个自定义爬虫框架的流程,包括获取网页信息、解析网页信息和存储处理结果等操作。通过此框架,我们可以方便地进行目标网站的抓取和数据分析,提高数据应用的效率和准确性。

相关文章:

如何用 PHP 实现一个自定义爬虫框架

随着互联网的不断发展,信息量爆炸式增长,获取有价值的信息已经成为了许多人的需求。在这样的大环境下,爬虫技术逐渐兴起,成为了大数据时代的重要工具之一。爬虫技术的应用十分广泛,其可以用于网络舆情监测、数据分析、…...

【机器学习】机器学习的重要方法——强化学习:理论,方法与实践

目录 一、强化学习的核心概念 二、强化学习算法的分类与示例代码 三.强化学习的优势 四.强化学习的应用与挑战 五、总结与展望 强化学习:理论,方法和实践 在人工智能的广阔领域中,强化学习(Reinforcement Learning, RL&…...

Linux磁盘监控思路分析

磁盘监控原理 设备又名I/O设备,泛指计算机系统中除主机以外的所有外部设备。 1.1 计算机分类 1.1.1 按照信息传输速度分: 1.低速设备:每秒传输信息仅几个字节或者百个字节,如:键盘、鼠标等 2.中速设备&#xff1a…...

pc端制作一个顶部固定的菜单栏

效果 hsl颜色 hsl颜色在css中比较方便 https://www.w3school.com.cn/css/css_colors_hsl.asp 色相(hue)是色轮上从 0 到 360 的度数。0 是红色,120 是绿色,240 是蓝色。饱和度(saturation)是一个百分比值…...

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合 随着数字化办公的日益普及,一款高效、功能丰富的办公软件成为了职场人士的必备工具。ONLYOFFICE团队一直致力于为用户提供全面而先进的办公解决方案。最新推出的ONLYOFFICE 8.1版本桌面编…...

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(2)

(1)在student数据库上创建一个用户表tb_account,该表包含用户id,用户名和密码。 字段名称 数据类型 注释 约束 user_id Char(8) 用户id 主键 user_name char(10) 用户名 不能为空 password char(10) 密码 默认值&a…...

socket编程常见操作

1、连接的建立 分为两种:服务端处理接收客户端的连接;服务端作为客户端连接第三方服务 //作为服务端 int listenfd socket(AF_INET, SOCK_STREAM, 0); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) listen(listenfd, 10); //…...

springcloud-config git配置源加载(部署公钥问题)

使用gitUrl作为配置源 gitee 或者github 中有类似于发布密钥的功能,允许通过私钥只读访问指定的仓库,文档中说的是 限制了git的操作为pull 和 clone。生成私钥的方式文档连接在此 https://gitee.com/help/articles/4181#article-header0 spring config只…...

华为OD机考题HJ24 合唱队

前言 应广大同学要求,开始以OD机考题作为练习题,看看算法和数据结构掌握情况。有需要练习的可以关注下。 描述 N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。 设𝐾K位同学从左到…...

基于bootstrap的12种登录注册页面模板

基于bootstrap的12种登录注册页面模板,分三种类型,默认简单的登录和注册,带背景图片的登录和注册,支持弹窗的登录和注册页面html下载。 微信扫码下载...

【劳德巴赫 Trace32 高阶系列 3.1 -- trace32 svf 文件操作与 InitState】

文章目录 SVF InitStateJTAG 状态机JTAG Test-Logic-ResetJTAG Run-Test-IdleSVF InitState Format: JTAG.PROGRAM.SVF <file> [/<option>] <option>: IRPRE <value>IRPOST <value>DRPRE <value>DRPOST <value<...

爬虫知识:补环境相关知识

学习目标&#xff1a;知道为什么要补环境&#xff0c;知道要补什么环境&#xff08;使用Proxy检测&#xff09;。没有讲解怎么补 本章没有动手去实操&#xff0c;只是纯理论知识 补环境介绍 DOM与BOM DOM主要关注文档内容和结构&#xff0c;而BOM关注浏览器窗口和功能。在浏…...

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 引言&#xff1a; crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…...

【Python】探索 Pandas 中的 where 方法:条件筛选的利器

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 在数据分析中&#xff0c;Pandas 是一个强大且…...

Pikachu靶场--Sql Inject

参考借鉴 pikachu靶场练习&#xff08;详细&#xff0c;完整&#xff0c;适合新手阅读&#xff09;-CSDN博客 数字型注入(post) 这种类型的SQL注入利用在用户输入处插入数值&#xff0c;而不是字符串。攻击者试图通过输入数字来修改SQL查询的逻辑&#xff0c;以执行恶意操作。…...

【Python从入门到进阶】59、Pandas库中Series对象的操作(二)

接上篇《58、Pandas库中Series对象的操作(一)》 上一篇我们讲解了Pandas库中Series对象的基本概念、对象创建和操作&#xff0c;本篇我们来继续学习Series对象的运算、函数应用、时间序列操作&#xff0c;以及Series的案例实践。 一、Series对象的运算 1. 数值型数据的算术运…...

【PYG】使用datalist定义数据集,创建一个包含多个Data对象的列表并使用DataLoader来加载这些数据

为了使用你提到的封装方式来创建一个包含多个 Data 对象的列表并使用 DataLoader 来加载这些数据&#xff0c;我们可以按照以下步骤进行&#xff1a; 创建数据&#xff1a;生成节点特征矩阵、边索引矩阵和标签。封装数据&#xff1a;使用 Data 对象将这些数据封装起来。使用 D…...

【设计模式】【创建型5-2】【工厂方法模式】

文章目录 工厂方法模式工厂方法模式的结构示例产品接口具体产品工厂接口具体工厂客户端代码 实际的使用 工厂方法模式 工厂方法模式的结构 产品&#xff08;Product&#xff09;&#xff1a;定义工厂方法所创建的对象的接口。 具体产品&#xff08;ConcreteProduct&#xff0…...

python API自动化(Pytest+Excel+Allure完整框架集成+yaml入门+大量响应报文处理及加解密、签名处理)

1.pytest数据参数化 假设你需要测试一个登录功能&#xff0c;输入用户名和密码后验证登录结果。可以使用参数化实现多组输入数据的测试: 测试正确的用户名和密码登录成功 测试正确的用户名和错误的密码登录失败 测试错误的用户名和正确的密码登录失败 测试错误的用户名和密码登…...

【Postman学习】

Postman是一个非常流行的API开发和测试工具&#xff0c;广泛用于Web服务的开发、测试和调试。它提供了一个图形界面&#xff0c;允许用户轻松地构建、发送和管理HTTP(S)请求&#xff0c;同时查看和分析响应。下面是对Postman接口测试工具的详细解释&#xff1a; 1. Postman简介…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...