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

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

以下代码是题目的答案

  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. class Crawler{
  4. private $content;
  5. private $data;
  6. static private $mysql;
  7.  
  8. public function __construct(){
  9. echo "开始爬取内容....";
  10. }
  11.  
  12. public function loadFile($file_path){
  13. echo "正在加载文件";
  14. $this->content = file_get_contents($file_path);
  15. }
  16.  
  17. public function parseCourseBody(){
  18. $regex = "/<body[^>]*?>(.*\s*?)<\/body>/is";
  19. if(preg_match_all($regex, $this->content, $matches)){
  20. $this->content = $matches[0];
  21. }
  22. }
  23.  
  24. public function parseContent(){
  25. echo "开始解析内容...<br/>";
  26. $this->parseCourseBody();
  27. $this->parseTitle();
  28. $this->parseDesc();
  29. $this->parseType();
  30. $this->titleIsLong();
  31. $this->saveData();
  32. echo "解析内容结束!<br/>";
  33. }
  34.  
  35. public function saveData(){
  36. echo "存入数据库...<br/>";
  37. self::$mysql = mysql_connect("localhost","root","root");
  38. mysql_query("set names utf8");
  39. mysql_select_db("databases",self::$mysql);
  40. $cnames = $this->data['cnames'];
  41. $cdescs = $this->data['cdescs'];
  42. $ctypes = $this->data['ctypes'];
  43. $nlongs = $this->data['nlongs'];
  44. foreach ($cnames as $key => $value) {
  45. $sql = "insert into `course_data`(`cname`,`cdesc`,`ctype`,`nlong`) values('".$cnames[$key]."','".$cdescs[$key]."','".$ctypes[$key]."','".$nlongs[$key]."')";
  46. mysql_query($sql);
  47. }
  48. mysql_close();
  49. }
  50.  
  51. public function parseTitle(){
  52. echo "解析课程标题...<br/>";
  53. $regex= "/<div class=\"course-name\".*?>.*?<\/div>/ism";
  54. if(preg_match_all($regex, $this->content, $matches)){
  55. $cnames = $matches[0];
  56. }
  57. foreach ($cnames as &$value) {
  58. $value = str_replace("</div>","",str_replace("<div class=\"course-name\">", "", $value));
  59. }
  60. $this->data['cnames'] = $cnames;
  61. }
  62.  
  63. public function parseDesc(){
  64. echo "解析课程简介...<br/>";
  65. $regex4= "/<div class=\"course-desc\".*?>.*?<\/div>/ism";
  66. if(preg_match_all($regex, $this->content, $matches)){
  67. $cdescs = $matches[0];
  68. }
  69. foreach ($cdescs as &$value) {
  70. $value = str_replace("</div>","",str_replace("<div class=\"course-desc\">", "", $value));
  71. }
  72. $this->data['cdescs'] = $cdescs;
  73. }
  74.  
  75. public function parseType(){
  76. echo "解析课程类型...<br/>";
  77. $regex= "/<div class=\"course-footer\".*?>.*?<\/div>/ism";
  78. if(preg_match_all($regex, $this->content, $matches)){
  79. $ctypes = $matches[0];
  80. }
  81. foreach ($ctypes as &$value) {
  82. $str = str_replace("</div>","",str_replace("<div class=\"course-footer\">", "", $value));
  83. if(preg_match_all("/([\x{4e00}-\x{9fa5}])/u", $str, $match)){
  84. $value = join("",$match[0]);
  85. }else{
  86. $value = "免费";
  87. }
  88. $this->data['ctypes'] = $ctypes;
  89. }
  90.  
  91. public function titleIsLong(){
  92. echo "判断课程名是否超长...<br/>";
  93. $cnames = $this->data['cnames'];
  94. foreach ($cnames as $value) {
  95. $nlongs[] = mb_strlen($value) > 16 : "true" : "false";
  96. }
  97. $this->data['nlongs'] = $nlongs;
  98. }
  99. }
  100. $Crawler = new Crawler();
  101. $Crawler->loadFile("test.html");
  102. $Crawler->parseContent();
  103.  
  104. /**
  105. 表结构
  106. cname(varchar):完整的课程名
  107. cdesc(varchar):课程描述
  108. ctype(varchar):课程类型,值为 免费,会员,训练营。
  109. nlong(enum('true','false')):课程名是否过长,课程名称超过16字符的时候为 true,否则为 false
  110.  
  111. create table `course_data`(
  112. `id` int(11) not null auto_increment,
  113. `cname` varchar(255) default null,
  114. `cdesc` varchar(255) default null,
  115. `ctype` varchar(255) default null,
  116. `nlong` enum('true','false') default null,
  117. primary key (`id`)
  118. )engine=InnoDB default charset=utf8;
  119. */

  

实验楼的php比赛题,网页数据提取。的更多相关文章

  1. 使用 CSS 选择器从网页中提取数据

    在 R 中,关于网络爬虫最简单易用的扩展包是 rvest.运行以下代码从 CRAN 上安装:install.packages("rvest")首先,加载包并用 read_html( ...

  2. Python【BeautifulSoup解析和提取网页数据】

    [解析数据] 使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子 在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据 [提取数据]是指把我们需要的数据从众多数据中挑 ...

  3. python爬虫-提取网页数据的三种武器

    常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...

  4. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  5. 分享: 利用Readability解决网页正文提取问题

    原文:http://www.cnblogs.com/iamzyf/p/3529740.html 做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以 ...

  6. API例子:用Python驱动Firefox采集网页数据

    1,引言 本文讲解怎样用Python驱动Firefox浏览器写一个简易的网页数据采集器.开源Python即时网络爬虫项目将与Scrapy(基于twisted的异步网络框架)集成,所以本例将使用Scra ...

  7. 使用HtmlAgilityPack批量抓取网页数据

    原文:使用HtmlAgilityPack批量抓取网页数据 相关软件点击下载登录的处理.因为有些网页数据需要登陆后才能提取.这里要使用ieHTTPHeaders来提取登录时的提交信息.抓取网页  Htm ...

  8. 利用Readability解决网页正文提取问题

    分享: 利用Readability解决网页正文提取问题   做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...

  9. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

随机推荐

  1. 基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案

    在之前的博客中<基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控>,我们已经比较多的描述EasyNVR所实现的功能,这些也在方案地址:http://www.eas ...

  2. Centos7升级python版本

    升级Python 我的安装目录是/home/python 下载 ` cd /home/python wget https://www.python.org/ftp/python/3.5.0/Pytho ...

  3. c++标准库比较

    1 GNU standard c++ library debian发行版中使用的c++标准库是GNU standard c++标准库. 2 Boost debian发行版中也是用了boost库,但是不 ...

  4. c#中多线程写DataGridView出现滚动栏导致程序卡死(无响应)的解决的方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013529927/article/details/24225567 由于写的程序涉及到多线程维护一 ...

  5. 搭建vps***

    快速搭建ShadowSocks wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/tedd ...

  6. 6410开发板sd卡启动时烧写u-boot.bin以及u-boot-spl-16k.bin步骤

    参考文档:<SMDK6410_IROM_APPLICATION NOTE_REV 1.00>(可以从这里下载到> 参考博客:Tekkaman的博文<u-boot-2010.09 ...

  7. Android WiFi系统架构【转】

    本文转载自:http://blog.csdn.net/liuhaomatou/article/details/40398753 在了解WIFI模块的系统架构之前.我心中就有一个疑问,那么Android ...

  8. Django 之 Paginator 分页功能

    Django Paginator Django 分页官方文档  https://docs.djangoproject.com/en/1.10/topics/pagination/ 此分页方法没有限制显 ...

  9. hadoop —— eclipse插件安装配置

    安装: 1. 将hadoop-core-0.20.2-cdh3u6/contrib/eclipse-plugin/hadoop-eclipse-plugin-0.20.2-cdh3u6.jar拷贝到e ...

  10. netstat参数记录

    可以使用man netstat查看TCP的各种状态信息描述  ESTABLISHED       socket已经建立连接  CLOSED            socket没有被使用,无连接  CL ...