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

技术杂谈53

这篇文章首发在吹水小镇: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以免显示乱码:

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的文件夹结构:一个简单的开源PHP爬虫框架『Phpfetcher』你能够依据自己的须要定制想要的Crawler,Page,Dom类。默认情况下我提供了Crawler的默认类是Phpfetcher_Crawler_Default。Page的默认类是Phpfetcher_Page_Default。Dom的默认类是Phpfetcher_Dom_SimpleHtmlDom。类名和它们所在的路径有相应关系。要注意的是,在使用默认的Page对象时须要PHP的curl库,使用默认的Crawler对象时须要使用PHP的mb_string库,没有的须要装一下。为了便于理解。我画了几张图,第一张是Phpfetcher的三个主要对象之间的关系:一个简单的开源PHP爬虫框架『Phpfetcher』图里表示的是Crawler里面有Page的对象,Page里面有Dom的对象。

在使用Phpfetcher时,最重要的是完毕下图中两个绿色矩形框要求的事情:一个简单的开源PHP爬虫框架『Phpfetcher』即你要写一个类继承Phpfetcher提供的Crawler类,然后在你自己的类中实现一个名为handlePage($page)的函数。

当中$page參数是一个Phpfetcher的Page类对象。最后这里给出一个主要的流程图:一个简单的开源PHP爬虫框架『Phpfetcher』 上面说的东西有点虚,那还是直接看实例吧!

2 简单样例

** 实例1:single_page.php ****

比如我们要抓取这个站点的内容:
http://news.qq.com/a/20140927/026557.htm

里面有非常多超链接。有标题,有新闻具体内容。或者其他我们关心的内容。

先看一下以下的样例:

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();

将这个脚本和"phpfetcher.php"以及"Phpfetcher"文件夹放在同一个文件夹下(或者将"phpfetcher.php"和"Phpfetcher"放到你的PHP环境默认include的查找路径),运行这个脚本,得到的输出例如以下:

[root@reetsee demo]# php single_page.php
王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网

查看一下我们抓取的网页源码。能够发现是以下这几行中的title标签内容提取出来了:

王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网

上面就是一个最简单的样例。
** 实例2:multi_page.php ****

接下来就是另外一个简单的样例,比如说腾讯新闻的主页,上面有各种新闻,我们这次的目标是把腾讯新闻主页(
http://news.qq.com

)显示的部分新闻标题抓下来。直接先上例程:

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();

相比于第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

。执行这个文件,能够看到大致效果例如以下:
一个简单的开源PHP爬虫框架『Phpfetcher』

这样第二个样例就结束了。

临时我就介绍这两个样例吧,Phpfetcher的源码在这里:https://github.com/fanfank/phpfetcher把代码下载下来后。demo内的东西就能够直接执行了(当然你须要一个有curl和mb_string扩展的php,能够使用"php -m"命令来看一下你的PHP有没有装这两个扩展)。

3 后话

实际上这个phpfetcher眼下还有非常多问题,性能应该是比較差的,只是毕竟也是我写的第一个框架。另外是关于phpfetcher我有非常多东西还没有提到,比如Page对象的一些设置,Crawler对象的设置等,主要是眼下太过懒不想写文档,也不知道有没有必要写。我感觉这个框架还是蛮简单的,里面基本的函数我都做了具体的凝视,欢迎阅读批评指正给建议!最后就是,假设你想写个爬虫,又想用PHP来写,最好还是试一下phpfetcher。
祝大家国庆节快乐~!

Original: https://www.cnblogs.com/mthoutai/p/7403334.html
Author: mthoutai
Title: 一个简单的开源PHP爬虫框架『Phpfetcher』



相关阅读

Title: 记疫情期间第一次TOGAF认证课:从线下转到线上教育

2019年底,我们招募2020年第一期TOGAF认证公开课学员,10人小班,不到一周时间名额就满了。两天周末时间,还有从外地赶过来的。有1/3学员在听完线下课后有种如饥似渴的感觉,还加购了线上TOGAF补充课程,并且还有几个学员报名了3月份的BangBA线下公开课。

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

2月8日我决定招募2月份认证线上课。考虑到已经过了2月第一周,招生也需要时间,所以在群里发出时间定在2月29-3月1这两天。刚发出来有帮友就反馈这个时间段不一定有空。

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

也没做过多考虑,既然有人希望早点,那就早点,于是把时间往前调了一周。就这么简单,从2月8日早上想要招生开始,就开始招募了。

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

刚在微店上架,帮友就报名了。在此感谢陈淑敏的第一个反馈以及报名。

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

之后陆续有帮友购买

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

为了让更多人了解TOGFA和认证,我在2月15日开了IT帮的第一个布道课:TOGAF概述及认证介绍。

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

这个课程有100多人报名参加,关于课程内容可以看 《TOGAF概述及认证》布道课讲义全内容

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

就这样,2月份一共有33人报名进行线上TOGAF认证学习。

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

在开课前我给大家发了一个课前问卷,问了一些问题。才发现其中有1/3是朋友介绍过来了,真的感谢那些默默推荐的人员。

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

今天在上课群聊天,才知道吴言自己报名后还拉了6个敏捷圈子中的人过来。真的非常感谢这些默默信任和支持的帮友,自此在EA圈子中终于又多了一些敏捷圈子中的人了:)

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

这是第一次线上认证公开课,招生搞定了,接下来就是准备开课学习了。我给大家写了一段开课寄语:

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

之后几天又补充了预习安排

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

有了安排之后,就开始按照计划开始。首先是课前调查,我需要了解一下本次学员的基本情况,毕竟要同时满足30多人的需求还是需要有些准备的。

在调查中有几个问题,其中一个是企业架构经验。经过调查发现,一半以上只是听过企业架构。

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

考虑到是线上课程,提前问问大家的时间,发现一半不到认为自己有时间全程参加,看来有不少人已经想好了要看回放了:)

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

另外问到预习安排,有一半都是在特别忙的情况下参加,真是一群爱学习的人。

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

这个培训是要考TOGAF证书的,所以我先了解一下对考试的担心,发现还是有大半部分人比较担忧。只要按照IT帮的备考指南去做,不出意外肯定通过,因为我今年1月才去亲测了一下,在此预祝各位考试顺利:)

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

还有一个是大家来IT帮学习的主要考虑因素是什么,其中专业性第一、口碑第二。回答中"其他"这1个备注的是转介绍,所以也可以归为口碑。

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

调查完后就是每天的预习。每次预习中都会在群里打个卡,以便我知道大家的预习情况。在预习中,考虑到开课前让大家调试好学习环境,额外加了一个布道课。

就这样到了周六,开始了我们的正式课程。因为这次疫情关系,购买了讲义的同学也无法正常收到讲义,学员就边听边做笔记

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

开场给大家做了一些我对企业架构的认识,并就我自己的经验做了一些介绍,学员课后会就课程内容在学习群里发表一下看法

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

原来担心大家线上的互动,所以第一节讲的多一些,课间学员反馈可以多一些互动,于是立刻调整,适合的时候就问问大家。2天课程结束后,我把课程录播放到了千聊上,所有学员都可以在半年内重复学习。

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

这是第一次线上直播,我深知有很多需要学习和改进的,所以在课后又给大家发了一个调查,帮助我在3月份的公开课做改进。

首先让大家对培训做了一个总评价。大部分满足期望,还有1/4超出预期,能有这样的结果也是不错的。

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

学习满意度其实有时候讲师不是最主要因素,学员自己的投入是一个重要因素。确认了一下大家的参加情况,全程参加的比之前计划的多,看来大家是为这两天培训调整了自己的安排。还有和我请假的,原因是必须临时在家里带小孩。作为父母的我们,多么不容易啊:)

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

在谈到培训后的帮助,一半以上觉得帮助很大

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

TOGAF是一个进入EA领域的很好的框架,2天学习不可能就能用在真实项目中。这不是TOGAF做不到,而是学员不可能2天掌握住。课后我问了一下大家的收获,大部分学员都给出了积极的评价:

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

并且有1/3同学表示会深入学习,并肯定会参加IT帮后面的TOGAF实践课。从以上反馈来看,这次线上认证公开课还是不错的交付了。因为还有几个私信和我聊,并希望未来能去他们企业中做内训。

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

以上是我们第一次进行线下直播课程的招生到培训的过程。但课程结束意味着另一个开始,大家就要开始做15套测试题,为TOGAF鉴定级认证考试做准备了。

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

如果你希望学习TOGAF,欢迎扫码下图的二维码关注我们的开课信息。

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

有了2月份的经验,我们在3月份会做一些改进,让学员有更好的收获。例如:

  1. 对课前预习内容调整,例如提前提供术语表,并且对关键概念采用双语标注,易于理解

  2. 整体节奏控制一下,对答疑环节可以优化一下

  3. 对线上授课的互动、氛围多一些考虑

另,之前的一些合作机构问我怎么招生的,以上就是全过程,可参考:)

Original: https://www.cnblogs.com/zhoujg/p/12426950.html
Author: 周 金根
Title: 记疫情期间第一次TOGAF认证课:从线下转到线上教育