您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

一个简单的开源PHP爬虫框架『Phpfetcher』

2025/11/11 23:27:08发布21次查看
这篇文章首发在吹水小镇:http://blog.reetsee.com/archives/366
要在手机或者电脑看到更好的图片或代码欢迎到博文原地址。也欢迎到博文原地址批评指正。
好久不见了!我终于又写一篇日志了,本来有很多流水帐想发但是感觉没营养,就作罢了。今天我主要分享一个简单的php爬虫框架,名字叫: phpfetcher 项目的地址是:https://github.com/fanfank/phpfetcher这个框架的作者是:reetsee.xu,即吹水。把整个项目下载下来后,在linux下的终端直接执行 demo文件夹下的single_page.php即可看到效果。不过在执行demo文件前,先设置一下你的终端编码为utf-8以免显示乱码: 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对象的,以后或许能用来在多进程环境下使用,但目前没有实现,所以暂时没有用; 大致概念就是这样了,实际使用主要是操作crawler对象。在phpfetcher中,你可以实现自己的dom,page和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里面有很多超链接,有标题,有新闻详细内容,或者其它我们关心的内容。先看一下下面的例子: sel('//title'); for ($i = 0; $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();
将这个脚本和“phpfetcher.php”以及“phpfetcher”文件夹放在同一个目录下(或者将“phpfetcher.php”和“phpfetcher”放到你的php环境默认include的查找路径),执行这个脚本,得到的输出如下: [root@reetsee demo]# php single_page.php 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网
查看一下我们抓取的网页源代码,可以发现是下面这几行中的title标签内容提取出来了: 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网
上面就是一个最简单的例子。 ****** 实例2:multi_page.php ******接下来就是另外一个简单的例子,例如说腾讯新闻的主页,上面有各种新闻,我们这次的目标是把腾讯新闻主页( http://news.qq.com)显示的部分新闻标题抓下来,直接先上例程: 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();
相比于第1个例子,变化的地方有几个:首先这次我们增加了一条爬虫跟踪的规则“#news\.qq\.com/a/\d+/\d+\.htm$#”(注:php使用pcre正则表达式,可以到 php关于正则表达式的页面看一下),这是一个正则表达式,例如这种超链接“news.qq.com/a/12345678/00234.htm”那么爬虫就会跟踪;然后是我们把爬虫的最大跟踪深度设置为2,这样爬虫会跟踪1次起始页面上符合要求的超级链接;最后是我把原本的dom选择从“//title”改为了“//h1”,意思就是抓取h1标签的内容而不是像之前那样抓取title标签,想知道这种dom选择器的选择规则,需要了解一下 xpath。运行这个文件,能够看到大致效果如下:   这样第二个例子就结束了。暂时我就介绍这两个例子吧,phpfetcher的源代码在这里: https://github.com/fanfank/phpfetcher把代码下载下来后,demo内的东西就可以直接运行了(当然你需要一个有curl和mb_string扩展的php,可以使用“php -m”命令来看一下你的php有没有装这两个扩展)。 3 后话 实际上这个phpfetcher目前还有很多问题,性能应该是比较差的,不过毕竟也是我写的第一个框架。另外是关于phpfetcher我有很多东西还没有提到,例如page对象的一些设置,crawler对象的设置等,主要是目前太过懒不想写文档,也不知道有没有必要写。我感觉这个框架还是蛮简单的,里面主要的函数我都做了详细的注释,欢迎阅读批评指正给建议!最后就是,如果你想写个爬虫,又想用php来写,不妨试一下phpfetcher。 祝大家国庆节快乐~!
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product