突然想獲取一些網上的數據來玩玩,因為有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數據庫,情況如下:

額滴神!受不鳥了,趕緊把定時器關掉了,寫了個按鈕觸發事件!這樣下去,數據庫會被擠滿的!