PHP爬取糗事百科首頁糗事
突然想擷取一些網上的資料來玩玩,因為有SAE的MySql資料庫,讓它在那獃著沒有什麼卵用!於是就開始用PHP編寫一個爬取糗事百科首頁糗事的小程式,資料都儲存在MySql中,豈不是很好玩!
說幹就幹!首先確定思路
擷取HTML源碼--->解析HTML--->儲存到資料庫
沒有什麼難的
1、建立PHP檔案“getDataToDB.php”,
2、擷取指定URL的HTML源碼
這裡我用的是curl函數,詳細內容參見PHP手冊
代碼為
// 擷取對應連結的HTMLCODEfunction 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
這裡我沒有能力使用Regex,就在網上海搜,終於找到這個,就像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 mb15foreach ( $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 );
這樣一來,擷取--->解析--->插入就完成了,效果就是運行一次PHP檔案,資料庫就添加了糗事百科首頁上的糗事!我想可不可以寫個定時器,每隔一定時間就運行一次代碼,這一點在java我可以實現,在php我不會,畢竟是個沒長毛的小鳥!百度吧。。。搜到這樣的寫法
// 定時器// 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資料庫,情況如下:
額滴神!受不鳥了,趕緊把定時器關掉了,寫了個按鈕觸發事件!這樣下去,資料庫會被擠滿的!
http://www.bkjia.com/PHPjc/1004123.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1004123.htmlTechArticlePHP爬取糗事百科首頁糗事 突然想擷取一些網上的資料來玩玩,因為有SAE的MySql資料庫,讓它在那獃著沒有什麼卵用!於是就開始用PHP編寫一...