需求

  • 商品ID item_id
  • 商品链接 item_link
  • 标题 item_title
  • 门店名称 store
  • 封面 cover_link
  • 原价 original_cost
  • 折扣价 discount_cost
  • 品牌 brand
  • 型号 type
  • 评论数 comments

建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE IF NOT EXISTS `jd_items` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`item_id` varchar(255) NOT NULL COMMENT '商品ID',
`item_link` varchar(255) NOT NULL COMMENT '地址 http开头',
`store` varchar(64) NOT NULL COMMENT '门店名称',
`title` varchar(255) NOT NULL COMMENT '商品标题',
`cover_url` varchar(255) COMMENT '图片URL地址,http开头',
`ori_price` decimal(10, 2) NOT NULL COMMENT '原价',
`price` decimal(10, 2) NOT NULL COMMENT '折扣价',
`brand` varchar(64) COMMENT '品牌',
`brand_type` varchar(255) COMMENT '品牌型号',
`comment` varchar(32) COMMENT '评论数',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '写入时间(自动填充)',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间(自动更新)',
`student` varchar(32) NOT NULL COMMENT '姓名 写中文',
PRIMARY KEY (`id`) -- 自增字段作为单一主键
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

流程

主流程
For次数循环点击下一页5次(实现翻页)

ForEach列表循环每个商品,获取详情页链接传入子流程
测试环境需要只跑一遍时可启用退出循环

调用子流程爬取各项信息
可设置item_link默认值,可单独运行子流程对该网页进行爬取测试

获取型号处理

设置一个变量(列表)保存爬取的数据,输出到主流程,插入到relist(列表)作为二维列表用于批量插入数据库

id、写入时间、更新时间为自动填充,不需要插入,因此插入语句要写列名(若完全插入则只需写表名不用写列名,但要保证插入列数与表列数一致)

odbc程序添加数据库连接

影刀连接数据库配置

本地插入测试完成

插入服务数据库完成

Xpath

XPath(XML Path Language)是一种用于在 XML 或 HTML 文档中定位和选取节点(元素、属性、文本等) 的语言。它最初为 XML 设计,由于 HTML 可以被视为 “不严格的 XML”,因此 XPath 也广泛用于 HTML 文档的解析(比如网页爬虫、数据提取等场景)。

核心用途

  • 在 XML/HTML 文档中精准定位节点(如某个标签、属性或文本)。
  • 从文档中提取特定数据(如网页中的标题、链接、表格内容等)。
  • 作为其他技术的基础(如 XSLT 转换、XQuery 查询等)。

XPath 常与以下工具配合使用:

  • PythonlxmlScrapy(内置 XPath 解析)、BeautifulSoup(需配合 lxml 解析器)。
  • 浏览器:F12 开发者工具的 “Elements” 面板中,右键节点可直接复制 XPath。
  • 其他:Java 的 Jsoup、C# 的 HtmlAgilityPack 等。

基本语法:节点选取规则

XPath 的语法类似文件系统的路径表示,通过 “路径表达式” 定位节点。以下是最常用的规则:

表达式 含义 示例
/ 从根节点开始选取(绝对路径)。 /html/body:选取根节点html下的直接子节点body
// 从任意位置选取节点(相对路径,忽略层级)。 //a:选取文档中所有<a>标签(无论在哪个层级)。
. 选取当前节点。 ./p:选取当前节点下的直接子节点<p>
.. 选取当前节点的父节点。 //div/..:选取所有<div>的父节点。
@ 选取属性。 //a/@href:选取所有<a>标签的href属性值(即链接地址)。
text() 选取文本内容。 //h1/text():选取所有<h1>标签内的文本。
[n] 选取第 n 个节点(索引从 1 开始)。 //li[1]:选取所有<li>中的第一个。
[@属性] 按属性筛选节点。 //a[@class]:选取所有带有class属性的<a>标签。
[@属性=值] 按属性值筛选节点(值需用单 / 双引号包裹)。 //a[@class='active']:选取classactive<a>标签。
[条件] 按条件筛选(支持逻辑运算、比较运算)。 //book[price>30]:选取子节点price大于 30 的<book>标签。

示例:HTML 中提取数据

假设有一段 HTML 代码如下:

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<div class="container">
<h1 title="主标题">Python 教程</h1>
<ul>
<li><a href="/basic">基础语法</a></li>
<li><a href="/advance">高级特性</a></li>
</ul>
</div>
</body>
</html>

用 XPath 提取数据的示例:

  1. 提取<h1>的文本://h1/text() → 结果:Python 教程
  2. 提取<h1>title属性://h1/@title → 结果:主标题
  3. 提取所有<a>的链接://a/@href → 结果:/basic/advance
  4. 提取第二个<li>中的文本://ul/li[2]/a/text() → 结果:高级特性