这篇文章首发在吹水小镇:http://blog.reetsee.com/archives/366
要在手机或者电脑看到更好的图片或代码欢迎到博文原地址。也欢迎到博文原地址批评指正。
转载请注明: 吹水小镇
| reetsee.com
原文链接地址: http://blog.reetsee.com/archives/366
——————————————————————————————
export LANG=en_US.UTF-8————————————————————————————————
你可以根据自己的需要定制想要的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类对象。最后这里给出一个基本的流程图:
上面说的东西有点虚,那还是直接看实例吧!
<?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标签内容提取出来了:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"></meta>
<meta charset="gb2312"></meta>
<title>
王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网
</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。运行这个文件,能够看到大致效果如下:
这样第二个例子就结束了。暂时我就介绍这两个例子吧,Phpfetcher的源代码在这里:https://github.com/fanfank/phpfetcher把代码下载下来后,demo内的东西就可以直接运行了(当然你需要一个有curl和mb_string扩展的php,可以使用“php
-m”命令来看一下你的PHP有没有装这两个扩展)。
原文:http://blog.csdn.net/fanfank/article/details/40693281