PHP 采集程序开发,爬虫技术方案汇总
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:11
- 发布: 2025-08-25 12:30
- 最后更新: 2025-08-25 12:30
可能大家都知道 python 做爬虫的很多,有很多的开源的项目之类的,可以很方便的爬取目标页面的内容。今天就来科普一下 php 的爬虫技术设计方案有哪些。
首先,让我们先来个最简单的方案。
原生代码内容采集
用来爬取页面上的 html 内容,包括图片,数据等,最简单直接的就是通过 curl 库。可以直接访问远程地址,然后根据获取到的页面内容,筛选所需要的数据。至于筛选方法可以通过正则表达式,字符串查找之类的操作,利用 curl 库和原生操作,做一些简单的内容抓取、表单提交是完全可行的。而且很多时候我们也是这么做的。
这个方案的优势就是不用安装额外的代码库,利用 php 原生能力就能做到。代码简单,资源消耗少,执行效率高。
利用一些开源库,进行页面内容的匹配
对于一些页面结构复杂的网页,想要提取其中的比较多的内容,仅仅通过正则,和基本的字符搜索,就显得有些吃力了,就算能够达成目标,但是要花费的代价很大,各种正则匹配代码要非常多。最头疼的是,只要目标网页一旦有了少量的更新,可能所有的匹配规则都要调整。
这时候,就有了这样的需求,如果有个工具能像 jquery(前端开发应该不陌生,jquery 是互联网崛起时代的前期著名javascript库,现在用的相对较少,部分功能,被 html5 的原生功能取代了) 一样,能够通过类或者ID选择器来定位内容多好。于是,一系列的类似工具库就诞生了,其中有名的,比如 querypath
,后来的 goutte
都具备了类似的筛选功能,能够帮助开发人员,精准定位目标数据。而且定位方式,对页面代码的局部更新有了一定的兼容性。不用时不时就得该定位方式了。
遇到 JS 渲染,防采集功能如何才能采集到目标数据
真正写过采集代码的开发,一定会遇到这样的问题。好多网站为了防止自己的内容被采集,刻意通过 js 来对内容进行渲染。或者更有甚者,在页面加上一些验证(比如请求验证码,一些加密措施等等),这样就无法单纯通过 curl 模拟请求绕过验证,无法进行数据的批量采集。
这样该如何解决呢。俗话说,在程序员眼里,只要你能看到的你就能得到(我说的)。不管什么样的防采集功能,最终,这些内容只要是用来给用户看的,那就一定有办法得到。
以上问题,归根结底是由于后端服务,缺少前端 js 代码的执行能力,导致无法拿到前端页面 js 脚本的运行结果。而导致最终无法获取到 js 渲染的最终内容。这时候,你就应该想到一个东西,V8 引擎。
V8 引擎是 Google 开发的,采用 C++ 编写,支持即时编译(JIT)、垃圾回收等特性。php 有专门的扩展 v8js
,只要装上这个扩展,就能执行前端的 js。前一段时间,在弄 markdown 语法的后端渲染的时候,调研过这个东西,本质上,它是可以运行前端的所有 js 的,甚至 vue react 等框架也能通过 v8js 来执行。这样就能拿到渲染后的结果数据。
有了上边的方法,一些简单的 js 库的验证还是加密,都可以通过后端运行得到结果。
webdriver 测试工具,充当采集工具
虽然以上方案,能通过 v8js 执行页面 js,最终能够获取到数据,但是实际开发起来就会发现,也并没有那么简单。而且每个站点的 js 都不同,在进行不同站点的大批量数据采集时候,也不可能一个站一个站的适配到 js 代码级别的处理细节。
那么这时候问题又来了,有没有一种方案,就像我们通过浏览器看网页一样,不管页面结构在复杂,js 渲染或者验证再变态,最终都是要呈现出来给用户看的,我们只要拿到浏览器渲染完成的页面数据就可以了,前面说的那些问题,都留给浏览器就都解决了。
答案是肯定的
。我们可以利用 webdriver 网页测试功能,达到如上效果。
webdriver 网页驱动测试,这个项目是从 2006 年 google 就开始发起了。目的是通过直接操控浏览器实现更高级的测试功能。2009 年 Selenium 和 WebDriver 进步整合测试了功能。后续的网页自动化测试,基本都是基于 WebDriver 进行的。
- 2004 Selenium 诞生
- 2006 WebDriver 作为一款工具诞生
- 2009 google自动化测试大会,Seleium 和 WebDriver 合并为一个项目,发布Selenium 2.0
- 2016 Selenium3 发布,彻底抛弃1.0中的Selenium RC
- 2018 W3C标准组织吸纳了WebDriver为标准协议
- 2021 Selnium 4.0发布,取消了WebDriver原先的Json Wire协议,全面采用W3C webDriver
这里我们不多介绍自动化测试的相关知识。还是回到采集的目的上来。有了上边的这个方案,对web 进行测试的过程,其实也就是进行内容采集的过程。这样,我们就只需要控制浏览器进行操作,获取目标网页的最终结果。之前所说的各种验证方式,也就只能防住单纯的 curl 方式的采集。对与模拟用户行为的浏览器方式,则完全没法设防了。
这也是目前采集的终极方案,不论什么样的数据,只要是给人看的,就一定能获取到。相关PHP采集程序开发源码,请关注后续文章。