php原生 网页数据提取

27 篇文章 0 订阅

需求

分析

  • 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();

效果

idcnamecdescctypenlong
1标题课程简介类型名字是否超过16个字符
2新手指南之玩转实验楼本实验主要通过介绍计算机相关技术的基础概念,实验楼的使用方法,面向完全没有编程经验的用户。从中我们将了解到实验楼的实验精神:“从实践切入,依靠交互性、操作性更强的课程,理论学习+动手实践共同激发你的创造力。” 免费false
3Linux 基础入门(新版)要在实验楼愉快地学习,先要熟练地使用Linux,本实验介绍Linux基本操作,shell环境下的常用命令。免费false
4Python网络爬虫实战--Scrapy框架学习本训练营从一个简单的Scrapy项目入手,剖析爬虫的结构和Scrapy的运行规则,最后通过两个两个实战项目——「爬取实验楼课程信息」和「爬取电影网站信息」,带领大家从零基础入门,完全掌握使用Scrapy框架编写网络爬虫的技能。 训练营true
5NBA常规赛结果预测——利用Python进行比赛数据分析本课程将利用NBA在2015~2016年的比赛统计数据进行回归模型建立,最终在今年2016~2017的常规赛中预测每场比赛的输赢情况。免费true
6Python 气象数据分析 -- 《Python 数据分析实战》本实验将对意大利北部沿海地区的气象数据进行分析与可视化。我们在实验过程中先会对数据进行清洗,然后运用Python中matplotlib模块的对数据进行可视化处理,最终从清晰的图表中得出我们的结论。本实验源自图灵教育的《Python数据分析实战》第2章,感谢图灵教育授权实验楼发布。 免费true
7k-近邻算法实现手写数字识别系统--《机器学习实战 》本课程将会从电影题材分类的例子入手,详细讲述`k-近邻`算法的原理。在这之后,我们将会使用该算法实现手写数字识别系统,书籍教程配套实验练习,帮助您更好得实战。本课程源自图灵教育的《机器学习实战》第2章,感谢图灵教育授权实验楼发布。 免费true
8Python实现遗传算法求解n-queens问题本课程将对遗传算法进行简单讲解,通过使用python实现简单的遗传算法求解函数极值以及通过实例了解Pyevolve的使用方法。非常适合熟悉Python基础,对算法较感兴趣的用户。遗传算法(Geneticalgorithm)属于演化计算(evolutionarycomputing),是随着人工智能领域发展而来的一种智能算法。正如它的名字所示,遗传算法是受达尔文进化论启发。简单来说,它是一种通过模拟自然进化过程搜索最优解的方法。 免费true
9用Vue.js 和 vue-router 创建单页导航和分页使用Vue.js和vue-router创建单页应用非常的简单,使用Vue.js开发,整个应用已经被拆分成了独立的组件。在使用vue-router时,我们需要做的就是把路由映射到各个组件,vue-router会把各个组件渲染到正确的地方。还可以在组件中使用分页功能,大家一起来实验吧! 免费true
10Laravel 5.1 制作简易相册本课程将从界面、数据库的整体设计开始,使用Laravel5.1一步一步的搭建一个简易的bootstarp风格瀑布流相册。适合已经学习过laravel基础知识的同学作为项目练手,巩固知识点。会员true
11Python 实现康威生命游戏康威生命游戏是一个久负盛名的数学游戏,有简单的规则和无穷无尽的组合。本课程将使用pygame模块来实现这样一个游戏,让你在趣味游戏中提升对Python的理解,入门pygame。免费false
12Laravel 项目实战:仿新浪微博Web应用本课程将在实验楼环境中实现完整的仿新浪微博的项目,学习使用PHP最热的Web框架Laravel构建应用。在项目实战中,入门并掌握Laravel的基本用法,学习HTML、CSS、JavaScript、PHP和Bootstrap等知识,同时实践Git工作流、Gulp前端工作流等开发方法。 训练营true
13Django 入门教程本课程使用的开发环境为Python3.x、Django1.8.13。课程中将对Django的环境搭建、视图、链接路由、模板、模型、数据库操作以及表单进行简单介绍,并结合简单实验示例加以练习。从中我们将学会如何使用Django快速构建和维护一个高质量的Web应用程序,并加深对于Django的MVC设计模式的认识。 免费false
14Python 解决哲学家就餐问题本课程意欲通过三种不同的方式解决‘’哲学家就餐‘’这个经典的问题。在了解一些基本的操作系统的知识之后,通过实验加深对线程,死锁,活锁的认识,并深入理解解决死锁的算法思想。会员false
15Laravel 5.1 基础教程Laravel是当下最火的PHP开发框架。它以编码风格优雅著称,每行代码都非常简洁,富有表达力,并且拥有强大的组件开发生态,可以帮助你快速搭建完美的大型网络应用。本课程将从环境配置开始,将路由,控制器等基本知识点逐个在后续的实验中进行讲解和实践,力求让学习者通过自己做实验来更快上手Laravel开发,也能在开发的过程中体会Laravel的艺术感。课程在最后一个实验还将通过30分钟搭建一个迷你博客,让大家对Laravel基础知识进行回顾通过实践加深记忆并巩固学习。 免费false
16Laravel 5.1 快速搭建用户认证系统本实验基于Laravel5.1的Auth系统和第三方插件快速搭建一套基本的包含:登录/注册/图片验证码验证/忘记密码等功能的用户认证系统。会员true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值