PHP爬蟲 -- 011 PHP勾搭MySQL

建庫, 建表

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/");
複製代碼

做業

  • 改寫以前書城的代碼, 把數據保存到數據庫

下一節

相關文章
相關標籤/搜索