程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP爬取糗事百科首頁糗事

PHP爬取糗事百科首頁糗事

編輯:關於PHP編程

PHP爬取糗事百科首頁糗事


突然想獲取一些網上的數據來玩玩,因為有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 );

這樣一來,獲取--->解析--->插入就完成了,效果就是運行一次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數據庫,情況如下:

\

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

 

 

 

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved