Python爬虫XPath实战:电商商品ID的精准抓取策略

1. 引言

在电商数据爬取过程中,商品ID(Product ID)是最关键的字段之一,它通常用于唯一标识商品,并可用于构建商品详情页URL、价格监控、库存查询等场景。然而,不同电商网站的HTML结构差异较大,如何高效、精准地定位商品ID成为爬虫开发的重要挑战。

本文将介绍如何使用Python结合XPath技术,精准抓取电商网站的商品ID,涵盖以下内容:

  • XPath基础语法:快速掌握XPath的核心用法
  • 商品ID的常见位置分析:不同电商网站的ID存储方式
  • 实战案例:以京东、淘宝为例,演示XPath定位商品ID
  • 优化策略:提高XPath匹配的稳定性和效率
  • 完整代码实现:提供可运行的Python爬虫示例

2. XPath基础与商品ID定位思路

2.1 XPath简介

XPath(XML Path Language)是一种用于在XML和HTML文档中定位节点的查询语言。在爬虫开发中,XPath常用于从网页中提取特定数据。

常用XPath语法
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">//</font>**:从任意层级查找
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">/</font>**:从根节点查找
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">[@属性="值"]</font>**:按属性筛选
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">text()</font>**:获取节点文本
  • **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">contains()</font>**:模糊匹配

例如:

//div[@class="product"]/@id  # 获取class="product"的div的id属性
//a[contains(@href, "product_id")]/@href  # 获取包含"product_id"的链接

2.2 商品ID的常见存储方式

电商网站的商品ID通常出现在以下位置:

  1. HTML标签属性:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">data-productid</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">data-id</font>**
  2. URL参数:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://item.jd.com/100123456.html</font>**(ID为**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">100123456</font>**
  3. JavaScript变量:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">var productId = "123456"</font>**
  4. Meta标签:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);"><meta name="product-id" content="123"></font>**

本文将重点讨论HTML属性URL参数两种方式的XPath定位方法。

3. 实战案例:京东商品ID抓取

3.1 目标分析

京东的商品ID通常出现在:

  • 商品详情页URL:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://item.jd.com/100012043978.html</font>**(ID=**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">100012043978</font>**
  • HTML标签属性:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">data-sku</font>**

3.2 实现代码

使用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">lxml</font>**库进行爬取:

import requests
from lxml import htmldef fetch_jd_product_id(url):# 代理服务器配置proxyHost = "www.16yun.cn"proxyPort = "5445"proxyUser = "16QMSOML"proxyPass = "280651"# 构造代理认证信息proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"proxies = {"http": proxyMeta,"https": proxyMeta,}headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Proxy-Authorization": f"Basic {proxyUser}:{proxyPass}"  # 部分代理可能需要此头部}try:# 发送带代理的HTTP请求response = requests.get(url, headers=headers, proxies=proxies, timeout=10)if response.status_code != 200:print(f"请求失败,状态码: {response.status_code}")return None# 解析HTMLtree = html.fromstring(response.text)# 方式1:从URL提取商品ID(适用于京东)product_id = url.split("/")[-1].split(".")[0]print(f"从URL提取的商品ID: {product_id}")# 方式2:从HTML属性提取(如data-sku)product_id_attr = tree.xpath('//*[@data-sku]/@data-sku')if product_id_attr:print(f"从HTML属性提取的商品ID: {product_id_attr[0]}")return product_idexcept requests.exceptions.RequestException as e:print(f"请求发生异常: {str(e)}")return None# 示例:京东商品页
jd_url = "https://item.jd.com/100012043978.html"
fetch_jd_product_id(jd_url)
输出示例
从URL提取的商品ID: 100012043978  
从HTML属性提取的商品ID: 100012043978

4. 实战案例:淘宝商品ID抓取

4.1 目标分析

淘宝的商品ID存储方式较为复杂,常见位置:

  • URL参数:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">https://item.taobao.com/item.htm?id=123456789</font>**(ID=**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">123456789</font>**
  • JavaScript变量:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">itemId: "123456789"</font>**

4.2 实现代码

淘宝有反爬机制,需模拟浏览器访问(使用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">selenium</font>**):

from selenium import webdriver
from lxml import html
import timedef fetch_taobao_product_id(url):options = webdriver.ChromeOptions()options.add_argument("--headless")  # 无头模式driver = webdriver.Chrome(options=options)driver.get(url)time.sleep(3)  # 等待页面加载# 方式1:从URL提取IDproduct_id = url.split("id=")[-1].split("&")[0]print(f"从URL提取的商品ID: {product_id}")# 方式2:从HTML解析(淘宝可能动态渲染,需检查JS)page_source = driver.page_sourcetree = html.fromstring(page_source)# 尝试匹配JS变量(淘宝可能存储为window.g_config.itemId)js_id = tree.xpath('//script[contains(text(), "itemId")]/text()')if js_id:print("从JS变量提取的商品ID:", js_id[0].split("itemId:")[1].split(",")[0].strip(' "'))driver.quit()return product_id# 示例:淘宝商品页
taobao_url = "https://item.taobao.com/item.htm?id=123456789"
fetch_taobao_product_id(taobao_url)
输出示例
从URL提取的商品ID: 123456789  
从JS变量提取的商品ID: 123456789

5. XPath优化策略

5.1 提高XPath的稳定性

  • 避免绝对路径:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">/html/body/div[1]/div[2]/...</font>**容易因页面变动失效
  • 使用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">contains()</font>**模糊匹配:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">//div[contains(@class, "product")]</font>**
  • 结合**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">@class</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">@id</font>**:如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">//div[@class="product-info" and @data-id]</font>**

5.2 动态页面的处理

  • Selenium/Auto.js:适用于JS渲染的页面(如淘宝)
  • Pyppeteer/Playwright:更高效的Headless浏览器方案

5.3 异常处理

try:product_id = tree.xpath('//div[@data-productid]/@data-productid')[0]
except IndexError:print("未找到商品ID,尝试备用方案...")product_id = url.split("id=")[1]

6. 结论

本文介绍了如何利用XPath精准抓取电商商品ID,并提供了京东、淘宝的实战代码。关键点总结:

  1. 优先从URL提取(如京东、淘宝的URL包含ID)
  2. 结合HTML属性(如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">data-sku</font>****<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">data-productid</font>**
  3. 动态页面需用Selenium(如淘宝的JS渲染)
  4. 优化XPath表达式(避免绝对路径,使用模糊匹配)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96368.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web3:重构互联网秩序的下一代范式革命

Web3&#xff08;即 Web 3.0&#xff09;作为互联网发展的第三代形态&#xff0c;并非简单的技术迭代&#xff0c;而是一场围绕 “数据主权” 与 “价值分配” 的底层逻辑重构。它以区块链为核心骨架&#xff0c;融合分布式存储、密码学、人工智能等技术&#xff0c;旨在打破 W…

DeepSeek R2难产:近期 DeepSeek-V3.1 发布,迈向 Agent 时代的第一步

DeepSeek R2难产&#xff1a;近期 DeepSeek-V3.1 发布&#xff0c;迈向 Agent 时代的第一步 要说 AI 模型的江湖&#xff0c;这一年简直就是 「大模型修罗场」。 前脚 R2 传出难产的风声&#xff0c;后脚 DeepSeek 就甩出了一张大招牌&#xff1a;DeepSeek-V3.1。 这波操作不…

element-plus:el-tree ref初始化异常记录

文章目录描述问题解决记录一个tsx 下el-tree的小问题描述 <Dialog v-model"showEdit" :title"t(button.edit)" width"900" :maxHeight"650"><el-form :model"nowdata" class"dialog"><el-form-ite…

Linux软件安装(JDK,Mysql,Nginx)

安装方式介绍一、安装JDKtar -zxvf jdk-17.0.10_linux-x64_bin.tar.gz -C /usr/localexport JAVA_HOME/usr/local/jdk-17.0.10export PATH$JAVA_HOME/bin:$PATHsource /etc/profile1、操作步骤二、mysql黑马视频已经安装好了我们只需开放指定端口就可以在navicat中连接了&#…

公有地址和私有地址

在计算机网络中&#xff0c;私有地址和公有地址是IP地址的两大重要分类&#xff0c;二者在网络通信中承担着不同角色。下面从定义、联系、区别和应用四个维度进行详细说明&#xff1a; 一、定义 1. 公有地址&#xff08;Public IP Address&#xff09; 公有地址是全球唯一且可在…

分治思想在系统分流削峰中的实践与Golang前沿实现

分治思想在系统分流削峰中的实践与Golang前沿实现 1. 分治思想概述 分治(Divide and Conquer)是计算机科学中一种重要的算法设计思想&#xff0c;其核心在于"分而治之"——将复杂问题分解为若干个规模较小的相同或相似子问题&#xff0c;递归地解决这些子问题&#x…

移动端视口终极解决方案:使用 Visual Viewport封装一个优雅的 React Hook

前言 在移动端开发中&#xff0c;视口高度一直是一个令人头疼的问题。尤其是在 iOS Safari 浏览器中&#xff0c;还有三星手机的导航遮挡&#xff0c;当虚拟键盘弹出时&#xff0c;视口高度的变化会导致固定定位元素错位、全屏布局异常等问题。本文将深入分析这个问题的本质&a…

react中key的作用

在 React 中&#xff0c;key 是一个特殊的属性&#xff08;prop&#xff09;&#xff0c;它的主要作用是帮助 React 识别哪些元素发生了变化、被添加或被移除&#xff0c;从而高效地更新和重新渲染列表中的元素。以下是 key 的具体作用和注意事项&#xff1a;1. 高效更新虚拟 D…

Lua学习记录 - 自定义模块管理器

为人所知的是lua自带的require函数加载脚本只会加载一次(就像unity里面的资源管理和AB包管理)&#xff0c;而主播调试习惯是用Odin插件的Button在unity编辑器模式里调试而非进入播放模式后调试&#xff0c;今天主播在做热更新相关的时候企图多次调用脚本打印以调试功能&#xf…

MongoDB 分片集群复制数据库副本

文章目录一、登录MongoDB查询数据库及集合分片情况二、登录MongoDB先创建副本数据库并设置数据库及集合分片功能三、登录MongoDB查询emop_slinkmain数据库main_repetition集合和四、使用mongodump压缩备份emop_slinkmain数据库中的main_repetition集合和shard_repetition 集合五…

SQLite 加密与不加密性能对比与优化实践

在项目中&#xff0c;为了保证数据安全&#xff0c;我们可能会对 SQLite 数据库进行加密&#xff08;例如使用 SQLiteMC/SQLCipher&#xff09;。然而&#xff0c;加密数据库在带来安全性的同时&#xff0c;也会带来显著的性能损耗。本文结合实测与源码分析&#xff0c;介绍 SQ…

Azure官网为何没直接体现专业服务

微软Azure官网没有直接、醒目地展示其专业服务&#xff08;如迁移、定制化解决方案咨询等&#xff09;&#xff0c;确实容易让人疑惑。这背后其实是微软Azure特定的市场策略和商业模式。下面我为你解释原因&#xff0c;并告诉你怎么找到这些服务。&#x1f9e9; 核心原因&#…

人体生理参数信号采集项目——心电信号

1.硬件——焊接调试趣事&#xff1a;由于测量手法问题&#xff0c;以及对示波器不太熟悉&#xff0c;差点以为没信号&#xff0c;都打算重焊一块板子了&#xff0c;但&#xff0c;实际上&#xff0c;信号输出是相对完美的&#xff1b;遇到的疑难杂症&#xff1a;1&#xff09;5…

Go1.25的源码分析-src/runtime/runtime1.go(GMP)g

1. 主要组成部分 Go语言的GMP调度器基于四个核心数据结构&#xff1a;g、m、p和schedt。 1.1 主要常量解读 1.1.1G 状态常量 const (_Gidle iota //刚分配尚未初始化的 G_Grunnable//已在运行队列上&#xff0c;未执行用户代码&#xff1b;栈未被该 G 拥有_Grunning//正在…

使用jwt+redis实现单点登录

首先理一下登录流程 前端登录—>账号密码验证—>成功返回token—>后续请求携带token---->用户异地登录---->本地用户token不能用&#xff0c;不能再访问需要携带token的网页 jwt工具类 package com.nageoffer.shortlink.admin.util;import cn.hutool.core.util.…

Trae配置rules与MCP

这个文章不错&#xff0c;不过如果只是看&#xff0c;还感受不到作者的震撼&#xff0c;所以我自己实操了一下&#xff0c;深受震动&#xff0c;也希望看到这篇文章的人也自己实操一下。 与Cursor结对编程的四个月&#xff0c;我大彻大悟了&#xff01; 学到了什么 无论是熟悉…

对抗攻击与防御:如何保护视觉模型安全?

对抗攻击与防御:如何保护视觉模型安全? 前言 一、对抗攻击的基本原理 二、对抗攻击的主要类型 2.1 白盒攻击 2.2 黑盒攻击 三、对抗攻击的常见形式 3.1 定向攻击 3.2 非定向攻击 四、对抗防御的核心思路 五、常见的对抗防御方法 5.1 对抗训练 5.2 输入预处理 5.3 防御蒸馏 六…

区块链开发:Solidity 智能合约安全审计要点

本文聚焦区块链开发中 Solidity 智能合约的安全审计要点。首先概述智能合约安全审计的重要性&#xff0c;接着详细介绍常见的安全漏洞&#xff0c;如重入攻击、整数溢出与下溢等&#xff0c;以及对应的审计方法。还阐述了审计的具体流程&#xff0c;包括自动化工具检测、手动代…

C++ 新手第一个练手小游戏:井字棋

1. 引言 介于身边有特别多没有学习过编程&#xff0c;或者有一定C语言、python或是Java基础的但是没有接触过C的新手朋友&#xff0c;我想可以通过一个很简单的小项目作为挑战&#xff0c;帮助大家入门C。 今天&#xff0c;我们将挑战一个对新手来说稍微复杂一点&#xff0c;…

透射TEM 新手入门:快速掌握核心技能

目录 简介​ 一、TEM 基本知识 1. 核心原理&#xff08;理解图像本质&#xff09;​ 2. 关键结构与成像模式&#xff08;对应图像类型&#xff09;​ 二、TEM 数据处理 1. 预处理&#xff08;通用步骤&#xff09;​ 2. 衍射花样&#xff08;SAED&#xff09;处理&#x…