淘宝商品信息如何存储到数据库?

将爬取到的淘宝商品信息存储到数据库是数据持久化的重要步骤。以下是将商品信息存储到数据库的详细步骤和代码示例,包括使用 MySQL 数据库的完整流程。

一、准备工作

1. 安装 MySQL

确保你的开发环境中已经安装了 MySQL 数据库,并且可以正常运行。

2. 创建数据库和表

在 MySQL 中创建一个数据库,并在其中创建一个表来存储商品信息。以下是一个示例 SQL 脚本:

sql

sql 复制代码
CREATE DATABASE taobao_products;

USE taobao_products;

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    shop VARCHAR(255) NOT NULL,
    link VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. 安装 PHP MySQL 扩展

确保你的 PHP 环境中已经安装了 mysqliPDO 扩展,用于与 MySQL 数据库进行交互。

二、PHP 代码实现

以下是完整的 PHP 代码示例,展示如何将爬取到的淘宝商品信息存储到 MySQL 数据库中。

1. 发起请求并解析 HTML

这部分代码与前面的示例相同,用于获取和解析淘宝商品信息。

php

php 复制代码
<?php
function get_page($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3');
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

function parse_product_details($html) {
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $xpath = new DOMXPath($doc);

    $products = $xpath->query("//div[@class='m-itemlist']//div[@class='items']//div[@class='item']");
    $product_list = [];

    foreach ($products as $product) {
        $title = $xpath->query(".//div[@class='row row-2 g-clearfix']/div[@class='title']/a", $product)->item(0)->nodeValue;
        $price = $xpath->query(".//div[@class='row row-1 g-clearfix']/div[@class='price g_price g_price-highlight']/strong", $product)->item(0)->nodeValue;
        $shop = $xpath->query(".//div[@class='row row-3 g-clearfix']/div[@class='shop']/a", $product)->item(0)->nodeValue;
        $link = $xpath->query(".//div[@class='row row-2 g-clearfix']/div[@class='title']/a", $product)->item(0)->getAttribute('href');

        $product_list[] = [
            'title' => $title,
            'price' => $price,
            'shop' => $shop,
            'link' => $link
        ];
    }

    return $product_list;
}
?>
2. 将商品信息存储到数据库

使用 mysqli 扩展将商品信息插入到数据库中。

php

php 复制代码
<?php
function save_products_to_db($products) {
    $servername = "localhost";
    $username = "root";
    $password = "your_password"; // 替换为你的数据库密码
    $dbname = "taobao_products";

    $conn = new mysqli($servername, $username, $password, $dbname);

    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }

    $sql = "INSERT INTO products (title, price, shop, link) VALUES (?, ?, ?, ?)";
    $stmt = $conn->prepare($sql);

    foreach ($products as $product) {
        $stmt->bind_param("sds", $product['title'], $product['price'], $product['shop'], $product['link']);
        $stmt->execute();
    }

    echo "数据已成功存储到数据库!\n";
    $stmt->close();
    $conn->close();
}
?>
3. 搜索商品并存储到数据库

将上述函数组合起来,实现搜索商品并将结果存储到数据库的功能。

php

php 复制代码
<?php
function search_products($keyword) {
    $url = "https://s.taobao.com/search?q=" . urlencode($keyword);
    $html = get_page($url);
    if ($html) {
        $products = parse_product_details($html);
        save_products_to_db($products);
    } else {
        echo "请求失败,请检查网络或关键字。\n";
    }
}

if (__FILE__ == __FILE__) {
    $keyword = readline("请输入搜索关键字:");
    search_products($keyword);
}
?>

三、完整代码示例

将上述代码片段组合起来,形成一个完整的 PHP 脚本:

php

php 复制代码
<?php
function get_page($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3');
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

function parse_product_details($html) {
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $xpath = new DOMXPath($doc);

    $products = $xpath->query("//div[@class='m-itemlist']//div[@class='items']//div[@class='item']");
    $product_list = [];

    foreach ($products as $product) {
        $title = $xpath->query(".//div[@class='row row-2 g-clearfix']/div[@class='title']/a", $product)->item(0)->nodeValue;
        $price = $xpath->query(".//div[@class='row row-1 g-clearfix']/div[@class='price g_price g_price-highlight']/strong", $product)->item(0)->nodeValue;
        $shop = $xpath->query(".//div[@class='row row-3 g-clearfix']/div[@class='shop']/a", $product)->item(0)->nodeValue;
        $link = $xpath->query(".//div[@class='row row-2 g-clearfix']/div[@class='title']/a", $product)->item(0)->getAttribute('href');

        $product_list[] = [
            'title' => $title,
            'price' => $price,
            'shop' => $shop,
            'link' => $link
        ];
    }

    return $product_list;
}

function save_products_to_db($products) {
    $servername = "localhost";
    $username = "root";
    $password = "your_password"; // 替换为你的数据库密码
    $dbname = "taobao_products";

    $conn = new mysqli($servername, $username, $password, $dbname);

    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }

    $sql = "INSERT INTO products (title, price, shop, link) VALUES (?, ?, ?, ?)";
    $stmt = $conn->prepare($sql);

    foreach ($products as $product) {
        $stmt->bind_param("sds", $product['title'], $product['price'], $product['shop'], $product['link']);
        $stmt->execute();
    }

    echo "数据已成功存储到数据库!\n";
    $stmt->close();
    $conn->close();
}

function search_products($keyword) {
    $url = "https://s.taobao.com/search?q=" . urlencode($keyword);
    $html = get_page($url);
    if ($html) {
        $products = parse_product_details($html);
        save_products_to_db($products);
    } else {
        echo "请求失败,请检查网络或关键字。\n";
    }
}

if (__FILE__ == __FILE__) {
    $keyword = readline("请输入搜索关键字:");
    search_products($keyword);
}
?>

四、注意事项

  1. 数据清洗

    • 在存储到数据库之前,建议对数据进行清洗,例如去除多余的空格、HTML 标签等。

    • 可以使用 PHP 的 trim()htmlspecialchars() 函数来处理数据。

  2. 数据库安全性

    • 使用参数化查询(如 prepare()bind_param())可以有效防止 SQL 注入攻击。

    • 确保数据库密码等敏感信息不要直接写在代码中,可以使用环境变量或配置文件来管理。

  3. 性能优化

    • 如果需要处理大量数据,可以考虑分批插入数据,避免一次性插入过多数据导致性能问题。

    • 使用事务可以提高数据插入的效率和可靠性。

五、示例输出

假设搜索关键字为 "iPhone 13",运行程序后可能输出如下:

php 复制代码
请输入搜索关键字:iPhone 13
数据已成功存储到数据库!

通过上述步骤和代码,你可以将爬取到的淘宝商品信息存储到 MySQL 数据库中。希望这个示例对你有所帮助!

相关推荐
数据智能老司机1 分钟前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机33 分钟前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿1 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
ONE_Gua1 小时前
chromium魔改——navigator.webdriver 检测
前端·后端·爬虫
无名之逆1 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601011 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机1 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy2 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖2 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis
Three~stone3 小时前
MySQL学习集--DDL
数据库·sql·学习