亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

Chrome Headless

什么是Chrome Headless

Headless Chrome 是 Chrome 瀏覽器的無界面形態,可以在不打開瀏覽器的前提下,使用所有 Chrome 支持的特性運行你的程序,簡而言之,除了沒有圖形界面,headless chrome具有所有現代瀏覽器的特性,可以像在其他現代瀏覽器里一樣渲染目標網頁,并能進行網頁截圖,獲取cookie,獲取html等操作。 而對于寫爬蟲的同學,很多都會面臨都一個問題,那就是數據都是通過動態渲染,甚至是加密得到的,普通的分析接口模式早已無法滿足需求,因此我們引入Chrome Headless 來解決數據渲染問題。

部署 Chrome Headless

因為環境部署不是本文的重點,因此我們直接推薦docker。

docker pull alpeware/chrome-headless-trunk
docker run -d -p 9222:9222 alpeware/chrome-headless-trunk

訪問debug 地址即可得到接口信息

curl http://{HOST}:9222/json

以下例子中,{HOST}定義的IP主機響

驅動Chrome Headless

Chrome Headless 可以通過websocket協議進行遠程驅動debug。首先我們引入easyswoole的websocket客戶端。

composer require easyswoole/http-client

我們以網站 https://datacenter.jin10.com/price 為例子,我們打開可以發現,里面的數據都是通過websocket實時刷新的,這個時候,通過傳統手段抓接口的手段,是很難實現的。模擬實現如下:

use EasySwoole\HttpClient\HttpClient;
use EasySwoole\Spl\SplBean;
use Swoole\WebSocket\Frame;

static $i = 0;

//定義命令bean,具體協議格式可以看 Chrome Headless 文檔

class Command extends SplBean{
    protected $method;
    protected $id;
    protected $params;
    protected function initialize(): void
    {
        if(empty($this->id)){
            global $i;
            $i++;
            $this->id = $i;
        }
    }
}
//用websocket協議去驅動Chrome Headless
go(function (){
    $targetUrl = 'https://datacenter.jin10.com/price';
    $ch = curl_init('http://{HOST}:9222/json');
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $data = json_decode( curl_exec($ch) ,true);
    $client = new HttpClient($data[0]['webSocketDebuggerUrl']);
    if($client->upgrade()){
        //打開URL
        $command = new Command([
            'method'=>'Page.navigate',
            'params'=>[
                'url'=>$targetUrl
            ]
        ]);
        $client->getClient()->push($command->__toString());
        $client->recv(1);
        //模擬等待渲染
        \co::sleep(2);
        //實現 js 語句
        $command = new Command([
            'method'=>'Runtime.evaluate',
            'params'=>[
                'expression'=>"var p = document.querySelector('#J_pricewall > div:nth-child(1) > ul > li:nth-child(1)').innerHTML;p;"
            ]
        ]);
        $client->getClient()->push($command->__toString());
        //此處就可以得到渲染后的數據了
        $data = json_decode($client->recv()->data,true)['result']['result']['value'];
        var_dump($data);

    }else{
        var_dump('handshake fail');
    }
});

以上教程僅供學習之用,請勿用于非法用途

主站蜘蛛池模板: 麻豆做爰免费观看 | 毛片a片免费观看 | 一区二区三区欧美日韩 | 一区二区三区四区日韩 | 六月激情婷婷 | 欧美国产中文 | 九九99九九精彩4 | 九九热精品在线播放 | 欧美精品第一页 | 国产a视频 | 国产黄色美女视频 | 亚洲综合成人av | 免费人成在线观看欧美精品 | 美女精品 | 成人一区二 | 成人av一区二区免费播放 | 成人精品在线播放 | 美女毛片在线观看 | 国产一区久久久 | 中文字幕一区二区三区四区久久 | 国产一区二区在线免费观看 | 久久看片 | 欧美一级片网址 | 三级网站影院 | 亚洲图片 欧美 | 欧美成人在线免费观看 | 久久最新 | 免费日韩电影网站在线观看 | 亚洲a v网站 | 日韩小视频在线 | a级a做爰片成人毛片入口 | 色综合天天 | 国产精品网站在线 | 欧美中文字幕一区二区三区亚洲 | 黄色软件哪里下载 | 三级黄色片在线观看 | 亚洲精品7777xxxx青睐 | 成人免费黄色片 | 国内精品小视频 | 一区二区三区欧美视频 | 精品免费观看 |