PHP类推荐:QueryList|基于phpQuery的无比强大的PHP采集工具

QueryList的出现让PHP做采集从未如此简单。得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,和jQuery选择器用法完全通用,它让PHP做采集像jQuery选择元素一样简单。

初探

看看PHP用QueryList做采集到底有多简洁吧!

<?php
use QL\QueryList;

//采集某页面所有的图片
$data = QueryList::Query(‘http://cms.querylist.cc/bizhi/453.html‘,array(
    //采集规则库
    //‘规则名‘ => array(‘jQuery选择器‘,‘要采集的属性‘),
    ‘image‘ => array(‘img‘,‘src‘)
    ))->data;
//打印结果
print_r($data);

//采集某页面所有的超链接
//可以先手动获取要采集的页面源码
$html = file_get_contents(‘http://cms.querylist.cc/google/list_1.html‘);
//然后可以把页面源码或者HTML片段传给QueryList
$data = QueryList::Query($html,array(
    ‘link‘ => array(‘a‘,‘href‘)
    ))->data;
//打印结果
print_r($data);

/**
 * 在线测试采集并查看采集结果:http://querylist.cc/page-Querytest.html
 */

进阶

上面的采集结果有很多“杂质”,一定不会满足你的要求,来获取我们真正想要的结果。

<?php
use QL\QueryList;

//采集该页面[正文内容]中所有的图片
$data = QueryList::Query(‘http://cms.querylist.cc/bizhi/453.html‘,array(
    ‘image‘ => array(‘.post_content img‘,‘src‘)
    ))->data;
//打印结果
print_r($data);

//采集该页面文章列表中所有[文章]的超链接
$data = QueryList::Query(‘http://cms.querylist.cc/google/list_1.html‘,array(
    ‘link‘ => array(‘h2>a‘,‘href‘,‘‘,function($content){
        //利用回调函数补全相对链接
        $baseUrl = ‘http://cms.querylist.cc‘;
        return $baseUrl.$content;
})),‘.cate_list li‘)->data;
//打印结果
print_r($data);

全貌

正如你看到的那样,QueryList只有一个主要的方法Query,学会了使用Query方法也就意味着你已经熟练了QueryList!

<?php
/**
 * 下面来完整的演示采集一篇文章页的文章标题、发布日期和文章内容
 */

 //引入自动加载文件
require ‘vendor/autoload.php‘;
/**
 * 或者手动引入
 *
 * 引入QueryList依赖
 * require ‘QueryList/phpQuery.php‘;
 * 引入QueryList
 * require ‘QueryList/QueryList.php‘;
 */

use QL\QueryList;

//需要采集的目标页面
$page = ‘http://cms.querylist.cc/news/566.html‘;
//采集规则
$reg = array(
    //采集文章标题
    ‘title‘ => array(‘h1‘,‘text‘),
    //采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
    ‘date‘ => array(‘.pt_info‘,‘text‘,‘-span -a‘,function($content){
        //用回调函数进一步过滤出日期
        $arr = explode(‘ ‘,$content);
        return $arr[0];
    }),
    //采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
    ‘content‘ => array(‘.post_content‘,‘html‘,‘a -.content_copyright -script‘,function($content){
            //利用回调函数下载文章中的图片并替换图片路径为本地路径
            //使用本例请确保当前目录下有image文件夹,并有写入权限
            //由于QueryList是基于phpQuery的,所以可以随时随地使用phpQuery,当然在这里也可以使用正则或者其它方式达到同样的目的
            $doc = phpQuery::newDocumentHTML($content);
            $imgs = pq($doc)->find(‘img‘);
            foreach ($imgs as $img) {
                $src = ‘http://cms.querylist.cc‘.pq($img)->attr(‘src‘);
                $localSrc = ‘image/‘.md5($src).‘.jpg‘;
                $stream = file_get_contents($src);
                file_put_contents($localSrc,$stream);
                pq($img)->attr(‘src‘,$localSrc);
            }
            return $doc->htmlOuter();
    })
    );
$rang = ‘.content‘;
$ql = QueryList::Query($page,$reg,$rang);
$data = $ql->getData();
//打印结果
print_r($data);

扩展

QueryList的功能很单一,就是Query,但扩展让QueryList变得无限可能!

<?php
/**
 * 目前已经有:HTTP操作、多线程、模拟登陆等QueryList扩展
 * 下面来利用QueryList扩展来组合上面的例子,实现多线程采集文章并保存文章图片到本地
 */
use QL\QueryList;

//HTTP操作扩展
$urls = QueryList::run(‘Request‘,[
        ‘target‘ => ‘http://cms.querylist.cc/news/list_2.html‘,
        ‘referrer‘=>‘http://cms.querylist.cc‘,
        ‘method‘ => ‘GET‘,
        ‘params‘ => [‘var1‘ => ‘testvalue‘, ‘var2‘ => ‘somevalue‘],
        ‘user_agent‘=>‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0‘,
        ‘cookiePath‘ => ‘./cookie.txt‘,
        ‘timeout‘ =>‘30‘
    ])->setQuery([‘link‘ => [‘h2>a‘,‘href‘,‘‘,function($content){
    //利用回调函数补全相对链接
    $baseUrl = ‘http://cms.querylist.cc‘;
    return $baseUrl.$content;
}]],‘.cate_list li‘)->getData(function($item){
    return $item[‘link‘];
});

//多线程扩展
QueryList::run(‘Multi‘,[
    ‘list‘ => $urls,
    ‘curl‘ => [
        ‘opt‘ => array(
                    CURLOPT_SSL_VERIFYPEER => false,
                    CURLOPT_SSL_VERIFYHOST => false,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_AUTOREFERER => true,
                ),
        //设置线程数
        ‘maxThread‘ => 100,
        //设置最大尝试数
        ‘maxTry‘ => 3
    ],
    ‘success‘ => function($a){
        //采集规则
        $reg = array(
            //采集文章标题
            ‘title‘ => array(‘h1‘,‘text‘),
            //采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
            ‘date‘ => array(‘.pt_info‘,‘text‘,‘-span -a‘,function($content){
                //用回调函数进一步过滤出日期
                $arr = explode(‘ ‘,$content);
                return $arr[0];
            }),
            //采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
            ‘content‘ => array(‘.post_content‘,‘html‘,‘a -.content_copyright -script‘,function($content){
                    //利用回调函数下载文章中的图片并替换图片路径为本地路径
                    //使用本例请确保当前目录下有image文件夹,并有写入权限
                    //由于QueryList是基于phpQuery的,所以可以随时随地使用phpQuery,当然在这里也可以使用正则或者其它方式达到同样的目的
                    $doc = phpQuery::newDocumentHTML($content);
                    $imgs = pq($doc)->find(‘img‘);
                    foreach ($imgs as $img) {
                        $src = pq($img)->attr(‘src‘);
                        $localSrc = ‘image/‘.md5($src).‘.jpg‘;
                        $stream = file_get_contents($src);
                        file_put_contents($localSrc,$stream);
                        pq($img)->attr(‘src‘,$localSrc);
                    }
                    return $doc->htmlOuter();
            })
            );
        $rang = ‘.content‘;
        $ql = QueryList::Query($a[‘content‘],$reg,$rang);
        $data = $ql->getData();
        //打印结果,实际操作中这里应该做入数据库操作
        print_r($data);
    }
]);

原文地址:http://blog.51cto.com/taoyouth/2301505

时间: 2024-11-07 10:55:53

PHP类推荐:QueryList|基于phpQuery的无比强大的PHP采集工具的相关文章

阿里云小蜜获评&quot;智能客服技术产品/解决方案大类推荐品牌&quot;

摘要: 7月24日,由客户世界机构主办,中国呼叫中心与电子商务发展研究院.全球呼叫中心产业联盟联合支持的客户世界? 洞察者2018北京论坛在丽景湾国际酒店圆满举行.作为全球领先的智能客服产品及方案提供商,阿里云小蜜获得本次大会主办方颁发的"智能客服技术产品/解决方案大类推荐品牌"奖项. 7月24日,由客户世界机构主办,中国呼叫中心与电子商务发展研究院.全球呼叫中心产业联盟联合支持的客户世界? 洞察者2018北京论坛在丽景湾国际酒店圆满举行.作为全球领先的智能客服产品及方案提供商,阿里云

分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Caching; using System.Text; using System.Threading.Tasks; namespace AutoLogisticsPH.Common.Utils { /// <summary> /// 基于MemoryCache(内存缓存)的缓存工具类 /// Author:左文俊 ///

推荐给开发人员的6个实用命令行工具

推荐给开发人员的6个实用命令行工具 作为一名Web开发者,当程序出现问题时日子总不是那么好过.问题可能无处不在,可能是你发送的请求出了错,可能是回复出了错,可能是你使用的某个第三方库出了问题,又或者是一个外部API调用失败了.优秀的工具对于定位问题出在何处有着无可估量的价值,而且能在一开始就帮助我们阻止问题的出现,总的来说能使我们的工作更有效率.命令行工具尤其有用,因为它们非常易于做自动化和脚本处理,能够以各种不同的方式进行组合和重用.本文介绍了6个非常强大且灵活的工具,熟练使用这些工具能使你的

基于Node.js的强大爬虫 能直接发布抓取的文章哦

基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什么linux都行,我用的是CentOS 6.5: 2)装个mysql数据库,5.5或5.6均可,图省事可以直接用lnmp或lamp来装,回头还能直接在浏览器看日志: 3)先安个node.js环境,我用的是0.12.7,更靠后的版本没试过: 4)执行npm -g install forever,安装f

好物推荐,码出高效 - 超实用的开源录屏工具,100%免费

Captura是一款开源的屏幕录像工具.基于MIT许可,可以免费使用.具有捕获屏幕.网络摄像头.音频.光标,鼠标等功能. 喜欢录制网课和教程的同学有福了.Captura的主界面也非常友好,不过目前只能在Windows平台工作,依赖.NET 4.7.2. 下载地址:https://mathewsachin.github.io/Captura/ 源代码:https://github.com/MathewSachin/Captura 原文标题:好物推荐,码出高效 - 超实用的开源录屏工具,100%免费

推荐几个对Asp.Net开发者比较实用的工具

推荐几个对Asp.Net开发者比较实用的工具.大家有相关工具也可以在评论区留言,一起努力学习. 工具 1.Visual stdio Productivity Power tool:visual stdio专业版及其以上版本的扩展工具,它用有非常丰富的特性,例如:快速查找.解决文件导航.引用文件可查找化. 2.MZ-Tools:他可以在方法.文件.项目.解决方案.选择的文本.项目组或解决方案组中查找字符串.查找结果在窗口中全部显示,而非vs中的只显示一个结果. 3.Web Essentials:大

推荐几个对Asp.Net开发者比较实用的工具 2

推荐几个对Asp.Net开发者比较实用的工具.大家有相关工具也可以在评论区留言,一起努力学习. 作为程序员要有挑战精神,大家可以尝试一下这些工具. 已经有篇文章写到了vs的扩展工具,这里不再累赘,请查看:推荐几个对Asp.Net开发者比较实用的工具 1.Asp.Net Fiddler:捕获HTTP请求和响应,以及模拟HTTP请求的工具,下载地址:http://www.telerik.com/fiddler AutoMapper:对象映射工具,例如可以把实体对象转换影射为领域对象.而且这种行为是全

基于Java NIO的多人在线聊天工具源码实现(登录,单聊,群聊)

近来在学习Java NIO网络开发知识,写了一个基于Java NIO的多人在线聊天工具练练手.源码公开在Coding上: https://coding.net/u/hust_wsh/p/MyChat/git ,开发环境是Ubuntu14.04+Eclipse Mars+JDK1.8. 要想编写一个基于Java NIO的多人在线聊天工具,我总结需要以下几方面的地址:客户端服务器模型,Java NIO中的Selector,SocketChannel,ByteBuffer,Collections以及序

基于AD的用户组织目录树选择工具的解决方案

基于AD的用户组织目录树选择工具的解决方案 2009-03-06 11:00 by Virus-BeautyCode, 1675 阅读, 5 评论, 收藏, 编辑 本文的需求来自进来SharePoint开发中的人员选择,基础中国的用户更加喜欢通过组织结构来选择人员,这样可以清晰的知道选择人员的部门,通过组织结构选择人员是本文的讨论点. 我也是集合了前人的思路,进行了整合,参考了下面的博客 基于AD的用户组织目录树选择工具的解决方案http://blog.lickies.cn/Lists/Post