突然想獲取一些網上的數據來玩玩,因為有SAE的MySql數據庫,讓它在那呆著沒有什麼卵用!於是就開始用PHP編寫一個爬取糗事百科首頁糗事的小程序,數據都保存在MySql中,豈不是很好玩!
說干就干!首先確定思路
獲取HTML源碼--->解析HTML--->保存到數據庫
沒有什麼難的
1、創建PHP文件“getDataToDB.php”,
2、獲取指定URL的HTML源碼
這裡我用的是curl函數,詳細內容參見PHP手冊
代碼為
// 獲取對應鏈接的HTMLCODE function GetHtmlCode($url) { $ch = curl_init (); // 初始化一個cur對象 curl_setopt ( $ch, CURLOPT_URL, $url ); // 設置需要抓取的網頁 curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); // 設置crul參數,要求結果保存到字符串中還是輸出到屏幕上 curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 1000 ); // 設置鏈接延遲 $HtmlCode = curl_exec ( $ch ); // 運行curl,請求網頁 return $HtmlCode; }3、引入第三方文件’simple_html_dom.php‘來解析HTML
這裡我沒有能力使用正則表達式,就在網上海搜,終於找到這個,就像Java使用Jsoup(使用Jsoup解析滁州學院官網獲取新聞列表)一樣,具體參見BLOG
代碼如下
function getFmlDataToDB() { $link = mysql_connect ( SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT, SAE_MYSQL_USER, SAE_MYSQL_PASS ); // 獲取源碼 $html = str_get_html ( GetHtmlCode ( http://www.qiushibaike.com/ ) ); if ($link) { mysql_select_db ( SAE_MYSQL_DB, $link ); mysql_query ( 'set names utf8' ); // class=article block untagged mb15 foreach ( $html->find ( 'div[class=article block untagged mb15]' ) as $per ) { $z = null; $t = null; $w = null; $d = null; $p = null; $ds = null; $ps = null; // //作者 $author = $per->find ( 'div[class=author]' ); if ($author != null) { $a = $author [0]->find ( 'a' ); $z = $a [1]->innertext; } else { $z = 'no author'; } // 頭像鏈接 if ($author != null) { $icon = $author [0]->find ( 'a' ); $t = $icon [0]->src->innertext; } else { $t = '...............'; } // 文章內容 $content = $per->find ( 'div[class=content]' ); $w = $content [0]->innertext; // 點贊數 $vote1 = $per->find ( 'div[class=stats]' ); $vote2 = $vote1 [0]->find ( 'span[class=stats-vote]' ); $vote3 = $vote2 [0]->find ( 'i[class=number]' ); $d = $vote3 [0]->innertext; // 評論數 $comments1 = $vote1 [0]->find ( 'span[class=stats-comments]' ); $comments2 = $comments1 [0]->find ( 'a[class=qiushi_comments]' ); $comments3 = $comments2 [0]->find ( 'i[class=number]' ); $p = $comments3 [0]->innertext; // 頂 數 $up_down = $per->find ( 'div[class=stats-buttons bar clearfix]' ); $up_down1 = $up_down [0]->find ( 'ul' ); $li = $up_down1 [0]->find ( 'li' ); $up = $li [0]->find ( 'span[class=number hidden]' ); $ds = $up [0]->innertext; // 拍 數 $down = $li [1]->find ( 'span[class=number hidden]' ); $ps = $down [0]->innertext; } } else { echo '數據庫鏈接KO'; } }這個代碼寫的有點糾結,我試了一下不能直接獲取子節點的數據,只能從外層一層一層的剝開解析,如果有新的寫法,我會更新,也請各位看官看看。
4、創建數據庫,將數據插入到數據庫中
這裡我使用的SAE中的MySQL,具體的連接方發參見使用PHP連接SAE中的MySql數據庫
需要注意的就是編碼格式,區要在執行語句前加上這樣一句話
mysql_query ( 'set names utf8' );核心代碼如下:
$sql = INSERT INTO `app_bmhjqs`.`db_fml` (`id`, `author`, `icon_url`, `content`, `vote`, `comments`, `up`, `down`) VALUES (NULL, '$z', '$t', '$w', '$d', '$p', '$ds', '$ps');; // 解決亂碼 mysql_query ( 'set names utf8' ); $result = mysql_query ( $sql );
// 定時器 // ignore_user_abort (); // run script. in background // set_time_limit ( 0 ); // run script. forever // $interval = 30; // do every 15 minutes.. // do { // echo date ( 'Y-m-d H:i:s', time () ); // echo '寫入數據庫'; // //getFmlDataToDB (); // } while ( true );在文件裡加上這樣的代碼,正好在學校斷網前,發布到了SAE上,我沒有測試!只能等到第二天來查看結果了!
今天早上,我迫不及待的打開電腦,打開SAE數據庫,情況如下:
額滴神!受不鳥了,趕緊把定時器關掉了,寫了個按鈕觸發事件!這樣下去,數據庫會被擠滿的!