呃,現階段還不會使用多線程裏配合圖片的直接下載 -2018-12-23 11:29:45
另,雖然採集到了圖片(也就是說改改就能採集到文章內容),但是呢離自己想要的文章變形還有不小的差距.就當技術儲備了吧. ̄へ ̄
之前遇到的問題
CurlMulti 在QueryList中找不到
AbsoluteUrl也無法使用
使用composer安裝
composer require jaeger/querylist-curl-multi
composer require jaeger/querylist-absolute-url
下面是完整的代碼
<?php
namespace app\index\controller;
use \app\index\controller\User;
use \app\admin\controller\Index as AdminIndex;
use QL\QueryList;
use QL\Ext\AbsoluteUrl;
use QL\Ext\CurlMulti;
use think\Db;
use think\Controller;
class Index extends Controller
{
public function index()
{
$DB=new Db;
// $data = $DB::table('gxxl')->select();
$data = Db::query("select * from imgmsic");
// 分配數據
$this->assign("data",$data);
return view();
}
public function gxxlImg()
{
// 註冊插件
$ql = QueryList::use([
AbsoluteUrl::class, // 轉換URL相對路徑到絕對路徑
CurlMulti::class // Curl多線程採集
]);
// 獲取文章列表鏈接集合,使用AbsoluteUrl插件轉換URL相對路徑到絕對路徑.
$urls = $ql->get('http://baidu.com/tupian/list.html',[
'param1' => 'testvalue',
'params2' => 'somevalue'
],[
'headers' => [
'Referer' => 'http://baidu.com/',
'User-Agent' => 'testing/1.0',
'Accept' => 'application/json',
'X-Foo' => ['Bar', 'Baz'],
'Cookie' => 'abc=111;xxx=222'
]
])->absoluteUrl('http://baidu.com/tupian/list.html')->find('.hy-video-list .clearfix a')->attrs('href')->all();
//使用CurlMulti多線程插件採集文檔內容
$ql->rules([ // 設置採集規則
// 'title' => ['.head h3', 'text'],
'imgArr' => ['#playlist .playlist', 'html'],
// 'imgArr' => array('#playlist4 img','originalsrc')
])
// 設置採集任務
->curlMulti($urls)
// 每個任務成功完成調用此回調
->success(function (QueryList $ql, CurlMulti $curl, $r) {
echo "Current url:{$r['info']['url']} \r\n";
$data = $ql->query()->getData()->all();
$durl = QueryList::html($data[0]['imgArr'])->find('img')->map(function($a){
$src= $a->attr('originalsrc');
$title= $a->attr('title');
// 直接下載不會,只好寫入到數據庫中,再通過php curl下載吧
Db::execute("insert into imgmsic value(null,?,?)",[$src,$title]);
return $a->attr('originalsrc');
});
dump($durl);
dump($data);
})
// 開始執行多線程採集
->start([
// 最大併發數
'maxThread' => 10,
// 錯誤重試次數
'maxTry' => 3
]);
}
}