当前位置: 首页 > news >正文

1688爬虫避坑:无痕浏览抓HTML+XPath二次拼接提取数据实战

1688爬虫避坑:无痕浏览抓HTML+XPath二次拼接提取数据实战

前言

在爬取1688这类电商平台数据时,很多小伙伴都会遇到一个问题:正常浏览器访问能看到页面内容,但是通过代码请求拿到的HTML源码缺失,甚至拿不到有效响应,只有切换无痕浏览才能获取到完整的HTML。本文就针对这个问题,详细拆解无痕浏览抓包、XPath二次拼接提取拆分数据的全流程,纯学习分享,仅供个人学习研究使用,严禁用于任何商业盈利、非法爬取,务必遵守《网络安全法》等相关法律法规,尊重平台数据版权。

一、问题场景分析

在爬取1688首页商品数据时,遇到两个核心问题:

  1. 普通浏览访问无有效HTML响应:平台会通过Cookie、会话缓存、反爬校验限制常规请求,直接用代码请求拿不到页面渲染后的完整源码,无痕浏览无缓存、无旧Cookie干扰,反而能获取正常响应。

  2. 数据字段拆分拼接:商品价格等字段被拆分成多个span标签存储,直接XPath提取只能拿到部分内容,需要二次XPath提取后拼接,才能得到完整数值。

二、前期准备工作

2.1 环境配置

首先安装所需的依赖库,执行以下命令:

pip install requests pip install lxml

2.2 无痕浏览抓包获取请求头

  1. 打开浏览器(以Edge/Chrome为例),按下Ctrl+Shift+N开启无痕浏览模式;

  2. 在无痕窗口中访问目标1688页面,按下F12打开开发者工具,切换到Network面板;

  3. 刷新页面,找到对应的页面请求,复制Request Headers里的请求头和Cookie;

  4. 无痕浏览不会保留历史缓存和旧Cookie,能拿到最纯净的请求参数,避开平台的会话反爬。

三、核心代码实现(含完整步骤)

3.1 导入依赖库

frompprintimportpprintimportrequestsfromlxmlimportetree

3.2 配置请求头和Cookie

将无痕浏览抓到的Cookie和Headers粘贴进来,模拟无痕浏览的请求环境:

cookies={'leftMenuLastMode':'COLLAPSE','cna':'sBhMIkK15j8CAW8c+e1dviks','mtop_partitioned_detect':'1','_m_h5_tk':'cb8dd60ea288748d56c672d578bb41e7_1774536760651','_m_h5_tk_enc':'35a719c0e6d788c851c45e2b66f43e5e',# 其余抓包到的Cookie字段}headers={'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8','accept-language':'zh-CN,zh;q=0.9','cache-control':'max-age=0','referer':'https://www.bing.com/','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',}

3.3 发送请求获取HTML源码

通过requests发送请求,承接无痕浏览的请求参数,获取页面HTML:

# 请求页面response=requests.get('https://www.1688.com/',cookies=cookies,headers=headers)html=etree.HTML(response.txt)# 获取所有商品卡片cards=html.xpath("//div[contains(@class, 'offer-card-container')]")print(f"✅ 成功抓取到商品总数:{len(cards)}")print("-"*80)

3.4 跳过前10条数据

按照需求,忽略前10个商品,从第11条开始遍历提取:

# 跳过前10个商品,从第11个开始遍历forindex,cardinenumerate(cards[10:],11):# 提取商品名称name=card.xpath(".//span[@class='offer-title']/text()")name=name[0].strip()ifnameelse"无"# 提取商品图片链接img_url=card.xpath(".//img[@class='main-img']/@src")img_url=img_url[0].strip()ifimg_urlelse"无"

3.5 XPath二次拼接提取价格

1688的商品价格被拆分成多个span标签,直接提取不完整,需要先定位价格容器,再分别提取每个子标签内容,最后拼接成完整价格:

# 价格拆分+XPath二次提取拼接price_wrap=card.xpath(".//div[@class='price-wrap']")ifprice_wrap:# 依次提取拆分的价格字段s1=price_wrap[0].xpath("(.//span[1])").strip()s2=price_wrap[0].xpath("string(.//span[2])").strip()s3=price_wrap[0].xpath("string(.//span[3])").strip()# 拼接完整价格price=s2+s3else:price="无"

3.6 提取其余字段+厂家名称

继续提取销量、服务信息,通过层级XPath定位厂家店铺名称:

# 提取商品销量sales=card.xpath(".//div[contains(@class,'price-other-item')]/text()")sales=sales[0].strip()ifsaleselse"无"# 提取服务标签service_items=card.xpath(".//div[@class='service-item']/div/text()")collect=service_items[0].strip()iflen(service_items)>0else"无"peer_buy=service_items[1].strip()iflen(service_items)>1else"无"# 提取生产厂家名称factory=card.xpath("string(.//a[contains(@class,'company-wrap')]//span[@class='company-name'])").strip()factory=factoryiffactoryelse"无"

3.7 数据打印输出

# 格式化打印数据print(f"📌 第{index}个商品")print(f"产品名称:{name}")print(f"商品图片:{img_url}")print(f"销售价格:{price}")print(f"商品销量:{sales}")print(f"收藏人数:{collect}")print(f"同行采购:{peer_buy}")print(f"生产厂家:{factory}")print("-"*80)

四、关键步骤详解

4.1 为什么无痕浏览能拿到有效HTML?

普通浏览模式下,浏览器会留存旧的Cookie、本地缓存,平台会通过这些会话信息识别请求合法性,甚至返回虚假HTML;而无痕浏览无缓存、无残留Cookie,请求更接近纯净的首次访问,能绕过基础的会话反爬,获取到真实的页面源码。

4.2 XPath二次拼接的逻辑

电商平台为了防爬,会把敏感数据(如价格)拆分到多个子标签中,直接提取单个标签只能拿到部分内容。解决思路:

  1. 第一步:定位到数据的父级容器;

  2. 第二步:分别提取容器内各个子标签的文本;

  3. 第三步:将拆分的文本拼接,得到完整数据。

4.3 空值处理技巧

页面中部分商品可能缺失某些字段,通过三元表达式做非空判断,避免代码报错,保证爬虫稳定运行。

五、常见报错排查

  1. 获取不到HTML:检查Cookie是否过期,必须重新用无痕浏览抓最新的Cookie;

  2. XPath提取为空:核对页面标签class是否变更,1688偶尔会更新标签类名;

  3. 数据拼接不全:确认XPath路径是否精准,是否定位到正确的子标签。

六、总结

本次实战解决了1688爬虫的两大核心问题,依靠无痕浏览绕过基础会话反爬,通过XPath二次拼接搞定拆分数据,整套代码适配1688首页商品数据抓取,逻辑通用,可迁移到其他电商平台的同类场景。

再次强调:本文仅为Python爬虫学习交流,严禁用于任何商业盈利、非法爬取数据,严格遵守网络相关法律法规。

最后

持续分享Python爬虫、数据分析、逆向反爬干货,关注我,带你攻克更多爬虫实战难题,解锁更多避坑技巧!

http://www.jsqmd.com/news/541390/

相关文章:

  • 1949–2024年中国县级行政区划(逐年)|全国范围、75年连续、SHP格式
  • 双模型灾备方案:OpenClaw同时配置百川2-13B-4bits与Llama3应对服务中断
  • C#的yield return:延迟执行的迭代器模式实现
  • OpenClaw案例合集:Qwen3-VL:30B在飞书落地的10个实用场景
  • 基于2026校招数据分析:拥有这几张AI证书的学生,起薪普遍高30%
  • 3.26打卡
  • CX8242KA射频直采收发器性能测试与优化指南
  • 从零设计进程独立内核页表:XV6内存管理优化实战记录
  • 避坑指南:用ESP32驱动LD2420毫米波雷达时,串口数据丢失和自动开机卡死的那些事儿
  • 3个核心功能让Vue拖拽交互开发效率提升80%:从入门到电商级应用实践
  • MySQL基础运维:mysqldump全量备份与恢复实操 | 新手可直接落地的备份指南
  • 2021年中国村级行政区划边界矢量数据|行政村 + 社区|全国60万+单元|SHP格式、WGS84坐标
  • 单片机时序图分析与I²C协议实现指南
  • League-Toolkit:英雄联盟玩家的终极本地辅助工具,3分钟上手提升游戏效率
  • 初识Python正则表达式:从0到1的语法入门
  • ComfyUI模型管理完全指南:从零搭建高效AI创作流水线
  • PX4-Bootloader移植实战:从USB模拟串口到参数配置避坑指南
  • Petalinux-build --sdk卡在assimp?手动下载源码并集成到Yocto构建系统的完整指南
  • OpenClaw+QwQ-32B科研助手:文献摘要与笔记自动整理
  • Linux系统管理命令完全指南
  • 小丸工具箱 vR236|ffmpeg 图形化视频压制工具
  • Git提交时Personal Access Token权限不足:如何正确配置workflow scope
  • ViGEmBus虚拟手柄驱动:5分钟快速上手Windows游戏控制器终极方案
  • hongzh0Xstream历史漏洞审计
  • 2010–2023年中国村级行政区划边界矢量数据|含街道/乡/镇|SHP格式、WGS84坐标
  • 告别性能玄学:手把手教你用Perf和PEBS精准定位代码热点(附Skylake事件列表)
  • ROS Noetic + RealSense D435i:从驱动安装到RVIZ点云显示的完整工作流解析
  • ESP32驱动2.0寸TFT屏(带25Q32字库芯片)保姆级教程,解决UTF-8乱码问题
  • 在大厂技术岗工作十年,能挣公务员一辈子的钱吗?
  • 用SpringBoot+Jsoup爬取500彩票网双色球数据,手把手教你做个历史中奖查询小工具