此篇重點介紹下抓取百度app直播間評論,自動儲存本地檔案,PHP 提取解析。
前置準備
fiddler 配置、Openssl 安裝等,網上資料比較多不是難題。安卓模擬器(比如夜神)。
亂碼的問題
勾選工具欄上的 Decode
編寫自定義規則
找到 OnBeforeResponse
方法
後面追加自定義的程式碼
if (oSession.uriContains("pim.baidu.com/imsapi/1.0/fetchmsg/liveshow")){
try{
oSession.utilDecodeResponse();// 防止亂碼
var jsonString = oSession.GetResponseBodyAsString();
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(jsonString);
if((responseJSON.JSONObject=='System.Collections.ArrayList' || responseJSON.JSONObject=='System.Collections.Hashtable')&&jsonString!='[]'&&jsonString!='{}'){
// messages欄位
var messages = responseJSON.JSONObject["messages"];
//FiddlerObject.log(messages); //列印
var str = '';
for(var j in messages){
var item = '';
item += "msgid="+j["msgid"];
item += "&from_user="+j["from_user"];
item += "&create_time="+j["create_time"];
var text = j["content"];
var textJson = Fiddler.WebFormats.JSON.JsonDecode(text);
var text_body = textJson.JSONObject["text"];
item += "&text='" + text_body + "'";
str += item + '|';
}
//儲存
var fso;
var file;
fso = new ActiveXObject("Scripting.FileSystemObject");
//不要在C盤不要有中文,碟符分隔符用\\放入的時候要先建立
file = fso.OpenTextFile("E:\\WWW\\fiddler\\response\\"+ parseInt(+new Date()/1000) + ".txt",8 ,true, true);
file.write(str);
file.close();
}
}catch(e){
FiddlerObject.log(e)
FiddlerObject.log("啊哦!儲存文字時候出錯了!!!")
}
}
原始的資料不規則,建議先用 fiddler 層層解析後再儲存檔案。解析成 json
格式用的方法是 Fiddler.WebFormats.JSON.JsonDecode
,responseJSON.JSONObject["messages"]
是 messages
json 陣列。
上面的程式碼拼裝成了字串引數形式,以 |
分隔。
後端解析儲存的檔案
// 儲存檔案的資料夾
$fidder_public_dir = 'E:\WWW\fiddler\response';
// 檢視資料夾下的檔案
$scan = $this->scanFile($fidder_public_dir);
/*return null or array*/
public function scanFile($path)
{
global $result;
$files = scandir($path);
foreach ($files as $file){
if ($file != '.' && $file != '..'){
$result[] = basename($file);
}
}
return $result;
}
// 提取其中一個
$filename = $scan[0];
// 完整路徑
$filename_full = $fidder_public_dir.'/'.$filename;
// 去bom頭
$content = $this->detect_utf_encoding($filename_full);
public function detect_utf_encoding($filename){
if( 'UTF-16LE' === $this->utf_encoding( $filename )){
return iconv('UTF-16', 'UTF-8', file_get_contents( $filename ));
}else {
return file_get_contents( $filename );
}
}
public function utf_encoding($filename) {
$utf32_big_bom = chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF);
$utf32_little_bom = chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00);
$utf16_big_bom = chr(0xFE) . chr(0xFF);
$utf16_little_bom = chr(0xFF) . chr(0xFE);
$utf8_bom = chr(0xEF) . chr(0xBB) . chr(0xBF);
$text = file_get_contents($filename);
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
if ($first3 == $utf8_bom) return 'UTF-8';
elseif ($first4 == $utf32_big_bom) return 'UTF-32BE';
elseif ($first4 == $utf32_little_bom) return 'UTF-32LE';
elseif ($first2 == $utf16_big_bom) return 'UTF-16BE';
elseif ($first2 == $utf16_little_bom) return 'UTF-16LE';
}
// 儲存到新的地址
$new_save_dir = public_path().'/fiddler/response/';
file_put_contents( $new_save_path.$filename, $content);
// 刪除原檔案
unlink($filename_full);
// 解析
$arr = explode('|',$content);
foreach ($arr as $value) {
parse_str(trim($value),$tmp);
$item['msgid'] = $tmp['msgid'];
...
}
// 入庫
本作品採用《CC 協議》,轉載必須註明作者和本文連結