这篇文章首发在吹水小镇:http://blog.reetsee.com/archives/366
要在手机或者电脑看到更好的图片或代码欢迎到博文原地址。也欢迎到博文原地址批评指正。
转载请注明: 吹水小镇
| reetsee.com
原文链接地址: http://blog.reetsee.com/archives/366
——————————————————————————————
我最终又写一篇日志了,本来有非常多流水帐想发可是感觉没营养,就作罢了。今天我主要分享一个简单的PHP爬虫框架。名字叫:Phpfetcher项目的地址是:https://github.com/fanfank/phpfetcher这个框架的作者是:reetsee.xu。即吹水。
把整个项目下载下来后,在Linux下的终端直接运行demo目录下的single_page.php就可以看到效果。
只是在运行demo文件前,先设置一下你的终端编码为UTF-8以免显示乱码:
1 | export LANG=en_US.UTF-8 |
0 背景
背景是这种眼下吹水新闻(http://news.reetsee.com)下的内容所有由Python的爬虫抓取。使用的框架是Python的Scrapy。而吹水新闻眼下是执行在BAE(百度应用引擎)下的,每一个月还须要交钱。眼下我的想法是把吹水新闻全然迁移到眼下这台阿里云主机上。并且原本的新闻我每天都手动执行一次脚本来抓取再更新到站点,等迁移到这里后就能直接使用Crontab定时脚本自己主动更新新闻了!近期工作都在用PHP,开发站点的新页面要PHP,直接读写数据库也能用PHP,那么就直接用PHP重构新闻站点好了。
准备开干的时候却发现没找到一个好的PHP爬虫框架(可能是我没细致找)。于是就打算自己写一个,因此就有了这个Phpfetcher。名字起得略好……可是代码写得略搓……无论怎么样。眼下基本能够用,并且应该能满足不少简单的需求,以下就是使用演示样例。
1 基本概念
在Phpfetcher中有四个基本的对象。依次是:Dom,Page。Crawler,Manager。- Dom对象用来解析html,可以訪问html里的dom;
- Page对象相应到一个详细的html页面,可以取得整个网页的内容,Page对象中有一个Dom对象的成员;
- Crawler对象可以理解为就是爬虫对象,用来设置要爬取页面的规则。
- Manager对象原本是用来管理Crawler对象的。以后也许能用来在多进程环境下使用,但眼下没有实现,所以临时没实用;
要说明的是Phpfetcher的默认Page对象中的Dom对象使用的是simple_html_dom,没有使用PHP提供的DOMDocument类,由于我发现DOMDocument对HTML格式的内容兼容性比較差。有时网页中混入其他内容时可能解析不出dom。以下这张是图是Phpfetcher的文件夹结构:你能够依据自己的须要定制想要的Crawler,Page,Dom类。默认情况下我提供了Crawler的默认类是Phpfetcher_Crawler_Default。Page的默认类是Phpfetcher_Page_Default。Dom的默认类是Phpfetcher_Dom_SimpleHtmlDom。类名和它们所在的路径有相应关系。要注意的是,在使用默认的Page对象时须要PHP的curl库,使用默认的Crawler对象时须要使用PHP的mb_string库,没有的须要装一下。为了便于理解。我画了几张图,第一张是Phpfetcher的三个主要对象之间的关系:
图里表示的是Crawler里面有Page的对象,Page里面有Dom的对象。
在使用Phpfetcher时,最重要的是完毕下图中两个绿色矩形框要求的事情:即你要写一个类继承Phpfetcher提供的Crawler类,然后在你自己的类中实现一个名为handlePage($page)的函数。
当中$page參数是一个Phpfetcher的Page类对象。最后这里给出一个主要的流程图: 上面说的东西有点虚,那还是直接看实例吧!
2 简单样例
****** 实例1:single_page.php ******比如我们要抓取这个站点的内容:http://news.qq.com/a/20140927/026557.htm里面有非常多超链接。有标题,有新闻具体内容。或者其他我们关心的内容。先看一下以下的样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?<p></p><p>php require_once ( 'phpfetcher.php' ); class mycrawler extends Phpfetcher_Crawler_Default { public function handlePage( $page ) { //打印处当前页面的title $res = $page ->sel( '//title' ); for ( $i = 0; $i < count ( $res ); ++ $i ) { echo $res [ $i ]->plaintext; echo "\n" ; } } } $crawler = new mycrawler(); $arrJobs = array ( //任务的名字随便起,这里把名字叫qqnews //the key is the name of a job, here names it qqnews 'qqnews' => array ( 'start_page' => 'http://news.qq.com/a/20140927/026557.htm' , //起始网页 'link_rules' => array ( /* * 全部在这里列出的正则规则,仅仅要能匹配到超链接,那么那条爬虫就会爬到那条超链接 * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches */ ), //爬虫从開始页面算起。最多爬取的深度,设置为1表示仅仅爬取起始页面 //Crawler's max following depth, 1 stands for only crawl the start page 'max_depth' => 1, ) , ); //$crawler->setFetchJobs($arrJobs)->run(); 这一行的效果和以下两行的效果一样 $crawler ->setFetchJobs( $arrJobs ); $crawler ->run();</p> |
1 2 | [root@reetsee demo] # php single_page.php 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网 |
1 2 3 4 5 6 7 8 | <!DOCTYPE html> <html lang= "zh-CN" > <head> <meta http-equiv= "Content-Type" content= "text/html; charset=gb2312" ></meta> <meta charset= "gb2312" ></meta> <title> 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网 </title> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?<p></p><p>php //以下两行使得这个项目被下载下来后本文件能直接执行 $demo_include_path = dirname( __FILE__ ) . '/../' ; set_include_path(get_include_path() . PATH_SEPARATOR . $demo_include_path ); require_once ( 'phpfetcher.php' ); class mycrawler extends Phpfetcher_Crawler_Default { public function handlePage( $page ) { //打印处当前页面的第1个h1标题内荣(下标从0開始) $strFirstH1 = trim( $page ->sel( '//h1' , 0)->plaintext); if (! empty ( $strFirstH1 )) { echo $page ->sel( '//h1' , 0)->plaintext; echo "\n" ; } } } $crawler = new mycrawler(); $arrJobs = array ( //任务的名字随便起。这里把名字叫qqnews //the key is the name of a job, here names it qqnews 'qqnews' => array ( 'start_page' => 'http://news.qq.com' , //起始网页 'link_rules' => array ( /* * 全部在这里列出的正则规则,仅仅要能匹配到超链接,那么那条爬虫就会爬到那条超链接 * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches */ '#news\.qq\.com/a/\d+/\d+\.htm$#' , ), //爬虫从開始页面算起,最多爬取的深度,设置为2表示爬取深度为1 //Crawler's max following depth, 1 stands for only crawl the start page 'max_depth' => 2, ) , ); $crawler ->setFetchJobs( $arrJobs )->run(); //这一行的效果和以下两行的效果一样 //$crawler->setFetchJobs($arrJobs); //$crawler->run();</p> |

临时我就介绍这两个样例吧,Phpfetcher的源码在这里:https://github.com/fanfank/phpfetcher把代码下载下来后。demo内的东西就能够直接执行了(当然你须要一个有curl和mb_string扩展的php,能够使用“php -m”命令来看一下你的PHP有没有装这两个扩展)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架