溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于PHP如何實(shí)現(xiàn)微博熱搜實(shí)時(shí)監(jiān)控平臺(tái)

發(fā)布時(shí)間:2022-06-18 13:43:25 來源:億速云 閱讀:195 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“基于PHP如何實(shí)現(xiàn)微博熱搜實(shí)時(shí)監(jiān)控平臺(tái)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“基于PHP如何實(shí)現(xiàn)微博熱搜實(shí)時(shí)監(jiān)控平臺(tái)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

    一、整體思路

    對于搜集數(shù)據(jù)當(dāng)然是寫個(gè)爬蟲就好了,首先腦里閃過的是用python,但是人總是喜歡嘗試下新東西,于是我選擇試試用PHP來寫爬蟲。所以,大體框架便出來了:

    基于PHP如何實(shí)現(xiàn)微博熱搜實(shí)時(shí)監(jiān)控平臺(tái)

    二、數(shù)據(jù)爬取

    1.獲取HTML

    PHP爬取微博熱搜頁面,得到HTML源碼:

    function getUrlContent($url){//通過url獲取html內(nèi)容
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1 )");
        curl_setopt($ch,CURLOPT_HEADER,1);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
     }

    當(dāng)然,也可以直接用file_get_contents等方法。

    2.提取數(shù)據(jù)

    通過正則等方式,將HTML中的table標(biāo)簽提取出來,并轉(zhuǎn)換為Array類型:

    function getTable($html) {
      preg_match_all("/<table>[\s\S]*?<\/table>/i",$html,$table);
      $table = $table[0][0];
        $table = preg_replace("'<table[^>]*?>'si","",$table);
        $table = preg_replace("'<tr[^>]*?>'si","",$table);
        $table = preg_replace("'<td[^>]*?>'si","",$table);
        $table = str_replace("</tr>","{tr}",$table);
        $table = str_replace("</td>","{td}",$table);
        //去掉 HTML 標(biāo)記
        $table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);
        //去掉空白字符
        $table = preg_replace("'([rn])[s]+'","",$table);
        $table = str_replace(" ","",$table);
        $table = str_replace(" ","",$table);
        $table = explode('{tr}', $table);
        array_pop($table);
        foreach ($table as $key=>$tr) {
          // 自己可添加對應(yīng)的替換
          $tr = str_replace("\n\n","",$tr);
            $td = explode('{td}', $tr);
            array_pop($td);
            $td_array[] = $td;
        }
        return $td_array;
    }

    3.返回?cái)?shù)據(jù)

    爬取整理數(shù)據(jù)并返回以便前端調(diào)用:

    $html = getUrlContent("https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6");
    $table = getTable($html);
    $table = array_slice($table,2); # 把前面多余部分截掉
    echo json_encode($table);

    至此,可將以上代碼整合為一個(gè)php文件,設(shè)名為“weibo.php”,以待前端通過ajax的方式調(diào)用。

    三、數(shù)據(jù)可視化

    實(shí)不相瞞:前端咱不行,但四處搬磚、東拼西湊還是比較拿手的~ 現(xiàn)學(xué)了echarts.js,再看看網(wǎng)上前輩大佬們的演示,最終還是“湊”了出來。

    1.畫柱狀圖

    利用echarts.js在畫布上畫出統(tǒng)計(jì)的柱狀圖:

    function CreateBar(keywords,value){
      //初始化echarts實(shí)例
        var myChart = echarts.init(document.getElementById('chartmain'));
        myChart.on('click',function(param){
        window.open('#');
      });
      //指定圖標(biāo)的配置和數(shù)據(jù)
        var option = {
            title:{
                text:''
            },
            tooltip:{},
            grid:{
              top:"15%",
              left:"16%",
              bottom:"5%"
            },
            legend:{
                data:['熱搜詞']
            },
            xAxis:{
            },
            yAxis:{
              data:keywords
            },
            series:[{
                name:'搜索量',
                type:'bar',
                itemStyle: {
                    normal: {
                        color: '#ff9406'
                    }
              },
                data:value
            }]
        };
        myChart.setOption(option);
    }

    這里需要兩個(gè)參數(shù)(兩個(gè)Array),即熱搜詞和搜索量,而它們得通過ajax的方式向后端發(fā)送請求獲取。

    2.ajax請求數(shù)據(jù)

    通過ajax的方式向后端發(fā)起請求(即之前提到的weibo.php),以獲得數(shù)據(jù):

    function GetData(){
      $.ajax({
        type: "post",        //數(shù)據(jù)提交方式(post/get)
        url: "weibo.php",    //提交到的url
        dataType: "json",    //返回的數(shù)據(jù)類型格式
        
        success: function(msg){
          //返回成功的回調(diào)函數(shù)
          if(msg!=''){
            var data = eval(msg); //將返回的json數(shù)據(jù)進(jìn)行解析,并賦給data
            var keywords = [];
            var value = [];
            for(var i=0; i < 20; i++){ // 取TOP20
              keywords.push(data[i][1].split('\n')[0]);
              value.push(Number(data[i][1].split('\n')[1]));
            }
            CreateBar(keywords.reverse(),value.reverse());
            setInterval("GetData()",10000); // 間隔10S
           }
          },
          error:function(msg){
            //返回失敗的回調(diào)函數(shù)
            console.log(msg);
            setInterval("GetData()",30000); // 間隔30S
          }
      });
    }

    注:這里用了**setInterval()**的方法來實(shí)現(xiàn)定時(shí)發(fā)送異步請求,以實(shí)現(xiàn)實(shí)時(shí)監(jiān)控。

    四、效果展示

    經(jīng)過不懈的嘗試和修改,最后達(dá)到了一個(gè)還算比較滿意的效果,大概就是這個(gè)樣子啦:

    基于PHP如何實(shí)現(xiàn)微博熱搜實(shí)時(shí)監(jiān)控平臺(tái)

    讀到這里,這篇“基于PHP如何實(shí)現(xiàn)微博熱搜實(shí)時(shí)監(jiān)控平臺(tái)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    php
    AI