(phpstudy)CurlMulti:queryList批量採集圖片鏈接到數據庫

呃,現階段還不會使用多線程裏配合圖片的直接下載 -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
            ]);
    }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章