1.为什么要介绍phpquery,因为他强大:
Query的选择器之强大是有目共睹的,phpQuery 让php也拥有了jquery选择器这样的能力,它就相当于服务端的jQuery(这里主要指的选择器)。
2.它的存在意义:
我们有时需要抓取一个网站的页面内容,但只需要特定部分的信息,通常会用正则来解决,这当然没有问题。正则是一个通用解决方案,但对于一般的普通人来说正则肯定不会或者不熟练,这种情况下,怎么用更简单快捷的方法来抓取页面内容。比如你想有很多人想抓取淘宝商品的内容,也就是采集淘宝商品的属性;
3.浅谈phpquery:
phpQuery是基于php5新添加的DOMDocument。而DOMDocument则是专门用来处理html/xml。它提供了强大xpath选 择器及其他很多html/xml操作函数,使得处理html/xml起来非常方便。那为什么不直接使用呢?这个,去看一下官网的函数列表 就知道了,如果对自己的记忆力很有信心, 不妨一试。
4.下面教大家采集大家最喜欢的淘宝商品数据!
第一步:当然是下载phpquery啦,这里我们给大家整理出最新的phpquery供大家下载
<---点我下载--->
第二步:当然是引用了啊
require 'QueryList.class.php'; require 'http.class.php';第三步:找一个淘宝商品地址,采集出数据:
/** * 合肥多元速---最专业的网页设计培训基地 欢迎大家加入 * http://www.doysu.com * 培训咨询电话:0551-65118915 唐老师 * 多元速学员QQ交流群:316273374 */ require 'QueryList.class.php'; require 'http.class.php'; //淘宝商品地址 $url = 'https://detail.tmall.com/item.htm?spm=a230r.1.14.9.E4XguT&id=17985838738&cm_id=140105335569ed55e27b&abbucket=19&sku_properties=5919063:6536025'; //实例化 $http = new Http(); //获取网页内容 $html = $http->get($url); //内容转码 $html = iconv('GBK','UTF-8',$html); //需要获取的参数 $reg = array( 'shuxing' => array('.attributes ul li','text') ); $rang = ''; $data = QueryList::Query($html,$reg,$rang,'','UTF-8')->jsonArr; echo " "; print_r($data);我们来看看我们要获取什么?
下面是详细介绍phpquery详细用法:
//获取CSDN移动开发栏目下的文章列表标题 $hj = QueryList::Query('http://mobile.csdn.net/',array("title"=>array('.unit h1','text'))); print_r($hj->jsonArr); //回调函数1 function callfun1($content,$key) { return '回调函数1:'.$key.'-'.$content; } class HJ{ //回调函数2 static public function callfun2($content,$key) { return '回调函数2:'.$key.'-'.$content; } } //获取CSDN文章页下面的文章标题和内容 $url = 'http://www.csdn.net/article/2014-06-05/2820091-build-or-buy-a-mobile-game-backend'; $reg = array( 'title'=>array('h1','text','','callfun1'), //获取纯文本格式的标题,并调用回调函数1 'summary'=>array('.summary','text','-input strong'), //获取纯文本的文章摘要,但保strong标签并去除input标签 'content'=>array('.news_content','html','div a -.copyright'), //获取html格式的文章内容,但过滤掉div和a标签,去除类名为copyright的元素 'callback'=>array('HJ','callfun2') //调用回调函数2作为全局回调函数 ); $rang = '.left'; $hj = QueryList::Query($url,$reg,$rang,'curl'); print_r($hj->jsonArr); //继续获取右边相关热门文章列表的标题以及链接地址 $hj->setQuery(array('title'=>array('','text'),'url'=>array('a','href')),'#con_two_2 li'); //输出json数据 echo $hj->getJson();下面介绍下query方法(只需要调用就行了,在QueryList.class.php文件里面):
/** * 静态方法,访问入口 * @param string $page 要抓取的网页URL地址(支持https);或者是html源代码 * @param array $regArr 【选择器数组】说明:格式array("名称"=>array("选择器","类型"[,"标签过滤列表"][,"回调函数"]),.......[,"callback"=>"全局回调函数"]); * 【选择器】说明:可以为任意的jQuery选择器语法 * 【类型】说明:值 "text" ,"html" ,"HTML标签属性" , * 【标签过滤列表】:可选,当标签名前面添加减号(-)时(此时标签可以为任意的元素选择器),表示移除该标签以及标签内容,否则当【类型】值为text时表示需要保留的HTML标签,为html时表示要过滤掉的HTML标签 * 【回调函数】/【全局回调函数】:可选,字符串(函数名) 或 数组(array("类名","类的静态方法")),回调函数应有俩个参数,第一个参数是选择到的内容,第二个参数是选择器数组下标,回调函数会覆盖全局回调函数 * * @param string $regRange 【块选择器】:指 先按照规则 选出 几个大块 ,然后再分别再在块里面 进行相关的选择 * @param string $getHtmlWay 【源码获取方式】指是通过curl抓取源码,还是通过file_get_contents抓取源码 * @param string $outputEncoding【输出编码格式】指要以什么编码输出(UTF-8,GB2312,.....),防止出现乱码,如果设置为 假值 则不改变原字符串编码 */ public static function Query($page, $regArr, $regRange = '', $getHtmlWay = 'curl', $outputEncoding = false) { if(!(self::$ql instanceof self)) { self::$ql = new self(); } self::$ql->_query($page, $regArr, $regRange, $getHtmlWay, $outputEncoding); return self::$ql; }使用:$data = QueryList::Query($url,$reg,$rang,'curl','UTF-8');
那么怎么把数据转换为数组呢?
//转换为数组 $res = $data->jsonArr;