1688爬虫避坑无痕浏览抓HTMLXPath二次拼接提取数据实战前言在爬取1688这类电商平台数据时很多小伙伴都会遇到一个问题正常浏览器访问能看到页面内容但是通过代码请求拿到的HTML源码缺失甚至拿不到有效响应只有切换无痕浏览才能获取到完整的HTML。本文就针对这个问题详细拆解无痕浏览抓包、XPath二次拼接提取拆分数据的全流程纯学习分享仅供个人学习研究使用严禁用于任何商业盈利、非法爬取务必遵守《网络安全法》等相关法律法规尊重平台数据版权。一、问题场景分析在爬取1688首页商品数据时遇到两个核心问题普通浏览访问无有效HTML响应平台会通过Cookie、会话缓存、反爬校验限制常规请求直接用代码请求拿不到页面渲染后的完整源码无痕浏览无缓存、无旧Cookie干扰反而能获取正常响应。数据字段拆分拼接商品价格等字段被拆分成多个span标签存储直接XPath提取只能拿到部分内容需要二次XPath提取后拼接才能得到完整数值。二、前期准备工作2.1 环境配置首先安装所需的依赖库执行以下命令pip install requests pip install lxml2.2 无痕浏览抓包获取请求头打开浏览器以Edge/Chrome为例按下CtrlShiftN开启无痕浏览模式在无痕窗口中访问目标1688页面按下F12打开开发者工具切换到Network面板刷新页面找到对应的页面请求复制Request Headers里的请求头和Cookie无痕浏览不会保留历史缓存和旧Cookie能拿到最纯净的请求参数避开平台的会话反爬。三、核心代码实现含完整步骤3.1 导入依赖库frompprintimportpprintimportrequestsfromlxmlimportetree3.2 配置请求头和Cookie将无痕浏览抓到的Cookie和Headers粘贴进来模拟无痕浏览的请求环境cookies{leftMenuLastMode:COLLAPSE,cna:sBhMIkK15j8CAW8ce1dviks,mtop_partitioned_detect:1,_m_h5_tk:cb8dd60ea288748d56c672d578bb41e7_1774536760651,_m_h5_tk_enc:35a719c0e6d788c851c45e2b66f43e5e,# 其余抓包到的Cookie字段}headers{accept:text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,accept-language:zh-CN,zh;q0.9,cache-control:max-age0,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# 请求页面responserequests.get(https://www.1688.com/,cookiescookies,headersheaders)htmletree.HTML(response.txt)# 获取所有商品卡片cardshtml.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):# 提取商品名称namecard.xpath(.//span[classoffer-title]/text())namename[0].strip()ifnameelse无# 提取商品图片链接img_urlcard.xpath(.//img[classmain-img]/src)img_urlimg_url[0].strip()ifimg_urlelse无3.5 XPath二次拼接提取价格1688的商品价格被拆分成多个span标签直接提取不完整需要先定位价格容器再分别提取每个子标签内容最后拼接成完整价格# 价格拆分XPath二次提取拼接price_wrapcard.xpath(.//div[classprice-wrap])ifprice_wrap:# 依次提取拆分的价格字段s1price_wrap[0].xpath((.//span[1])).strip()s2price_wrap[0].xpath(string(.//span[2])).strip()s3price_wrap[0].xpath(string(.//span[3])).strip()# 拼接完整价格prices2s3else:price无3.6 提取其余字段厂家名称继续提取销量、服务信息通过层级XPath定位厂家店铺名称# 提取商品销量salescard.xpath(.//div[contains(class,price-other-item)]/text())salessales[0].strip()ifsaleselse无# 提取服务标签service_itemscard.xpath(.//div[classservice-item]/div/text())collectservice_items[0].strip()iflen(service_items)0else无peer_buyservice_items[1].strip()iflen(service_items)1else无# 提取生产厂家名称factorycard.xpath(string(.//a[contains(class,company-wrap)]//span[classcompany-name])).strip()factoryfactoryiffactoryelse无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二次拼接的逻辑电商平台为了防爬会把敏感数据如价格拆分到多个子标签中直接提取单个标签只能拿到部分内容。解决思路第一步定位到数据的父级容器第二步分别提取容器内各个子标签的文本第三步将拆分的文本拼接得到完整数据。4.3 空值处理技巧页面中部分商品可能缺失某些字段通过三元表达式做非空判断避免代码报错保证爬虫稳定运行。五、常见报错排查获取不到HTML检查Cookie是否过期必须重新用无痕浏览抓最新的CookieXPath提取为空核对页面标签class是否变更1688偶尔会更新标签类名数据拼接不全确认XPath路径是否精准是否定位到正确的子标签。六、总结本次实战解决了1688爬虫的两大核心问题依靠无痕浏览绕过基础会话反爬通过XPath二次拼接搞定拆分数据整套代码适配1688首页商品数据抓取逻辑通用可迁移到其他电商平台的同类场景。再次强调本文仅为Python爬虫学习交流严禁用于任何商业盈利、非法爬取数据严格遵守网络相关法律法规。最后持续分享Python爬虫、数据分析、逆向反爬干货关注我带你攻克更多爬虫实战难题解锁更多避坑技巧
1688爬虫避坑:无痕浏览抓HTML+XPath二次拼接提取数据实战
1688爬虫避坑无痕浏览抓HTMLXPath二次拼接提取数据实战前言在爬取1688这类电商平台数据时很多小伙伴都会遇到一个问题正常浏览器访问能看到页面内容但是通过代码请求拿到的HTML源码缺失甚至拿不到有效响应只有切换无痕浏览才能获取到完整的HTML。本文就针对这个问题详细拆解无痕浏览抓包、XPath二次拼接提取拆分数据的全流程纯学习分享仅供个人学习研究使用严禁用于任何商业盈利、非法爬取务必遵守《网络安全法》等相关法律法规尊重平台数据版权。一、问题场景分析在爬取1688首页商品数据时遇到两个核心问题普通浏览访问无有效HTML响应平台会通过Cookie、会话缓存、反爬校验限制常规请求直接用代码请求拿不到页面渲染后的完整源码无痕浏览无缓存、无旧Cookie干扰反而能获取正常响应。数据字段拆分拼接商品价格等字段被拆分成多个span标签存储直接XPath提取只能拿到部分内容需要二次XPath提取后拼接才能得到完整数值。二、前期准备工作2.1 环境配置首先安装所需的依赖库执行以下命令pip install requests pip install lxml2.2 无痕浏览抓包获取请求头打开浏览器以Edge/Chrome为例按下CtrlShiftN开启无痕浏览模式在无痕窗口中访问目标1688页面按下F12打开开发者工具切换到Network面板刷新页面找到对应的页面请求复制Request Headers里的请求头和Cookie无痕浏览不会保留历史缓存和旧Cookie能拿到最纯净的请求参数避开平台的会话反爬。三、核心代码实现含完整步骤3.1 导入依赖库frompprintimportpprintimportrequestsfromlxmlimportetree3.2 配置请求头和Cookie将无痕浏览抓到的Cookie和Headers粘贴进来模拟无痕浏览的请求环境cookies{leftMenuLastMode:COLLAPSE,cna:sBhMIkK15j8CAW8ce1dviks,mtop_partitioned_detect:1,_m_h5_tk:cb8dd60ea288748d56c672d578bb41e7_1774536760651,_m_h5_tk_enc:35a719c0e6d788c851c45e2b66f43e5e,# 其余抓包到的Cookie字段}headers{accept:text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,accept-language:zh-CN,zh;q0.9,cache-control:max-age0,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# 请求页面responserequests.get(https://www.1688.com/,cookiescookies,headersheaders)htmletree.HTML(response.txt)# 获取所有商品卡片cardshtml.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):# 提取商品名称namecard.xpath(.//span[classoffer-title]/text())namename[0].strip()ifnameelse无# 提取商品图片链接img_urlcard.xpath(.//img[classmain-img]/src)img_urlimg_url[0].strip()ifimg_urlelse无3.5 XPath二次拼接提取价格1688的商品价格被拆分成多个span标签直接提取不完整需要先定位价格容器再分别提取每个子标签内容最后拼接成完整价格# 价格拆分XPath二次提取拼接price_wrapcard.xpath(.//div[classprice-wrap])ifprice_wrap:# 依次提取拆分的价格字段s1price_wrap[0].xpath((.//span[1])).strip()s2price_wrap[0].xpath(string(.//span[2])).strip()s3price_wrap[0].xpath(string(.//span[3])).strip()# 拼接完整价格prices2s3else:price无3.6 提取其余字段厂家名称继续提取销量、服务信息通过层级XPath定位厂家店铺名称# 提取商品销量salescard.xpath(.//div[contains(class,price-other-item)]/text())salessales[0].strip()ifsaleselse无# 提取服务标签service_itemscard.xpath(.//div[classservice-item]/div/text())collectservice_items[0].strip()iflen(service_items)0else无peer_buyservice_items[1].strip()iflen(service_items)1else无# 提取生产厂家名称factorycard.xpath(string(.//a[contains(class,company-wrap)]//span[classcompany-name])).strip()factoryfactoryiffactoryelse无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二次拼接的逻辑电商平台为了防爬会把敏感数据如价格拆分到多个子标签中直接提取单个标签只能拿到部分内容。解决思路第一步定位到数据的父级容器第二步分别提取容器内各个子标签的文本第三步将拆分的文本拼接得到完整数据。4.3 空值处理技巧页面中部分商品可能缺失某些字段通过三元表达式做非空判断避免代码报错保证爬虫稳定运行。五、常见报错排查获取不到HTML检查Cookie是否过期必须重新用无痕浏览抓最新的CookieXPath提取为空核对页面标签class是否变更1688偶尔会更新标签类名数据拼接不全确认XPath路径是否精准是否定位到正确的子标签。六、总结本次实战解决了1688爬虫的两大核心问题依靠无痕浏览绕过基础会话反爬通过XPath二次拼接搞定拆分数据整套代码适配1688首页商品数据抓取逻辑通用可迁移到其他电商平台的同类场景。再次强调本文仅为Python爬虫学习交流严禁用于任何商业盈利、非法爬取数据严格遵守网络相关法律法规。最后持续分享Python爬虫、数据分析、逆向反爬干货关注我带你攻克更多爬虫实战难题解锁更多避坑技巧