PHP在做爬虫时的解决方案

爬虫不是一个小众的场景,所以无论是哪个语言,都有很多相应的生态库.这里介绍一下PHP的技术方案和代码量。

关键能力

对页面的解析能力

PHP的官方扩展中有Dom扩展,但是我建议使用electrolinux/phpquery这个库,他相当于一个PHP版的JQ.

算上加载文件,只要三行就能获取title标签内容.

<?php
include 'phpQuery-onefile.php';$file = 'test.html'; // 加载文件
phpQuery::newDocumentFileHTML($file);// 加载之后就可以使用JQ的操作方法去解析.$titleElement = pq('title'); // 也可以使用对象的操作方式
$title = $titleElement->html();

对数据库的操作能力

PHP对数据库的操作能力不是吹的,原生扩展中支持PDO,这里可以尝试ThinkPHP的think-orm.

简简单单一学就会.

use think\facade\Db;
// 数据库配置信息设置(全局有效)
Db::setConfig([// 默认数据连接标识'default'     => 'mysql',// 数据库连接信息'connections' => ['mysql' => [// 数据库类型'type'     => 'mysql',// 主机地址'hostname' => '127.0.0.1',// 用户名'username' => 'root',// 数据库名'database' => 'demo',// 数据库编码默认采用utf8'charset'  => 'utf8',// 数据库表前缀'prefix'   => 'think_',// 数据库调试模式'debug'    => true,],],
]);// 查询
Db::name('user')->where('id', 1)->find();
// 新增
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data);
//更新
Db::name('user')->update(['id' => 1, 'name' => 'thinkphp']);
// 删除
Db::table('think_user')->where('id', 1)->delete();

爬虫效率

PHP对于性能的优化有很多很深的解决方案,包括使用协程等,这里只介绍最简单的的一种方式,使用guzzle这个库(他使用curl 的并行加载特性).

use GuzzleHttp\Client;
use GuzzleHttp\Promise;$client = new Client(['base_uri' => 'http://httpbin.org/']);// 发起不阻塞的请求
$promises = ['image' => $client->getAsync('/image'),'png'   => $client->getAsync('/image/png'),'jpeg'  => $client->getAsync('/image/jpeg'),'webp'  => $client->getAsync('/image/webp')
];// 等待所有请求完成
$responses = Promise\Utils::settle($promises)->wait();

代码量

如上面例子所示,代码量并不多,去掉配置文件,只有十几行代码,最关键的是我们需要的特性并没有削弱.

比如:

  • 极简的DOM解析
  • 健壮的SQL操作
  • 发起并行请求

解析JS

有时候我们要抓取的页面是依赖JS执行的,这是需要一个无头浏览器,此时介绍这样一个库,他能够很简单的完成对phantomjs的操作.

PHP PhantomJS 是一个灵活的 PHP 库,让PHP通过很简单的代码来操作 PhantomJS 无头浏览器加载页面。 让PHP加载的网页地址执行JS/页面截图/导出PDF.

他可以非常方便的实现这些功能:

  • 使用无头浏览器PhantomJS加载请求
  • 查看详细的响应数据,包括页面内容、标题、状态 代码等
  • 处理重定向
  • 查看JS控制台输出报错
  • 查看详细的PhantomJS调试信息
  • 保存页面的截图
  • 将页面导出为PDF
  • 设置浏览窗口大小
  • 为PDF导出设置页眉页脚
  • 指定截图位置x,y和宽高
  • 延迟页面渲染(等待页面加载完成)
  • 轻松构建和运行PhantomJS脚本

PHP PhantomJS 只要求 PHP 5.4.0 或以上即可。

基本用法

使用phantomjs发起一个请求非常简单:

<?phpuse JonnyW\PhantomJs\Client;$client = Client::getInstance();/*** @see JonnyW\PhantomJs\Http\Request**/$request = $client->getMessageFactory()->createRequest('http://phpreturn.com', 'GET');/*** @see JonnyW\PhantomJs\Http\Response**/$response = $client->getMessageFactory()->createResponse();// Send the request$client->send($request, $response);if($response->getStatus() === 200) {// Dump the requested page contentecho $response->getContent();}

使用PHP总是更舒服,更简单.

原文标题: PHP在做爬虫时的解决方案

原文地址: https://phpreturn.com/index/a62235bdfe4e70.html

原文平台: PHP武器库

版权声明: 本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912530.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper Curator(2):Curator的节点操作

文章目录 zookeeper 的安装Curator 介绍Curator API 常用操作本章必要的相关依赖和配置建立连接第一种方式第二种方式 关闭连接添加节点创建节点创建节点并设置值和类型创建多级节点 查询节点查询数据查询所有子节点查询节点信息 修改节点修改节点数据修改节点(乐观锁修改&…

计算机视觉的定义及应用方向

近两年来&#xff0c;机器学习、深度学习、人工智能等方向逐步成为很多同学最关注的研究和就业方向。不可否认&#xff0c;计算机视觉作为深度学习的应用领域之一&#xff0c;在工业界取得了蓬勃的发展&#xff0c;也是目前最热门的方向之一。 计算机视觉是什么 计算机视觉主要…

低代码开发实战:使用活字格快速创建 Java Web API

引言 在当今快速发展的软件开发领域&#xff0c;低代码平台因其高效性和易用性而备受关注。Java Web API作为企业级应用开发的重要组成部分&#xff0c;与低代码平台的结合能够显著提升开发效率。本文将以葡萄城活字格平台为例&#xff0c;详细介绍如何利用其低代码特性快速创…

当后端接口返回格式不是easyui默认的格式,怎么办

方法:可以增加一个数据过滤方法对后端的接口结构进行转换。 分析:easyui默认情况下,只能接收如下格式的接口: {"total": 1,"rows": [{"id": 1,"userName": "jiao","unionId": 1,"phone": "2…

第一弹 AC Module: 和编程语言无关以AI为中心的自包含模块化理念和实现

背景和问题 说起模块/包&#xff0c;几乎是大部分语言都有的概念&#xff0c;因为一个项目会很庞大&#xff0c;如果单纯只用文件做隔离&#xff0c;文件可能几千上万个&#xff0c;所以需要在项目和文件之间获得一个平衡&#xff0c;这个时候就有包和模块的概念。比如python 你…

Edge(chrome)右键插件的右键菜单怎么设置

主要使用 contextMenus 右键菜单功能&#xff0c;正常用它给页面设置右键菜单&#xff0c;其实它也可以给插件还有其它功能设置右键菜单&#xff0c;是根据 contexts 选项来设置给哪个功能设置右键菜单。 首先添加权限 "permissions": ["contextMenus"], …

后端设计笔记13 FM

1.理论 2.实践 LAB 报错以后可以双击错误&#xff0c;便可以定位到错误&#xff0c;或者打开pattern查看 还可以analyse

闲庭信步使用SV搭建图像测试平台:第十九课——YCbCr图像转RGB图像

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程文件请关注…

C++(智能指针)

智能指针 1.基础&#xff1a; 1.1 概念 智能指针是用于自动管理动态分配内存的RAII&#xff08;Resource Acquisition Is Initialization&#xff09;对象。它们通过自动释放内存来防止内存泄漏&#xff0c;是替代裸指针的安全工具。 1.2 解析 众所周知&#xff0c;堆内存对象…

Sentinel 授权规则详解与自定义异常处理

Sentinel 授权规则详解与自定义异常处理 在微服务系统中&#xff0c;权限控制和访问保护是至关重要的一环。本文将详细介绍如何通过 Sentinel 的 授权规则&#xff08;AuthorityRule&#xff09; 控制资源访问权限&#xff0c;并结合实际案例说明如何设置白名单与黑名单&#…

LeetCode Hot 100 最大子数组和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6…

Python UI自动化演进格局:从传统库到AI驱动的智能代理

引言 UI自动化的持久需求 在现代软件工程和业务流程管理中&#xff0c;图形用户界面&#xff08;GUI&#xff09;自动化扮演着至关重要的角色。它不仅仅局限于软件测试领域&#xff0c;更是机器人流程自动化&#xff08;RPA&#xff09;、自动化数据录入、遗留系统集成以及在AP…

【Java面试】如何解决MQ死信队列?

如何解决MQ死信队列&#xff1f; 一、预防死信产生&#xff08;从源头减少死信&#xff09; 消费者端健壮性优化 捕获所有可能的异常&#xff0c;区分可恢复异常&#xff08;如网络超时&#xff09;和不可恢复异常&#xff08;如数据格式错误&#xff09;。对可恢复异常实现自…

RGB+EVS视觉融合相机:事件相机的革命性突破​

一、单一EVS事件相机的原理 事件相机&#xff08;EVS&#xff09;是一种新型的视觉传感器&#xff0c;其设计灵感来源于生物视觉系统。与传统相机不同&#xff0c;事件相机并不以固定的帧率捕获整个图像&#xff0c;而是每个像素独立工作&#xff0c;当检测到亮度变化超过预设…

DBeaver 设置阿里云中央仓库地址的操作步骤

DBeaver 设置阿里云中央仓库地址的操作步骤&#xff08;适用于解决驱动下载缓慢或失败的问题&#xff09; 一、最新阿里云 Maven 仓库地址 主仓库地址&#xff08;推荐&#xff09;&#xff1a; http://maven.aliyun.com/nexus/content/groups/public/ 123 备用地址&#xff…

Qt:QCustomPlot库的QCPAxis

在 QCustomPlot 中&#xff0c;QCPAxis 是图表坐标系的核心组件&#xff0c;负责管理坐标轴的所有视觉和功能特性。它提供了丰富的定制选项&#xff0c;使开发者能够创建高度专业化的数据可视化图表。 核心功能概述 功能类别关键特性相关方法基本结构坐标轴位置、方向axisTyp…

七天学会SpringCloud分布式微服务——05——OpenFeign

1、OpenFeign实现远程调用 1.1 services.pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>1.2 在service-order微服务中新建feign.Product…

大语言模型的通用局限性与全球技术演进

基于行业最新数据修订&#xff08;2025Q2&#xff09; 一、知识截止期&#xff1a;全球模型的进化差异 所有LLM都存在​​知识截止期&#xff08;Knowledge Cut-off&#xff09;​​&#xff0c;即模型训练数据的时间上限。这在技术迭代飞快的软件开发领域尤为致命——2023年后…

常见网络安全威胁和防御措施

网络安全威胁是一种技术风险&#xff0c;会削弱企业网络的防御能力&#xff0c;危及专有数据、关键应用程序和整个 IT 基础设施。由于企业面临广泛的威胁&#xff0c;因此他们应该仔细监控和缓解最关键的威胁和漏洞。网络安全问题有七大类&#xff0c;它们都包括多种威胁&#…

人工智能和云计算对金融未来的影响

你有没有想过&#xff0c;你的钱是否会由人工智能而不是银行来管理&#xff1f;如果你的银行不存在于真实的地方&#xff0c;而是存在于几千公里之外的某台大型超级计算机上&#xff0c;那会怎样&#xff1f;这可能有一天会发生&#xff0c;让我们看看它是如何发生的&#xff0…