实验楼的php比赛题,网页数据提取。

实验楼的php比赛题,网页数据提取。

题目的地址:https://www.shiyanlou.com/contests/lou5/challenges

以下代码是题目的答案

<?php
header("Content-Type:text/html;charset=utf-8");
class Crawler{
	 private $content;
	 private $data;
	 static private $mysql;

	 public function __construct(){
	 	echo "开始爬取内容....";
	 }

	 public function loadFile($file_path){
	 	echo "正在加载文件";
	 	$this->content = file_get_contents($file_path);
	 }

	 public function parseCourseBody(){
	 	$regex = "/<body[^>]*?>(.*\s*?)<\/body>/is";
	 	if(preg_match_all($regex, $this->content, $matches)){
	 		$this->content = $matches[0];
	 	}
	 }

	 public function parseContent(){
	 	echo "开始解析内容...<br/>";
	 	$this->parseCourseBody();
	 	$this->parseTitle();
	 	$this->parseDesc();
	 	$this->parseType();
	 	$this->titleIsLong();
	 	$this->saveData();
	 	echo "解析内容结束!<br/>";
	 }

	 public function saveData(){
	 	echo "存入数据库...<br/>";
	 	self::$mysql = mysql_connect("localhost","root","root");
	 	mysql_query("set names utf8");
	 	mysql_select_db("databases",self::$mysql);
	 	$cnames = $this->data['cnames'];
	 	$cdescs = $this->data['cdescs'];
	 	$ctypes = $this->data['ctypes'];
	 	$nlongs = $this->data['nlongs'];
	 	foreach ($cnames as $key => $value) {
	 		$sql = "insert into `course_data`(`cname`,`cdesc`,`ctype`,`nlong`) values('".$cnames[$key]."','".$cdescs[$key]."','".$ctypes[$key]."','".$nlongs[$key]."')";
	 		mysql_query($sql);
	 	}
	 	mysql_close();
	 }

	 public function parseTitle(){
	 	echo "解析课程标题...<br/>";
	 	$regex= "/<div class=\"course-name\".*?>.*?<\/div>/ism";   
		if(preg_match_all($regex, $this->content, $matches)){
			$cnames = $matches[0];
		}
		foreach ($cnames as &$value) {
			$value = str_replace("</div>","",str_replace("<div class=\"course-name\">", "", $value));
		}
		$this->data['cnames'] = $cnames;
	 }

	 public function parseDesc(){
	 	echo "解析课程简介...<br/>";
	 	$regex4= "/<div class=\"course-desc\".*?>.*?<\/div>/ism";   
		if(preg_match_all($regex, $this->content, $matches)){
			$cdescs = $matches[0];
		}
		foreach ($cdescs as &$value) {
			$value = str_replace("</div>","",str_replace("<div class=\"course-desc\">", "", $value));
		}
		$this->data['cdescs'] = $cdescs;
	 }

	 public function parseType(){
	 	echo "解析课程类型...<br/>";
	 	$regex= "/<div class=\"course-footer\".*?>.*?<\/div>/ism";   
		if(preg_match_all($regex, $this->content, $matches)){
			$ctypes = $matches[0];
		}
		foreach ($ctypes as &$value) {
			$str = str_replace("</div>","",str_replace("<div class=\"course-footer\">", "", $value));
			if(preg_match_all("/([\x{4e00}-\x{9fa5}])/u", $str, $match)){
				$value = join("",$match[0]);
			}else{
				$value = "免费";
		}
		$this->data['ctypes'] = $ctypes;
	 }

	 public function titleIsLong(){
	 	echo "判断课程名是否超长...<br/>";
	 	$cnames = $this->data['cnames'];
	 	foreach ($cnames as $value) {
	 		$nlongs[] = mb_strlen($value) > 16 : "true" : "false";
	 	}
	 	$this->data['nlongs'] = $nlongs;
	 }
}
$Crawler = new Crawler();
$Crawler->loadFile("test.html");
$Crawler->parseContent();

/**
 表结构
cname(varchar):完整的课程名
cdesc(varchar):课程描述
ctype(varchar):课程类型,值为 免费,会员,训练营。
nlong(enum('true','false')):课程名是否过长,课程名称超过16字符的时候为 true,否则为 false

create table `course_data`(
	`id` int(11) not null auto_increment,
	`cname` varchar(255) default null,
	`cdesc` varchar(255) default null,
	`ctype` varchar(255) default null,
	`nlong` enum('true','false') default null,
	primary key (`id`)
)engine=InnoDB default charset=utf8;
*/

  

posted @ 2017-05-19 14:50  Yxh_blogs  阅读(422)  评论(0编辑  收藏  举报