实训:Web数据抓取

简单实验 飞快学 1293浏览

Web数据抓取(Web scraping,也叫Web数据采集)指的是批量、快速从网站上提取信息的一种计算机软件技术。Web数据抓取程序模拟浏览器的行为,能将可以在浏览器上显示的任何数据提取出来,因此也称为屏幕抓取(Screen scraping)。Web数据抓取的最终目的是将非结构化的信息从大量的网页中抽取出来以结构化的方式存储(CSV、JSON、XML、ACCESS、SQLITE、MSSQL、MYSQL等等)。

页面抓取并保存

链接:

Bootstrap HTML编码规范

Bootstrap可视化布局系统

修改XAMPP默认MySQL密码

抓取工具:PHP Simple HTML DOM Parser

官方网站: http://simplehtmldom.sourceforge.net/

参考网站

鲲鹏Web数据抓取 http://www.site-digger.com/

八爪鱼 http://www.bazhuayu.com/

参考文章

网页数据抓取系统解决方案 http://www.cnblogs.com/GT_Andy/archive/2009/12/29/1921910.html

任务1

在Web目录 C:\xampp\htdocs 下,解压缩文件 simplehtmldom_1_5.zip

创建项目目录:zhuaqu,创建文件 demo.php,内容如下:

<?php
    require_once '../simplehtmldom_1_5/simple_html_dom.php';  

    header("Content-type:text/html;charset=utf-8");
    $url = "http://www.phpsoeasy.com/";
    $html = new simple_html_dom();
    $html->load(file_get_contents($url));
    $title = $html->find('.content  h2 a', 0)->plaintext;
    echo $title;
?>

将最后两行代码注释后,改为如下,就可以输出全部标题了。

    // $title = $html->find('.content  h2 a', 0)->plaintext;
    // echo $title;
    $titles = $html->find('.content  h2 a');
    foreach($titles as $title) 
    {
    	echo $title->plaintext."<br/>";
    }

函数 file_get_contents 用于从文件中获取内容,可参考菜鸟的函数说明 file_get_contents

<!DOCTYPE html>
<html>
<head>
   <title>Bootstrap 模板</title>
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <!-- 引入 Bootstrap -->
   <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
         rel="stylesheet">
   <!-- HTML5 Shim 和 Respond.js 用于让 IE8 支持 HTML5元素和媒体查询 -->
   <!-- 注意: 如果通过 file://  引入 Respond.js 文件,则该文件无法起效果 -->
   <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
    <![endif]-->
</head>  
<body>
 
 
 
 
 
<!-- jQuery (Bootstrap 的 JavaScript 插件需要引入 jQuery) -->
<script src="https://code.jquery.com/jquery.js"></script>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

数据表设计参考

CREATE TABLE `post` (
  `id` int(32) PRIMARY KEY AUTO_INCREMENT,
  `title` varchar(100) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `priority` int(32) DEFAULT NULL,
  `content` text,
  `pub_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Sakila数据库的配置文件

<?php
 
require_once '../php-activerecord/ActiveRecord.php';
 
ActiveRecord\Config::initialize(function($cfg)
{
    $dsn = "mysql://root:123456@localhost/sakila?charset=utf8";
    $cfg->set_connections(array('development' => $dsn));
});
  
class Post extends ActiveRecord\Model
{
    static $table_name = 'post';
}
?>

查找记录

<?php

require_once 'db_sakila.php';

$post = Post::find(1);   // 获取ID为1的记录
echo $post->title;
echo $post->pub_time;
?>

批量显示数据

<?php

require_once 'db_sakila.php';

$posts = Post::all();   // 获取所有记录

foreach($posts as $post) 
{
    echo $post->title."<br>";
    echo $post->pub_time."<br>";
}
?>

如果想更为准确的控制需要选择的数据,请参考:http://www.phpactiverecord.org/projects/main/wiki/Finders