PHP爬虫 -- 011 PHP勾搭MySQL

674 阅读3分钟

建库, 建表

create database demo_db character set utf8;

use demo_db;

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  `age` tinyint(1) NOT NULL,
  `address` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

插入测试数据

INSERT INTO `demo_db`.`users`(`id`, `name`, `age`, `address`) VALUES (1, '张三', 18, '北京东城区');
INSERT INTO `demo_db`.`users`(`id`, `name`, `age`, `address`) VALUES (2, '李四', 22, '上海徐汇区');
INSERT INTO `demo_db`.`users`(`id`, `name`, `age`, `address`) VALUES (3, '王五', 23, '郑州金水区');
INSERT INTO `demo_db`.`users`(`id`, `name`, `age`, `address`) VALUES (4, '赵六', 24, '北京西城区');

mysqli教程

小彩蛋(已经连接数据库, 但是忘记了密码)

  • 找到mysql下的user表
  • 算出来新密码对应的加密值

  • 修改对应的用户信息(mysql下的user表)

  • 刷新权限flush PRIVILEGES;
  • 测试连接

使用mysqli操作数据库

  • 连接数据库
<?php
$servername = "localhost";
$username = "root";
$password = "root";

// 创建连接
$conn = mysqli_connect($servername, $username, $password);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";

  • 查询数据
<?php
$servername = "localhost"; // 本地主机
$username = "root"; // 用户名
$password = "root"; // 用户密码
$dbname = "demo_db"; // 数据库名字
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
// 设置utf8解码
mysqli_query($conn,"SET NAMES utf8");
// 创建要执行的sql语句
$sql = "select * from users";
// 执行sql语句
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    // 输出数据
    while ($row = mysqli_fetch_assoc($result)) {
        print_r($row);
    }
} else {
    echo "0 结果";
}
  • 增加数据(单条)
<?php
$servername = "localhost"; // 本地主机
$username = "root"; // 用户名
$password = "root"; // 用户密码
$dbname = "demo_db"; // 数据库名字
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
// 设置utf8解码
mysqli_query($conn,"SET NAMES utf8");
// 创建要执行的sql语句
$sql = "insert into users(name,age,address) values('孙七',21,'北京朝阳区')";
// 执行sql语句
$result = mysqli_query($conn, $sql);
// 判断插入结果
if ($result) {
    echo "新记录插入成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
  • 批量插入数据
    • 使用.=把多条sql语句连接起来, 注意每条语句, 分号结束
    • 使用mysqli_multi_query()函数
<?php
$servername = "localhost"; // 本地主机
$username = "root"; // 用户名
$password = "root"; // 用户密码
$dbname = "demo_db"; // 数据库名字
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
// 设置utf8解码
mysqli_query($conn,"SET NAMES utf8");
// 创建要执行的sql语句
$sql = "insert into users(name,age,address) values('周八',22,'北京海淀区');";
$sql .= "insert into users(name,age,address) values('吴九',23,'北京石景山区');";
$sql .= "insert into users(name,age,address) values('郑十',24,'北京雄安新区');";
// 执行sql语句
$result = mysqli_multi_query($conn, $sql);
// 判断插入结果
if ($result) {
    echo "新记录插入成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
  • 更新数据
<?php
$servername = "localhost"; // 本地主机
$username = "root"; // 用户名
$password = "root"; // 用户密码
$dbname = "demo_db"; // 数据库名字
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
// 设置utf8解码
mysqli_query($conn,"SET NAMES utf8");
// 创建要执行的sql语句
$sql = "update users set age = 28 where name = '张三'";
// 执行sql语句
$result = mysqli_query($conn, $sql);

// 判断修改结果
if ($result) {
    echo "修改成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
  • 删除数据
<?php
$servername = "localhost"; // 本地主机
$username = "root"; // 用户名
$password = "root"; // 用户密码
$dbname = "demo_db"; // 数据库名字
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "连接成功";
// 设置utf8解码
mysqli_query($conn,"SET NAMES utf8");
// 创建要执行的sql语句
$sql = "delete from users where name = '张三'";
// 执行sql语句
$result = mysqli_query($conn, $sql);

// 判断删除结果
if ($result) {
    echo "删除成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

把原来的博客内容保存数据库

  • 建表
CREATE TABLE `blogs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

修改原来的代码

<?php
require 'vendor/autoload.php';
use QL\QueryList;
// 生成一个querylist对象
$ql = new QueryList();
/*
 * @Description: 获取四篇博客的标题, 发布日期, 文章链接
 * @param: 主页的url
 * @return: 二维数组, 包括 title, date, url
 */
function get_tilte_date($url)
{
    // 全局的querylist对象, 防止内存溢出报错
    global $ql;
    return $ql->get($url)->rules([ //设置采集规则
        'date' => ['header > div > a > time.entry-date.published', 'text'], // 数组第一个元素是css选择器, 第二个是属性名
        'title' => ['header > h2 > a', 'text'],
        'url' => ['header > h2 > a', 'href'],
    ])->queryData(); // queryData() 返回数组
}
/*
 * @Description: 获取文章全部内容
 * @param: 文章的url
 * @return: 文章的内容, 字符串类型
 */
function get_content($url)
{
    global $ql;
    // 使用find()获取单元素, find()里面, 传的是css选择器, text()获取文本
    return $ql->get($url)->find('article.post.type-post.status-publish.format-standard.hentry.category-uncategorized')->text();
}

/*
 * @Description: 把数据存入数据库
 * @param: 包含数据的一个数组
 * @return: 没有返回值, 只是输出最终结果
 */
function save_data($content_array)
{

    // 创建mysql连接
    $servername = "localhost"; // 本地主机
    $username = "root"; // 用户名
    $password = "root"; // 用户密码
    $dbname = "demo_db"; // 数据库名字
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    mysqli_query($conn,"SET NAMES utf8");

    // 新建一个sql变量, 用来拼接sql语句
    $sql = '';
    foreach ($content_array as $key => $value) {
        $title = $value['title'];
        $date = $value['date'];
        $content = $value['content'];
        $sql .= "insert into blogs(title,date,content) values(\"{$title}\",\"{$date}\",'{$content}');";
    }
   
    $result = mysqli_multi_query($conn,$sql);
    var_dump($result);
    if ($result) {
        echo "写入成功";
    }else{
        echo "写入失败!!!";
    }

}

/*
 * @Description: 开始函数, 调用该函数, 即可开始爬虫
 * @param: 起始url, 主页url
 * @return: 没有返回值, 会把内容写入到markdown文件里
 */
function start($url)
{
    $data = get_tilte_date($url);
    // 遍历数组, 给数组新增content元素
    foreach ($data as $key => $value) {
        $data[$key]['content'] = get_content($value['url']);
    }
    save_data($data);
}
// 调用start()函数, 传入起始url/主页url, 开始爬取
start("https://wordpress-edu-3autumn.localprod.forc.work/");

作业

  • 改写之前书城的代码, 把数据保存到数据库

下一节