PHP類推薦:QueryList|基於phpQuery的無比強大的PHP採集工具

QueryList的出現讓PHP作採集從未如此簡單。得益於phpQuery,讓使用QueryList幾乎沒有任何學習成本,只要會CSS3選擇器就能夠輕鬆使用QueryList了,和jQuery選擇器用法徹底通用,它讓PHP作採集像jQuery選擇元素同樣簡單。php

初探html

看看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
 */

進階cookie

上面的採集結果有不少「雜質」,必定不會知足你的要求,來獲取咱們真正想要的結果。多線程

<?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);

全貌curl

正如你看到的那樣,QueryList只有一個主要的方法Query,學會了使用Query方法也就意味着你已經熟練了QueryList!ide

<?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變得無限可能!post

<?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);
    }
]);
相關文章
相關標籤/搜索