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

简介: 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语法
    ● //:从任意层级查找
    ● /:从根节点查找
    ● [@属性="值"]:按属性筛选
    ● text():获取节点文本
    ● contains():模糊匹配
    例如:
    //div[@class="product"]/@id # 获取class="product"的div的id属性
    //a[contains(@href, "product_id")]/@href # 获取包含"product_id"的链接
    2.2 商品ID的常见存储方式
    电商网站的商品ID通常出现在以下位置:
  3. HTML标签属性:如data-productid、data-id
  4. URL参数:如https://item.jd.com/100123456.html(ID为100123456)
  5. JavaScript变量:如var productId = "123456"
  6. Meta标签:如

本文将重点讨论HTML属性和URL参数两种方式的XPath定位方法。
  • 实战案例:京东商品ID抓取
    3.1 目标分析
    京东的商品ID通常出现在:
    ● 商品详情页URL:如https://item.jd.com/100012043978.html(ID=100012043978)
    ● HTML标签属性:如data-sku
    3.2 实现代码
    使用requests和lxml库进行爬取:
    import requests
    from lxml import html
  • def 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
    
        # 解析HTML
        tree = 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_id
    
    except 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

    1. 实战案例:淘宝商品ID抓取
      4.1 目标分析
      淘宝的商品ID存储方式较为复杂,常见位置:
      ● URL参数:如https://item.taobao.com/item.htm?id=123456789(ID=123456789)
      ● JavaScript变量:如itemId: "123456789"
      4.2 实现代码
      淘宝有反爬机制,需模拟浏览器访问(使用selenium):
      from selenium import webdriver
      from lxml import html
      import time

    def 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提取ID
    product_id = url.split("id=")[-1].split("&")[0]
    print(f"从URL提取的商品ID: {product_id}")
    
    # 方式2:从HTML解析(淘宝可能动态渲染,需检查JS)
    page_source = driver.page_source
    tree = 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

    1. XPath优化策略
      5.1 提高XPath的稳定性
      ● 避免绝对路径:如/html/body/div[1]/div[2]/...容易因页面变动失效
      ● 使用contains()模糊匹配:如//div[contains(@class, "product")]
      ● 结合@class和@id:如//div[@class="product-info" and @data-id]
      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]
    2. 结论
      本文介绍了如何利用XPath精准抓取电商商品ID,并提供了京东、淘宝的实战代码。关键点总结:
    3. 优先从URL提取(如京东、淘宝的URL包含ID)
    4. 结合HTML属性(如data-sku、data-productid)
    5. 动态页面需用Selenium(如淘宝的JS渲染)
    6. 优化XPath表达式(避免绝对路径,使用模糊匹配)
    相关文章
    |
    5月前
    |
    存储 分布式计算 大数据
    基于Python大数据的的电商用户行为分析系统
    本系统基于Django、Scrapy与Hadoop技术,构建电商用户行为分析平台。通过爬取与处理海量用户数据,实现行为追踪、偏好分析与个性化推荐,助力企业提升营销精准度与用户体验,推动电商智能化发展。
    |
    5月前
    |
    数据采集 Web App开发 数据安全/隐私保护
    实战:Python爬虫如何模拟登录与维持会话状态
    实战:Python爬虫如何模拟登录与维持会话状态
    |
    6月前
    |
    数据采集 Web App开发 自然语言处理
    新闻热点一目了然:Python爬虫数据可视化
    新闻热点一目了然:Python爬虫数据可视化
    |
    5月前
    |
    JSON 算法 API
    Python采集淘宝商品评论API接口及JSON数据返回全程指南
    Python采集淘宝商品评论API接口及JSON数据返回全程指南
    |
    5月前
    |
    数据采集 运维 监控
    爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
    本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
    982 62
    爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
    |
    5月前
    |
    数据采集 机器学习/深度学习 人工智能
    反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
    本文系统阐述了反爬虫技术的演进与实践,涵盖基础IP限制、User-Agent检测,到验证码、行为分析及AI智能识别等多层防御体系,结合代码实例与架构图,全面解析爬虫攻防博弈,并展望智能化、合规化的发展趋势。
    1841 62
    反爬虫机制深度解析:从基础防御到高级对抗的完整技术实战
    |
    5月前
    |
    数据采集 监控 数据库
    Python异步编程实战:爬虫案例
    🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
    Python异步编程实战:爬虫案例
    |
    5月前
    |
    数据采集 人工智能 JSON
    Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
    Prompt 工程实战:如何让 AI 生成高质量的 aiohttp 异步爬虫代码
    |
    6月前
    |
    数据采集 存储 XML
    Python爬虫技术:从基础到实战的完整教程
    最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
    917 19
    |
    5月前
    |
    数据采集 存储 JSON
    Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
    Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接

    推荐镜像

    更多