PHP爬虫编写 php爬虫框架phpspider
bigegpt 2024-10-12 06:59 13 浏览
一、PHP 是什么东西?
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。——百度百科的描述。
二、爬虫有什么用?
爬虫有什么用?先说一下爬虫是什么东西,我认为爬虫就是一个网络信息收集程序,也许我自己的理解有错误,也请大家给我指正。既然爬虫是一个网络信息收集程序,那就是用来收集信息,并且收集的信息是在网络上面的。如果还是不太清楚爬虫有什么用,我就举几个爬虫应用的例子:搜索引擎就需要爬虫收集网络信息供人们去搜索;大数据的数据,数据从哪里来?就是可以通过爬虫在网络中爬取(收集)而来。
三、通常听到爬虫会想到 Python,但为什么我用 PHP,而不用 Python 呢?
- Python 我说实话,我不会 Python。
- PHP 写东西我一直都是认为,你只要想出算法程序就已经出来了,不用考虑太多数据类型的问题。
- PHP 的语法和其他编程语言差不多,就算你开始不会 PHP,你也可以马上上手。
- 本人其实也是初学 PHP,想通过写一些东西提高自己的水平。
四、PHP爬虫第一步
PHP爬虫第一步,第一步......第一步当然就是搭建 PHP 的运行环境,没有环境PHP又怎么能运行呢?就像鱼不能离开水一样。(我见识还不够,可能我举的鱼的例子不够好,请见谅。)在Windows的系统下我使用 WAMP,而在Linux的系统下我使用 LNMP 或者 LAMP。
WAMP:Windows + Apache + Mysql + PHP
LAMP:Linux + Apache + Mysql + PHP
LNMP:Linux + Nginx + Mysql + PHP
Apache 和 Nginx 是 Web 服务器软件。
Apache或Nginx、Mysql 以及 PHP 这些都是 PHP Web 的基本配置环境。网上有 PHP Web 环境的安装包,这些安装包使用很方便,不需要每给东西安装以及配置。但如果你对这些集成安装包担心安全问题,你可以到这些程序的官网下载然后在网上找配置教程就可以了。
五、 PHP爬虫第二步
<?php
// 爬虫核心功能:获取网页源码
$html = file_get_contents("https://www.baidu.com/index.html");
// 通过 php 的 file_get_contents 函数获取百度首页源码,并传给 $html 变量
echo $html;
// 输出 $html
?>
爬虫网络核心功能已经写出来了,为什么说就这么几行代码就把爬虫核心功能写出来了呢?我猜有人已经明白了吧,其实是因为爬虫是数据获取的程序,就上面几行代码其实已经能够获取数据了,所以爬虫的核心功能已经写出来了。可能有人会说“你这个也太菜了吧!有什么用?”,虽然我是很菜,但请别说出来,让我好好装个X。
其实爬虫是用来干嘛,主要看你想让它来干嘛。就像我前些日子为了好玩写了一个搜索引擎网站出来,当然网站很菜,结果排序没有规律,很多都查不到。我的搜索引擎的爬虫就是要写一个适合于搜索引擎的爬虫。所以为了方便我也就用写搜索引擎的爬虫为目标讲解。当然了,我搜索引擎的爬虫还是不够完善,不完善的地方都是要你们自己去创造,去完善。
六、 搜索引擎爬虫的限制
搜索引擎的爬虫有时候不是不能那个网站的页面获取页面源码,而是有robot.txt文件,有该文件的网站,就代表站主不希望爬虫去爬取页面源码。
我搜索引擎的爬虫其实还有很多不足而导致的限制,例如可能因为无法运行 JS 脚本所以无法获取页面源码。又或者网站有反爬虫的机制导致不能获取到页面源码。有反爬虫机制的网站就如:知乎,知乎就是有反爬虫的机制的网站。
七、以弄搜索引擎爬虫为例,准备写该爬虫需要的东西
PHP 编写基础正则表达式、数据库的使用、运行环境。
八、搜索引擎获取页面源码并获取页面的标题信息
<?PHP
// 通过 file_get_contents 函数获取百度页面源码
$html = file_get_contents("https://www.baidu.com/index.html");
// 通过 preg_replace 函数使页面源码由多行变单行
$htmlOneLine = preg_replace("/\r|\n|\t/","",$html);
// 通过 preg_match 函数提取获取页面的标题信息
preg_match("/<title>(.*)<\/title>/iU",$htmlOne,$titleArr);
// 由于 preg_match 函数的结果是数组的形式
$title = $titleArr[1];
// 通过 echo 函数输出标题信息
echo $title;
?>
报错误示例:
Warning: file_get_contents("https://https://127.0.0.1/index.php") [function.file-get-contents]: failed to open stream: Invalid argument in E:\website\blog\test.php on line 25
https是SSL加密协议,如果出现获取页面时报上面的错误,代表你的 PHP 可能少了OpenSSL 的模块,你可以到网上查找解决办法。
九、搜索引擎爬虫的特点
虽然我没见过像“百度”,“Google”它们的爬虫,可是我自己通过猜测,以及在实际爬去过程当中遇到的一些问题,自己总结的几个特点。
- 通用性
通用性是因为我认为搜索引擎的爬虫一开始并不是针对哪一个网站制定的,所以要求能爬取到的网站尽可能的多,这是第一点。而第二点,就是获取网页的信息就是那些,一开始不会因为某些个别特殊小网站而放弃某些信息不提取,举个例子:一个小网站的一个网页meta标签里没有描述信息(description)或者关键词信息(keyword),就直接放弃了描述信息或者关键词信息的提取,当然如果真的某一个页面没有这些信息我会提取页面里的文字内容作为填充,反正就是尽可能达到爬取的网页信息每个网页的信息项都要一样。这是我认为的搜索引擎爬虫的通用性,当然我的想法可能是错误的。
- 不确定性
不确定性就是我的爬虫获取什么网页我是控制不够全面的,只能控制我能想到的情况,这也是因为我写的算法就是这样的原因,我的算法就是爬取获取到的页面里的所有链接,再去爬去获取到的这些链接,其实是因为搜索引擎并不是搜某一些东西,而是尽可能的多,因为只有更多的信息,才能找到一个最贴切用户想要的答案。所以我就觉得搜索引擎的爬虫就要有不确定性。
十、到现在可能出现的问题
- 获取的源码出现乱码
<?PHP
// 乱码解决办法,把其他编码格式通过 mb_convert_encoding 函数统一转为 UTF-8 格式
$html = mb_convert_encoding($html,'UTF-8','UTF-8,GBK,GB2312,BIG5');
// 还有一种因为gzip所以出现乱码的,我会在以后讲
?>
2. 获取不到标题信息
<?PHP
// 获取不到标题信息解决办法,首先判断是否能获取到页面源码
// 如果能获取到但还是不能获取到标题信息
// 我猜测的问题是:因为我教的是使用正则表达式获取的,源码没有变成一行,获取起来就会出现问题
$htmlOneLine=preg_replace("/\r|\n|\t/","",$html);
?>
3.获取不到页面源码
<?PHP
// 像新浪微博你可能获取到的是“Sina Visitor System”
// 解决办法添加header信息
$opts = array(
'http'=>array(
'method'=>"GET",
"timeout"=>20,
'header'=>"User-Agent: Spider \r\n",
)
);
$context = stream_context_create($opts);
$html = file_get_contents($domain,0,$context,0,150000);
// 这样就能获取到新浪微博的页面了
?>
十一、获取一个网页时的处理思路
我们先不去想很多网页,因为很多网页也就是一个循环。
- 获取页面源码
- 通过源码提取页面的什么信息
- 提取的信息要怎么处理
- 处理后放不放进数据库
十二、按照十一的思路的代码
<?php
// 一、获取源码
// 假设我们要获取淘宝首页
$html = file_get_content("https://www.taobao.com");
// 二、提取标题和文本
// 三、提取信息处理
// 处理页面源码,多行变单行
$htmlOneLine = preg_replace("/\r|\n|\t/","",$html);
// 获取标题信息
preg_match("/<title>(.*)<\/title>/iU",$htmlOneLine,$titleArr);
// 保留标题信息
$titleOK = $titleArr[1];
// 获取页面中的文本信息
// 处理前面不需要的head标签
$htmlText = preg_replace("/<html>(.*)<\/head>/","",$htmlOneLine);
// 处理style和script标签及内容
$htmlText = preg_replace("/<style(.*)>(.*)</style>|<script(.*)>(.*)</script>/iU","",$htmlText);
// 处理多余标签
$htmlText = preg_replace("/<(\/)?(.+)>/","",$htmlText);
// 四、保存到数据库
// 略
?>
十三、PHP 保存页面的图片思路
- 获取页面源码
- 获取页面的图片链接
- 使用函数保存图片
十四、保存图片示例代码
<?php
// 使用file_get_contents()函数获取图片
$img = file_get_contents("http://127.0.0.1/photo.jpg");
// 使用file_put_contents()函数保存图片
file_put_contents("photo.jpg",$img);
?>
相关推荐
- 得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践
-
一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...
- warm-flow新春版:网关直连和流程图重构
-
本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...
- 扣子空间体验报告
-
在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...
- spider-flow:开源的可视化方式定义爬虫方案
-
spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...
- solon-flow 你好世界!
-
solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...
- 新一代开源爬虫平台:SpiderFlow
-
SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...
- 通过 SQL 训练机器学习模型的引擎
-
关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...
- 鼠须管输入法rime for Mac
-
鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...
- Go语言 1.20 版本正式发布:新版详细介绍
-
Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...
- iOS 10平台SpriteKit新特性之Tile Maps(上)
-
简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...
- 程序员简历例句—范例Java、Python、C++模板
-
个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...
- Telerik UI for iOS Q3 2015正式发布
-
近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...
- ios使用ijkplayer+nginx进行视频直播
-
上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...
- IOS技术分享|iOS快速生成开发文档(一)
-
前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...
- macOS下配置VS Code C++开发环境
-
本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- dockernetworkconnect (63)
- esxi7 (63)
- vue阻止冒泡 (67)
- c#for循环 (63)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- java大写转小写 (63)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)