很多網頁都會用網址超連結來傳遞參數(採用GET方法),藉此來運作程式,很方便,但相對的資訊的隱藏效果,就不會太好!
有很多網站的網址,可能類似:http://www.web-addr.xom/program.aspx?id=101 的格式,假設id=101是搜尋資料的根據,先測試一下id的資料範圍,假設id介於1~50000,接下來要用迴圈來取得遠端主機的這5萬筆對應的資料。
<?php
//id的起始值
$i = 1;
//連接資料庫的設定值,取得的資料將放到資料庫中
$oLink = @mysqli_connect('localhost','user','passwd','dbname');
while ($i < 50001) {
//要擷取的網頁
$zURL = "http://www.web-addr.xom/program.aspx?id=" . "$i";
//取得網頁的內容
$zHTML = file_get_contents($zURL);
//比對要擷取的內容
//preg_match(規則, 被比對的資料來源, 結果);
//取得網頁內容($zHTML)中,介於<abc>和</abc>之間的資料,
// (/斜線之前要加\倒斜線)
//( )括號代表:Group and capture
// . 點代表:match any one character (execept \n)
// * 星號代表:match 0 or more times
// /s 代表:讓 . 點 也可以match \n
preg_match("<abc>(.*)<\/abc>/s", $zHTML, $aMatch);
//取得資料
$zWord = $aMatch[1];
//取得 meta的值 (Description 及 Keywords)
$aMetaTag = get_meta_tags($zURL);
$zDescription = $aMetaTag["description"];
$zKeywords = $aMetaTag["keywords"];
//為防止取得的資料包含'單引號,
//可以先用addslashes函數,預先處理要存入資料庫的資料
//如果有將big5轉換為UTF-8的必要,
//可以用iconv("big5","UTF-8",$zWord);進行轉換
$zSQL = "insert into ...... ";
//如果遠端伺服器,有防火牆等機制,不允許密集的連線,
//可以用sleep(int seconds);先暫停幾秒,再擷取下一筆資料
$i = $i + 1;
//php.ini的max_execution_time預設是30秒,
//如過要截取得資料數量龐大,30秒絕對不夠用
//執行程式前,先調整一下max_execution_time,重新啟動apache
//不然擷取執行30秒後,程式就會自動跳掉了...
}
?>
沒有留言:
張貼留言