需求
分析
php
流式数据读取 filte_get_contens
preg_match,preg_match_all,str_replace
局部/全局/数组替换 匹配- 关键 php正则 s修饰符与.组合执行可进行换行匹配
- 为方便,用了sqlite3扩展,建库建表插入保存数据,小巧灵活
代码
- php5.6以上,开启sqlite3扩展,建库建表
<?php
/**
* 使用php访问sqllite
*
*/
$db = new SQLite3('test.db');
if (!$db) {
echo $db->lastErrorMsg();
} else {
echo "Opened database successfully\n";
}
$sql = <<<EOF
CREATE TABLE course_data
(id INTEGER PRIMARY KEY AUTOINCREMENT,
cname CHAR(50) NOT NULL,
cdesc TEXT NOT NULL,
ctype CHAR(50) NOT NULL,
nlong CHAR(50) NOT NULL);
insert into `course_data` (`cname`,`cdesc`,`ctype`,`nlong`)values('标题','详情简介','类型','名字是否超过16个字符')
EOF;
$ret = $db->exec($sql);
if(!$ret){
echo $db->lastErrorMsg();
} else {
echo "Table created successfully\n";
}
$db->close();
/**
* micro php Crawler
* 以下代码结构仅供参考,可自由发挥,只要能实现挑战目的就可以。
*/
class Crawler
{
private $content;
private $data;
private static $mysql;
public function __construct()
{
echo "开始爬取内容...\n";
//TODO
}
public function loadFile($file_path)
{
echo "正在加载文件...\n";
$this->content = file_get_contents($file_path);
}
public function parseCourseBody()
{
// s修饰符与.组合执行可匹配换行
$course_body = '/<div[^>]*class="course-body"[^>]*>[^>]*<div[^>]*>(.*?)<\/div>[^>]*<div[^>]*>(.*?)<\/div>[^>]*<div[^>]*>(.*?)<\/div>/si';
// 全局匹配
preg_match_all($course_body, $this->content, $matches, PREG_SET_ORDER);
$data = [];
foreach ($matches as $key => $value) {
$data[$key]['cname'] = $value[1];
$data[$key]['cdesc'] = str_replace(array("\r", "\n", "\t", "\s", "<br>", " "), "", $value[2]);
$data[$key]['ctype'] = $this->parseType($value[3]);
$data[$key]['nlong'] = $this->titleIsLong($value[1]);
}
$this->data = $data;
}
public function parseContent()
{
echo "开始解析内容...\n";
$this->parseCourseBody();
echo "解析内容结束! \n";
$this->saveData();
}
// 存入数据库
public function saveData()
{
echo "正在存入数据库...\n";
$db = new SQLite3('test.db');
$template = "insert into `course_data` (`cname`,`cdesc`,`ctype`,`nlong`)values('%s','%s','%s','%s')";
foreach ($this->data as $v) {
extract($v);
$sql = sprintf($template, $cname, $cdesc, $ctype, $nlong);
$ret = $db->exec($sql);
}
$db->close();
echo "入库完成 !\n";
}
// 解析课程类型
public function parseType($str)
{
// 不执行执行匹配,只匹配第二个span中间内容
$reg = '/<span[^>]*class="course-[^>]*>(.*?)<\/span>/';
preg_match($reg, $str, $ctype);
// 设置免费默认类型
return empty($ctype) ? "免费" : $ctype[1];
}
// 判断课程名是否超长
public function titleIsLong($str)
{
$i = 0;
$count = 0;
// strlen默认会将中文字符当作两个字符
$len = strlen($str);
while ($i < $len) {
$chr = ord($str[$i]);
$count++;
$i++;
if ($i >= $len) {
break;
}
if ($chr & 0x80) {
$chr <<= 1;
while ($chr & 0x80) {
$i++;
$chr <<= 1;
}
}
}
return $count > 16 ? "true" : "false";
}
}
$Crawler = new Crawler();
$Crawler->loadFile('shiyanlou.html');
$Crawler->parseContent();
效果
id | cname | cdesc | ctype | nlong |
---|
|
1 | 标题 | 课程简介 | 类型 | 名字是否超过16个字符 |
2 | 新手指南之玩转实验楼 | 本实验主要通过介绍计算机相关技术的基础概念,实验楼的使用方法,面向完全没有编程经验的用户。从中我们将了解到实验楼的实验精神:“从实践切入,依靠交互性、操作性更强的课程,理论学习+动手实践共同激发你的创造力。” | 免费 | false |
3 | Linux 基础入门(新版) | 要在实验楼愉快地学习,先要熟练地使用Linux,本实验介绍Linux基本操作,shell环境下的常用命令。 | 免费 | false |
4 | Python网络爬虫实战--Scrapy框架学习 | 本训练营从一个简单的Scrapy项目入手,剖析爬虫的结构和Scrapy的运行规则,最后通过两个两个实战项目——「爬取实验楼课程信息」和「爬取电影网站信息」,带领大家从零基础入门,完全掌握使用Scrapy框架编写网络爬虫的技能。 | 训练营 | true |
5 | NBA常规赛结果预测——利用Python进行比赛数据分析 | 本课程将利用NBA在2015~2016年的比赛统计数据进行回归模型建立,最终在今年2016~2017的常规赛中预测每场比赛的输赢情况。 | 免费 | true |
6 | Python 气象数据分析 -- 《Python 数据分析实战》 | 本实验将对意大利北部沿海地区的气象数据进行分析与可视化。我们在实验过程中先会对数据进行清洗,然后运用Python中matplotlib模块的对数据进行可视化处理,最终从清晰的图表中得出我们的结论。本实验源自图灵教育的《Python数据分析实战》第2章,感谢图灵教育授权实验楼发布。 | 免费 | true |
7 | k-近邻算法实现手写数字识别系统--《机器学习实战 》 | 本课程将会从电影题材分类的例子入手,详细讲述`k-近邻`算法的原理。在这之后,我们将会使用该算法实现手写数字识别系统,书籍教程配套实验练习,帮助您更好得实战。本课程源自图灵教育的《机器学习实战》第2章,感谢图灵教育授权实验楼发布。 | 免费 | true |
8 | Python实现遗传算法求解n-queens问题 | 本课程将对遗传算法进行简单讲解,通过使用python实现简单的遗传算法求解函数极值以及通过实例了解Pyevolve的使用方法。非常适合熟悉Python基础,对算法较感兴趣的用户。遗传算法(Geneticalgorithm)属于演化计算(evolutionarycomputing),是随着人工智能领域发展而来的一种智能算法。正如它的名字所示,遗传算法是受达尔文进化论启发。简单来说,它是一种通过模拟自然进化过程搜索最优解的方法。 | 免费 | true |
9 | 用Vue.js 和 vue-router 创建单页导航和分页 | 使用Vue.js和vue-router创建单页应用非常的简单,使用Vue.js开发,整个应用已经被拆分成了独立的组件。在使用vue-router时,我们需要做的就是把路由映射到各个组件,vue-router会把各个组件渲染到正确的地方。还可以在组件中使用分页功能,大家一起来实验吧! | 免费 | true |
10 | Laravel 5.1 制作简易相册 | 本课程将从界面、数据库的整体设计开始,使用Laravel5.1一步一步的搭建一个简易的bootstarp风格瀑布流相册。适合已经学习过laravel基础知识的同学作为项目练手,巩固知识点。 | 会员 | true |
11 | Python 实现康威生命游戏 | 康威生命游戏是一个久负盛名的数学游戏,有简单的规则和无穷无尽的组合。本课程将使用pygame模块来实现这样一个游戏,让你在趣味游戏中提升对Python的理解,入门pygame。 | 免费 | false |
12 | Laravel 项目实战:仿新浪微博Web应用 | 本课程将在实验楼环境中实现完整的仿新浪微博的项目,学习使用PHP最热的Web框架Laravel构建应用。在项目实战中,入门并掌握Laravel的基本用法,学习HTML、CSS、JavaScript、PHP和Bootstrap等知识,同时实践Git工作流、Gulp前端工作流等开发方法。 | 训练营 | true |
13 | Django 入门教程 | 本课程使用的开发环境为Python3.x、Django1.8.13。课程中将对Django的环境搭建、视图、链接路由、模板、模型、数据库操作以及表单进行简单介绍,并结合简单实验示例加以练习。从中我们将学会如何使用Django快速构建和维护一个高质量的Web应用程序,并加深对于Django的MVC设计模式的认识。 | 免费 | false |
14 | Python 解决哲学家就餐问题 | 本课程意欲通过三种不同的方式解决‘’哲学家就餐‘’这个经典的问题。在了解一些基本的操作系统的知识之后,通过实验加深对线程,死锁,活锁的认识,并深入理解解决死锁的算法思想。 | 会员 | false |
15 | Laravel 5.1 基础教程 | Laravel是当下最火的PHP开发框架。它以编码风格优雅著称,每行代码都非常简洁,富有表达力,并且拥有强大的组件开发生态,可以帮助你快速搭建完美的大型网络应用。本课程将从环境配置开始,将路由,控制器等基本知识点逐个在后续的实验中进行讲解和实践,力求让学习者通过自己做实验来更快上手Laravel开发,也能在开发的过程中体会Laravel的艺术感。课程在最后一个实验还将通过30分钟搭建一个迷你博客,让大家对Laravel基础知识进行回顾通过实践加深记忆并巩固学习。 | 免费 | false |
16 | Laravel 5.1 快速搭建用户认证系统 | 本实验基于Laravel5.1的Auth系统和第三方插件快速搭建一套基本的包含:登录/注册/图片验证码验证/忘记密码等功能的用户认证系统。 | 会员 | true |