在网页采集的时候,通常都会用到正则表达式。但是有时候对于正则不太好的同学,比如我,那就杯具了。。所以网上某大牛就创建了这样一个phpQuery!顾名思义query,完全类似于jquery的语法,但这是服务器端的,总体来说就是可以用php来直接采集对应的网页内容了,真的是太方便了。。。
详细的资料可以看看ppc的:bbs.phpchina.com/thread-182518-1-1.html
如,以此页为例:guoxue.baidu.com/page/caabbead/index.html
我要获取这里的所有列表名称和列表url地址。
phpquery有多种初始化的方法,这里我用:
<?php
//初始化phpquery对象
$file = file_get_contents("guoxue.baidu.com/page/caabbead/index.html");
$dom = phpQuery::newDocument($file);
//这样可以得到网页标题
$title = pq("head > title")->text();
//获取网页标题
$title = $dom['head > title']->text();
//开始获取列表
//可以看到样式为.con这个div
$div = pq('.con')->find('a'); //把这个div里面的所有a标签作为对象存入$div
foreach($div as $d){ //循环,这里的$d即表示的是一个a对象了
$url = pq($d)->attr('href'); //获取href属性
$t = pq($d)->text(); //获取a标签里面的文本
$al[$url] = $t; //存入数组,循环,采集,存入数据库
}
例二。guoxue.baidu.com/page/caabbead/0.html
/**
这里我们要做的是获取这里的文章作者和内容,即关关雎鸠.....
分析得出作者是在 <div class="con"> 里面的p标签里面的。而内容则是被包含
在这个div里面的第二个子div,第一与第三个div是上下页。
*/
//创建对象
$file2 = file_get_contents("http://guoxue.baidu.com/page/caabbead/0.html");
$dom = phpQuery::newDocument($file2);
//获取了作者那一块信息。
$writer = pq('.con')->find('p')->text();
//echo $writer;
//$writer = getWriter($writer); //这是我写的获取作者的一个函数,很简单按:分割就得到了
$cont = pq('.con')->find('div'); //得到样式.con的div里面所有div对象
$content = array();
$content['writer'] = $writer;
$i =0;
foreach($cont as $arch){ //循环得到单个的div对象
if($i ==1){ //文章div是第二个
$content['txt'] = pq($arch)->html(); //这里就得到文章了
}
$i++;
}
//print_r($content);
?>
这样就完成了。不过采集需要注意的是编码问题。如不注意则有些生僻字则获取不到。
如上网页的编码是gb2312,而我的是utf-8则需要转码一下。
$content['txt'] = iconv('gb2312','utf-8',$content['txt'] ); //但是这样还是有很多字符丢失了。。搞了半天才明白。。这有关字符大小的关系。gb2312<gbk<gb18030
把gb2312改为gbk就好了。。
不过,百度有防采集。。。囧,每隔5分钟左右或采集到一定字节就禁止访问了。。。能力有限,采不了。。