☰
Python爬取淘宝商品信息实战:Selenium登录与滑块验证全攻略
2026/10/3 1:10:09 网站建设 项目流程

老实说,爬虫入门最容易劝退的不是网站本身多复杂,而是一上来就抄代码、跑不通、换一段代码、继续跑不通。我自己带过不少刚学Python爬虫的朋友,写豆瓣图书、爬天气这些都没问题,一到淘宝这类电商平台,基本就是全套验证码伺候。这篇文章就围绕Python实现爬取淘宝商品信息这个实战题目,把从技术选型、环境搭建、登录态处理、滑块验证到数据提取和翻页的完整链路拆开讲清楚。整个过程我尽量按照自己实际踩过坑之后的经验来写,适合已经掌握Python基础语法、能跑通requests爬虫,但还没碰过复杂反爬场景的读者;如果你是零基础,只要能照着安装环境、复制代码,也能先把流程跑起来,再慢慢理解里面的细节。

1. 先搞清楚:淘宝爬虫的难点到底在哪

1.1 淘宝反爬体系到底做了什么

在动手之前,先要有一个心理预期:淘宝是整个中文互联网里反爬强度最高的平台之一,它不只是一个验证码那么简单,而是多层机制叠加。第一层是登录态控制,未登录状态下能看到的信息非常有限,即便能看到搜索页,价格、销量这些核心字段也会各种不完整。第二层是滑块验证,一旦检测到疑似脚本操作,立刻弹出滑块验证,这个滑块是阿里自研的人机识别体系,不是简单识别缺口位置就能过的。

再往下拆,还有字体反爬:搜索结果页的部分数字会用自定义字体映射,直接解析HTML源码,价格数字可能是乱码,用requests方案处理这个非常麻烦。同时,搜索页面大量数据通过异步接口获取,请求URL里带着加密签名,纯requests直接调接口需要逆向签名算法,工作量陡增。最后是行为风控,短时间高频请求同一个IP、固定UA、固定Cookie,很快会触发限流甚至封禁。

可以把这套体系理解成银行柜台,光拿出身份证不够,还要回答几个问题、按密码、签个字,所有环节都看着像一个正常人类客户在办业务才会放行。对爬虫开发者来说,缺一环就会被拦在门外。

1.2 先画好边界:什么样的采集是合法合理的

再老实说,淘宝的robots协议和服务条款对自动化采集有严格限制,真实商业项目一定要先取得授权或评估法律风险。我们现在讲的这套方法,定位是“技术学习和技术验证”,适用场景例如:自己想分析某个行业公开商品的价格分布、销量排行,或者做学习用的小型数据展示项目。

要注意几个边界:只采集公开可见的搜索页数据,不采集用户个人信息、订单信息、评价者身份等敏感内容;严格控制请求频率,给服务器留足缓冲时间,不做接口压力测试;数据仅用于个人学习、统计分析,不用于商业变现,不转卖数据;采集过程中如遇平台明确限制或封禁,立即停止并反思节奏,而不是想办法对抗风控。尤其要注意评论数据往往关联用户ID和用户等级,涉及个人信息,合规风险远大于商品信息,不建议碰。

这个边界意识不仅是从法律风险角度出发,也是技术上的保护伞。很多爬虫翻车,不是技术不够,而是不给服务器留活路,最后连登录账号都被冻结,得不偿失。

2. 技术路线怎么选:请求接口还是模拟浏览器

2.1 两条主流路线的优缺点

聊技术方案之前,先看两条主流路线。第一种是“requests直连接口”:原理是用requests模拟浏览器向淘宝的搜索接口发起请求,直接拿JSON数据。优点是速度快,单次请求几十毫秒,资源占用低,适合做大规模分布式抓取。缺点是需要处理签名算法、Cookie拼接、字体反爬、滑块验证码等一堆前置问题,开发成本和维护成本都很高。

第二种是“Selenium/Playwright浏览器自动化”:原理是启动一个真实的浏览器内核,让浏览器自己去访问页面、执行JavaScript,脚本只负责点击、等待、提取渲染完成后的数据。优点是新手友好,不需要逆向接口签名;页面最终渲染好了,很多字体反爬问题会自动规避。缺点是速度慢,通常一次搜索要2到5秒;资源占用高,多开浏览器对机器性能有要求。

两条路线我实际都摸过一遍。如果是做生产级的大规模采集,最终大概率要回到requests或aiohttp直连接口这条路上;但如果是为了快速学习和验证“淘宝商品信息到底怎么抓”,我个人强烈建议先从Selenium开始,因为你能用最短时间跑通全流程,建立整体认知。

2.2 我为什么推荐先学一套能跑通的方案

很多人一上来就纠结“到底要不要破解滑块”“要不要逆向签名”,结果卡在准备阶段好几天。我的思路很简单:先用Selenium把整条链路跑通,再在这个基础上逐步替换成更高效的方案。这套思路背后的原因很简单:爬虫本质上是“模拟真实用户行为”,浏览器自动化是所有模拟方式里最接近真实用户的一种。

比如字体反爬这个点,requests方案里你需要下载字体文件、解析映射表、翻译数字;而在Selenium方案里,页面在渲染之前,浏览器内核已经帮你把字形和Unicode对应关系处理完了,你直接提取渲染后的文本就行。不是说Selenium不需要处理滑块和登录,而是它把其他很多麻烦在底层消化掉了。

等到你理解整条链路之后,如果数据规模真的上去,再去做接口逆向,那是有明确目标的优化;而不是一开始就伸手够自己还够不着的东西。先求跑通,再求效率,这是我做爬虫项目的一贯原则。

3. 环境准备与第一行可运行的代码

3.1 安装Python和Selenium库

这部分假定你电脑上已经安装了Python 3.8以上的版本。如果还没装,去Python官网下载对应系统的安装包,安装时一定记得勾选“Add Python to PATH”,否则后面在命令行里输python会提示找不到命令。

安装好Python之后,打开终端(Windows是cmd或PowerShell,macOS是Terminal),安装Selenium库:

pip install selenium

如果网络慢,可以换成国内镜像源:

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

Selenium现在主流的版本是4.x,4.x和3.x的写法差别不小。3.x里常见的是webdriver.Chrome(executable_path=...),到了4.x,executable_path被移除了,推荐用Service对象。下面代码都是按4.x来写,如果你用的是老版本,注意对照调整。

3.2 浏览器驱动配置

Selenium本身不包含浏览器,它需要驱动去操控浏览器。以Chrome为例,你需要一个chromedriver,版本要和本机Chrome版本大版本一致。查看Chrome版本的方法是:浏览器地址栏输入chrome://version,看一下顶部显示的版本号。

下载chromedriver并解压后,记住它的路径。Windows下示例如下:

from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service(r"C:\chromedriver\chromedriver.exe") driver = webdriver.Chrome(service=service)

这样写虽然能跑,但每次换电脑或换浏览器版本都要重新下载驱动,特别麻烦。这里更推荐用webdriver-manager自动管理驱动:

pip install webdriver-manager

然后代码里可以这样写:

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service)

实测下来,这个库会自动匹配版本并下载对应的chromedriver,省去手工维护驱动的痛苦。

3.3 第一次打开淘宝搜索页

一个最小可运行的打开浏览器的例子:

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) driver.get("https://www.taobao.com/") print(driver.title) driver.quit()

如果能看到一个真实Chrome窗口弹出来并打开淘宝首页,说明Selenium环境已经通。如果报错,最常见的原因有两个:driver版本和Chrome版本不匹配、Pycharm或终端里Python解释器路径不对。先解决这两个问题,再继续往下。

从这一步开始,后面所有代码都是基于这个最小框架往里面加东西。

4. 核心实操:登录、滑块、数据提取与翻页

4.1 登录态处理与用户数据目录复用

淘宝搜索页在未登录状态下也能打开,但很多字段会不完整,而且更容易触发验证。因此第一步是让浏览器处于登录状态。最简单的做法是用Selenium打开淘宝,让用户用手机淘宝扫码登录,一次登录成功后,把这个浏览器的用户数据目录保存下来,下次启动时直接复用,不用重复扫码。

核心代码如下:

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument(r"--user-data-dir=D:\taobao_profile") driver = webdriver.Chrome(options=options) driver.get("https://www.taobao.com/") input("登录后按回车继续...")

程序运行后,浏览器会打开一个全新的用户数据目录,你手动登录一次,之后关闭程序。以后每次启动都指定同一个user-data-dir,淘宝就会认为这是同一个浏览器环境,Cookie和登录态都会保留。这个技巧比反复把Cookie导出导入更方便,稳定性也更好。

注意user-data-dir要指定一个独立目录,不要直接用Chrome默认的默认用户目录,否则会和你的日常浏览器互相干扰。我在实际项目里就是吃了这个亏,一开始图省事用了默认目录,结果日常浏览的Cookie和爬虫共用一套环境,登录态混乱不说,还差点把日常账号给风控了。

4.2 滑块验证的正确处理思路

即使登录成功,频繁操作时仍会遇到滑块验证,这是淘宝风控模型根据一堆行为特征触发的。关于滑块,我看到网上不少教程教“用OpenCV识别缺口、模拟拖动轨迹”之类的破解方案,但我的态度很明确:不推荐自己开发绕过滑块的工具。

原因有两条。第一,淘宝滑块的人机识别会综合鼠标轨迹、加速度、点击位置、浏览器指纹等多种信息,本地开发出来的模拟轨迹很容易被抓包识别;第二,这种行为本身就涉嫌破坏平台防护机制,风险很高。我的处理思路是:把滑块当成一个“需要人工介入”的信号。

具体做法是:在爬虫里检测滑块元素是否出现,如果出现,就程序暂停并打印提示,让真人手动拖一下,拖完继续自动执行。同时,为了降低滑块触发概率,采集节奏要慢:每翻一页随机等待3到8秒,请求次数稳定在一个比较低的上限。

可以用特征文本判断是否出现滑块:

from selenium.webdriver.common.by import By try: slider = driver.find_element(By.XPATH, "//*[contains(text(), '请按住滑块')]") if slider.is_displayed(): print("检测到滑块验证,请人工拖动,完成后按回车") input() except Exception: pass

这种做法在非生产环境里已经能解决大部分问题,既保证流程不中断,也避免把自己卷进无限“破解-失败-封号”的循环里。

4.3 商品字段解析:从页面里抠出核心数据

登录完成、页面加载出来后,关键问题就是“数据在哪”。淘宝搜索页是个典型的SPA页面,商品数据不是简简单单躺在HTML标签里,而是藏在内嵌的全局JSON变量中。常见的一种方式是解析页面里的g_page_config,这是淘宝搜索页在源码里写入的一个全局变量,记录了当前页面大部分商品信息。

拿到它的思路是:先把页面源代码下载下来,用正则提取这个变量,再json.loads解析。示例代码如下:

import re import json page_source = driver.page_source match = re.search(r"g_page_config\s*=\s*({.*?});", page_source, re.S) if not match: print("未找到 g_page_config,页面结构可能变了") return data = json.loads(match.group(1)) items = data.get("mods", {}).get("itemlist", {}).get("data", {}).get("auctions", []) for item in items: title = item.get("title") price = item.get("view_price") sales = item.get("view_sales") shop = item.get("nick") url = item.get("detail_url") print(title, price, sales, shop, url)

这里有几个注意点。g_page_config正则提取时,变量赋值结束的分号要小心,JSON内部也可能会有分号,所以要用非贪婪匹配到最靠近的第一个};大括号结尾。实际测试时如果截断,可以再调整正则。字段名不是固定的,view_price、view_sales这些是淘宝历史数据结构里的常见字段,后续也可能改成别的名字。稳妥做法是先打印一下完整的JSON键名,再决定提取哪些字段。

Selenium的优势在于,页面渲染之后除了JSON,你也能用CSS选择器直接拿到渲染文本,两条路可以互为兜底。比如一行代码抓标题:

titles = driver.find_elements(By.CSS_SELECTOR, "div[class^='Title--title']")

但CSS类名随时可能带随机后缀,稳定性不如JSON解析。我个人更推荐以JSON解析为主,CSS选择器作为辅助兜底。

4.4 翻页逻辑与终止条件

淘宝搜索页翻页有两种方式:点击“下一页”按钮,或者直接修改URL里的page参数。实际项目中,修改URL更稳定,因为点击按钮涉及等待元素加载、判断按钮disable状态,多一步失败的可能。

搜索页URL结构一般是这样的:

https://s.taobao.com/search?q=关键字&page=2

所以只要循环递增page参数就行:

import random import time base_url = "https://s.taobao.com/search?q=连衣裙&page={}" for page in range(1, 4): # 抓前3页 driver.get(base_url.format(page)) time.sleep(random.uniform(3, 6)) # 解析当前页商品数据...

不过在实际操作中,直接改页数翻到比较深(比如20页以后)时,淘宝会要求重新验证,所以控制采集页数很重要。我的建议是单次任务不超过5页,抓完一轮休息一段时间再继续。

翻页的终止条件,建议设两个:一是达到你预设的最大页数;二是页面里找不到“下一页”按钮或者商品列表为空,就停止。至此一条完整的抓取链路就通了:登录、打开搜索页、提取JSON数据、翻页、循环,最后把数据保存下来。保存成CSV的简单方法如下:

import csv with open("taobao_items.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["title", "price", "sales", "shop", "url"]) writer.writerows(product_data)

注意编码用utf-8-sig,Excel打开才不乱码。这个小坑估计能救不少人。

5. 常见问题排查与避坑实录

5.1 高频报错速查表

自己实际操作中,几个高频问题基本绕不开,先列一个速查表:

现象可能原因处理方式
NoSuchElementException元素还没加载完,或页面结构变化用WebDriverWait显示等待,不要用隐式等待硬等
TimeoutException页面加载过慢,网络问题检查网络,增加超时时间,或reload当前页
频繁出现滑块验证请求频率太快,或浏览器指纹异常降低翻页速度,增加随机等待,检查登录态
解析出的价格为Noneg_page_config字段名变化先打印JSON键名,确认正确字段再提取
打开页面后白屏user-data-dir目录异常换一个全新目录,重新登录
抓几页后数据全是重复页面被重定向到验证码页停止任务,人工登录一次,再继续

这里特别说下显示等待。Selenium里有个常见误区:一上来就time.sleep(5)硬等,等到页面加载慢的时候,5秒不够就崩;页面加载快的时候,白白浪费时间。正确做法是用WebDriverWait配合expected_conditions,代码会智能地等元素出现再继续,超过指定时间再报超时。

示例代码如下:

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) goods_list = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[class^='Content--content']")))

5.2 我踩过的几个真实的坑

第一个坑是过于追求速度。早期版本为了跑得快,把每次请求的等待时间压到1秒以内,结果连续抓了500条商品数据之后,返回的全是验证码页面,连正常搜索都做不了。后来把每一次请求之间的间隔从1秒拉长到随机3到8秒,才慢慢恢复。爬虫不是抢火车票,慢一点反而更稳。

第二个坑是“无限滚动”的误判。有人把淘宝搜索页当成无限滚动页面,写完滚动代码后,发现滚到一半被各种弹窗打断,滚动速度不稳定还会被风控盯上。其实淘宝搜索结果页除了首屏部分异步插入,后面翻页是明确的“下一页”机制,直接用URL参数翻页就好,根本不需要模拟滚动。

第三个坑是CSV编码问题。第一次跑通后,兴致勃勃用Excel打开CSV,发现中文全是乱码,网上搜半天才知道要改成utf-8-sig。这个细节在DEMO阶段很不显眼,但在真实交付时特别影响观感。

第四个坑是没设置显式等待就去抓HTML源码。Selenium里driver.page_source拿的是当前DOM状态,如果页面JavaScript还没执行完,你拿到的source里没有商品数据。这个问题排查起来特别耗时,后来统一用显示等待,等待商品列表元素出现后再去取source。

6. 从能跑到好用:进阶扩展方向

6.1 并发设计:到底用不用,怎么用

很多新人看到“爬虫”两个字就想上并发,觉得单线程太慢。我的建议是:并发是爬虫后期优化的手段,不是前期入门的必需品。如果某个任务需要抓取几千上万条数据,单线程Selenium确实太慢了,这时可以引入concurrent.futures.ThreadPoolExecutor,让多个浏览器实例同时跑不同关键词,每实例独立登录态、独立user-data-dir,共享一个任务队列。

但要注意,并发越高,被风控识别的概率越大。我之前做过对比测试,单浏览器每小时能稳定抓几百条,双浏览器可能跑二十分钟就有一个实例被验证码卡住,实际速度并没有翻倍。更稳妥的路线是“评价任务量、控制并发数、设置随机重试”。

真正生产级的方案,通常是requests直连接口 + 分布式队列(比如Redis + 多节点),但这套体系的复杂度会指数级上升。先会走,再学跑,是我一直坚持的建议。

6.2 数据清洗与可视化展示

抓到商品数据后,如果不做后续分析,数据本身的价值有限。可以顺手把数据存进SQLite或MySQL,再用pandas读取做统计。比如把价格全部转成浮点数,去掉夹杂的“包邮”“促销价”等脏文本;按销量排序取TOP10商品;统计不同价格带的商品数量分布。

这些分析用几十行pandas代码就能完成,适合用做个人学习项目或职场里的小工具。如果对可视化有兴趣,可以用pyecharts或matplotlib生成柱状图和饼图,把“爬虫+数据清洗+可视化”串成一条完整的数据Pipeline,写进简历也够看。

6.3 合规红线与项目化经验

最后这部分我特别想多聊几句。国内对数据爬取的合规要求越来越高,真实业务场景里,采集数据必须尊重平台协议和法律法规。如果你的目的是商业用途,请务必先取得平台授权或使用官方API,不要在灰色地带上试探。更不要尝试去采用户身份、订单信息这类敏感数据,那是原则性红线。

我的个人经验是:一个爬虫项目能不能长期稳定运行,取决于你给自己设的节奏。每天固定时间、固定频率、增量更新,比一次性冲到最大量,要健康得多。数据采集不是一锤子买卖,细水长流才是做数据的人该有的心态。

根据我自己这几年带项目、做采集的体会,淘宝爬虫这个题目真正的价值,不在于你能抓到多少商品,而在于你通过它把浏览器自动化、登录态、反爬识别、数据解析、异步加载这一整条链路都摸了一遍。哪怕你后面不再碰爬虫,这种调试能力放在任何后端岗位都能复用。第一次跑通的时候,可能代码很笨,速度很慢,但别急着优化,先把链路跑稳,再谈规模。也别忘了给服务器留一口喘气的空间,这在任何时候都是最高优先级。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询