2011-11-30

使用php搜集資料(擷取遠端網頁的HTML資料):file_get_contents / preg_match / get_meta_tags

很多網頁都會用網址超連結來傳遞參數(採用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秒後,程式就會自動跳掉了...
}      
?>

沒有留言:

張貼留言