将爬取到的淘宝商品信息存储到数据库是数据持久化的重要步骤。以下是将商品信息存储到数据库的详细步骤和代码示例,包括使用 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 环境中已经安装了 mysqli
或 PDO
扩展,用于与 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);
}
?>
四、注意事项
-
数据清洗:
-
在存储到数据库之前,建议对数据进行清洗,例如去除多余的空格、HTML 标签等。
-
可以使用 PHP 的
trim()
和htmlspecialchars()
函数来处理数据。
-
-
数据库安全性:
-
使用参数化查询(如
prepare()
和bind_param()
)可以有效防止 SQL 注入攻击。 -
确保数据库密码等敏感信息不要直接写在代码中,可以使用环境变量或配置文件来管理。
-
-
性能优化:
-
如果需要处理大量数据,可以考虑分批插入数据,避免一次性插入过多数据导致性能问题。
-
使用事务可以提高数据插入的效率和可靠性。
-
五、示例输出
假设搜索关键字为 "iPhone 13"
,运行程序后可能输出如下:
php
请输入搜索关键字:iPhone 13
数据已成功存储到数据库!
通过上述步骤和代码,你可以将爬取到的淘宝商品信息存储到 MySQL 数据库中。希望这个示例对你有所帮助!