使用PHP抓取微博數(shù)據(jù)實(shí)現(xiàn)demo及原理解析
實(shí)現(xiàn)目標(biāo)
1. 用戶發(fā)布的微博內(nèi)容;
2. 用戶發(fā)布的時(shí)間;
3. 用戶的名稱; (這里我并沒(méi)有獲取)
使用的工具
voku/simple_html_dom x-path
讀取工具 (如果不知道怎么獲取元素的xpath, 請(qǐng)百度這里不做贅述~)
安裝:
composer require voku/simple_html_dom
實(shí)現(xiàn)的原理
當(dāng)你去直接用file_get_contents去抓取微博的網(wǎng)頁(yè)內(nèi)容時(shí), 你會(huì)被它的訪客系統(tǒng)直接攔截, 所以直接用這個(gè)方法是不行的;
所以我采用了curl來(lái)獲取. 當(dāng)然,直接獲取也是不行的, 所以我們要設(shè)置一下請(qǐng)求頭, 微博對(duì)爬蟲類的請(qǐng)求頭是不會(huì)拒絕的,
所以你可以直接抓取到網(wǎng)頁(yè);
請(qǐng)求頭設(shè)置如下:
'User-Agent: spider'
代碼如下:
// 通過(guò)這段代碼你可以直接獲取到微博的(HTML)網(wǎng)頁(yè) public function curlGetWbData() { // 設(shè)置腳本超時(shí)時(shí)間 set_time_limit(60); // 拉取微博地址 $getWbUrl = "https://weibo.com/p/1005056447467552/home?profile_ftype=1&is_all=1#_0"; // 設(shè)置curl 請(qǐng)求頭 $header = [ 'User-Agent: spider' ]; $ch = curl_init(); // 初始化curl curl_setopt($ch, CURLOPT_URL, $getWbUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁止 cURL 驗(yàn)證對(duì)等證書 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 設(shè)置請(qǐng)求頭 $wbContent = curl_exec($ch); curl_close($ch); // 到這里我們就拿到了微博的網(wǎng)頁(yè) return $wbContent; }
拿到微博的網(wǎng)頁(yè)內(nèi)容之后, 我們就要對(duì)立面的數(shù)據(jù)進(jìn)行提取, 因?yàn)椴⒉皇撬械臄?shù)據(jù)我們都需要;
這里我們提取 微博內(nèi)容 微博發(fā)布的時(shí)間; 現(xiàn)在需要使用x-path來(lái)進(jìn)行提取;
x-path示例:
div[class='WB_cardwrap WB_feed_type S_bg2 WB_feed_like ']
代碼如下:
// 這個(gè)方法是 public static function actionAddWbData(string $wbContent, string $userID) { $htmlDeal = new HtmlDomParser(); // 處理DOM的對(duì)象 $htmlDeal->load($wbContent); // 裝載文本 // 微博VIP和普通用戶的class名不一致 $wbHtml['normal'] = $htmlDeal->find("div[class='WB_cardwrap WB_feed_type S_bg2 WB_feed_like ']"); $wbHtml['vip'] = $htmlDeal->find("div[class='WB_cardwrap WB_feed_type S_bg2 WB_feed_vipcover WB_feed_like ']"); $wbNum = []; foreach ($wbHtml as $item => $key) { if (count($key) <= 0) { continue; } $wbNum[$userID][$item] = self::dealWbContent($key, $userID); } Yii::info("抓取微博日志記錄" . '----' . json_encode($wbNum)); return $wbNum; }
以上就是使用PHP抓取微博數(shù)據(jù)實(shí)現(xiàn)demo及原理解析的詳細(xì)內(nèi)容,更多關(guān)于PHP抓取微博數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
CI框架無(wú)限級(jí)分類+遞歸的實(shí)現(xiàn)代碼
CodeIgniter是一個(gè)輕量級(jí)但功能強(qiáng)大的PHP框架,基于MVC設(shè)計(jì)模式,提供了一套豐富的類庫(kù),簡(jiǎn)單易學(xué),高效實(shí)用。下面給大家介紹CI框架無(wú)限級(jí)分類+遞歸的實(shí)現(xiàn)代碼,感興趣的朋友參考下吧2016-11-11PHP迭代器實(shí)現(xiàn)斐波納契數(shù)列的函數(shù)
斐波納契數(shù)列通常做法是用遞歸實(shí)現(xiàn),當(dāng)然還有其它的方法。這里現(xiàn)學(xué)現(xiàn)賣,用PHP的迭代器來(lái)實(shí)現(xiàn)一個(gè)斐波納契數(shù)列,幾乎沒(méi)有什么難度,只是把類里的next()方法重寫了一次。注釋已經(jīng)寫到代碼中,也是相當(dāng)好理解的2013-11-11PHP微信開發(fā)之微信消息自動(dòng)回復(fù)下所遇到的坑
這篇文章是小編給大家介紹的微信消息自動(dòng)回復(fù)下所遇到的坑的相關(guān)內(nèi)容,在日常項(xiàng)目開發(fā)中經(jīng)常遇到,非常具有參考借鑒價(jià)值,感興趣的小伙伴一起學(xué)習(xí)吧2016-05-05php設(shè)計(jì)模式之享元模式分析【星際爭(zhēng)霸游戲案例】
這篇文章主要介紹了php設(shè)計(jì)模式之享元模式,結(jié)合星際爭(zhēng)霸游戲案例形式分析了PHP享元模式的相關(guān)原理與使用技巧,需要的朋友可以參考下2020-03-03destoon安全設(shè)置中需要設(shè)置可寫權(quán)限的目錄及文件
這篇文章主要介紹了destoon安全設(shè)置中需要設(shè)置可寫權(quán)限的目錄及文件,對(duì)于安全設(shè)置非常重要!需要的朋友可以參考下2014-06-06