phpQuery与网页采集

/ 0评 / 0

在网页采集的时候,通常都会用到正则表达式。但是有时候对于正则不太好的同学,比如我,那就杯具了。。所以网上某大牛就创建了这样一个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就好了。。

$content['txt']  = iconv('gbk','utf-8',$content['txt'] );

不过,百度有防采集。。。囧,每隔5分钟左右或采集到一定字节就禁止访问了。。。能力有限,采不了。。

发表评论

您的电子邮箱地址不会被公开。

*