php+R語言分析網站回應時間
來源:互聯網
上載者:User
要做一個網路爬蟲,抓取網頁上的特定內容。以前有高年級研究生學長寫過一個,但是老師嫌棄時間太久,上千個資料而已,竟然要用一夜,這次要我來做,我想先進行一下可行性的研究,要用到R語言進行統計。
這次實驗的痛點有兩個,或者說實際上就只有一個,那就是資料的正常化表示。以前沒用過php進行檔案讀寫操作,這是頭一次。需要考慮的是檔案讀寫的頻率,雖然只是一個實驗,但是效率還是要考慮的。過於頻繁的檔案讀寫,對磁碟過於耗時的操作,是個大問題。所以這個要考慮。其實是資料的格式問題,以什麼樣的格式儲存。要考慮後續R語言處理的問題,R語言可以處理純文字,資料之間可以使用分隔字元,比喻逗號、甚至是定位字元。所以檔案裡面的資料打算用逗號分隔了。
首先貼上PHP代碼
<?php
include ("php_lib/LIB_http.php");
error_reporting(E_ALL^E_NOTICE);
$target ="http://www.*****";
$ref = "http://www.*****";
$filename = 'sitevisitors.txt';
$first=microtime(get_as_float);
for($n=0;$n<5000;$n++){
$betime=microtime(get_as_float);
$return_arry = http_get_withheader($target,$ref);
$finidown = microtime(get_as_float);
$resulttime = $finidown - $betime;
$count[$n] = $resulttime;
//echo $count[$n]."\n";
echo"\n".$n;
}
$fp = fopen("data.txt", "a");
//fputs ($fp, "$count[0]");
for($n=0;$n<5000;$n++){
fputs($fp, "\r\n".$count[$n]);
}
$last=microtime(get_as_float);
$result=$last-$first;
fclose ($fp);
echo"\nend this test";
echo"\n the time is:".$result;
?>
由於這個網站不便公布,所以上串連地址和主機地址用*號代替,還請諒解。程式會先設計一個5000個元素的數組,然後發5000次http請求,記錄下每次的時間。http報文中好像會有這個時間,但自己記不真切了,所以用的是microtime()函數,注意要加上get_as_float才可以做減法,而且加上include ("php_lib/LIB_http.php");屏蔽掉所有的php notice.
所有的資料全都寫進data.txt檔案,要注意的是,檔案資料格式應該是矩陣,就算只有一個資料來源,即只有一列,也要每個資料獨佔一行,不能連著寫,比如不能1,2,3,4……,而應該是:
1
2
3
4
……
之所以這麼做是因為R語言的緣故,R語言是對矩陣進行讀寫,所以這麼寫最方便(也有可能有更好的辦法,只是我不知道而已)。
得到時間後,開啟R語言環境,接著做統計:
①讀取資料:
data<-read.table("data.txt",header=FALSE,sep=",",col.names=c('num'))
②求平均值:
mean(data[,1])
注意不能是 mean(data),否則會出現如下警告:
[1] NA
警告資訊:
In mean.default(data) : 參數不是數值也不是邏輯值:回覆NA
data[,1]表示矩陣data的第一列(其實這裡也就僅有一列,但也要這麼寫)。
③想畫出散佈圖,但是座標精度太小,分辨不出,這還要繼續研究:
c<-data[,1]
mydata<-rbind(c,c)
mydata<-as.data.frame(mydata)
namse(mydata)<-c("x","y")
with(mydata,plot(x,y,pch=19,main="the result"))
圖倒是畫出來了,但是座標精度只到小數點後2位,如何提高座標精度,目前正在研究,options(digits)是不行了。接著想吧。