queryList 配合 PhantomJS 外掛 採集 JavaScript 動態渲染的頁面

php_yt發表於2021-01-15

百度搜尋 queryList文件地址

queryList 配合 PhantomJS 外掛 採集 JavaScript 動態渲染的頁面

queryList 配合 PhantomJS 外掛 採集 JavaScript 動態渲染的頁面

由於 PhantomJSlaravel 的引入支援不好,所以我將兩者安裝到專案根目錄的 sdk/queryList/ 下。

"jaeger/querylist": "^4.2",
"jaeger/querylist-phantomjs": "^4.0"

再下載 PhantomJS 二進位制檔案,我也放到了 sdk/ 目錄下。

queryList 配合 PhantomJS 外掛 採集 JavaScript 動態渲染的頁面

Laravel 中在 console 中寫邏輯程式碼,以抓取百度直播網頁版為例:

queryList 配合 PhantomJS 外掛 採集 JavaScript 動態渲染的頁面

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use DB;

class Phantomjs extends Command
{
    protected $signature = 'js:test';
    protected $description = '....';
    protected $ql;
    public function __construct(){
        parent::__construct();   
    }
    public function handle()
    {
        require_once base_path().'/sdk/queryList/vendor/autoload.php';
        $this->ql = \QL\QueryList::getInstance();
        // 設定PhantomJS二進位制檔案路徑
        $this->ql->use(\QL\Ext\PhantomJs::class,'/www/wwwroot/blog/sdk/phantomjs-2.1.1/bin/phantomjs');

        while(true){
            $this->bd();
            sleep(5);
        }
    }

    public function bd(){
        $room_id = $this->bd_roomid;
        $url = 'http://mbd.baidu.com/webpage?type=live&action=liveshow&room_id='.$room_id;

        $data = $this->ql->browser(function (\JonnyW\PhantomJs\Http\RequestInterface $r) use ($url){
            $r->setMethod('GET');
            $r->setUrl($url);
            $r->setTimeout(10000); // 10 seconds 
            $r->setDelay(3); // 3 seconds 這裡的延時很重要
            return $r;
        })
        ->rules([
            'avatar' => ['.msg-box-avatar', 'src'],
            'username' => ['.msg-box-name', 'text'],
            'text' => ['.msg-box-text', 'text'],
        ])
        ->range('.msg-box')
        ->queryData(); //array
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
focus

相關文章