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); } ]);