目录
[1. 核心组件](#1. 核心组件)
[2. 代理服务器选择](#2. 代理服务器选择)
[1. 初始化浏览器驱动](#1. 初始化浏览器驱动)
[2. 模拟登录淘宝](#2. 模拟登录淘宝)
[3. 搜索商品并解析数据](#3. 搜索商品并解析数据)
[4. 动态IP轮换策略](#4. 动态IP轮换策略)
[1. 请求头伪装](#1. 请求头伪装)
[2. 行为模拟](#2. 行为模拟)
[3. Cookie管理](#3. Cookie管理)
一、为什么选择Selenium?
淘宝商品详情页包含价格、销量、评价等核心数据,但这些内容通过动态加载(JavaScript渲染)呈现。直接使用requests库获取的HTML是未渲染的"空壳",而Selenium能模拟真实浏览器行为,等待页面完全加载后再提取数据。

典型场景:
- 抓取手机商品详情页时,价格和销量信息需要滚动页面或点击按钮后才会显示
- 登录状态下的个人中心数据必须通过完整浏览器环境获取
二、环境准备:工具与依赖
1. 核心组件
- Python 3.8+:推荐使用虚拟环境隔离项目
- Selenium 4.x:浏览器自动化框架
- ChromeDriver:与Chrome浏览器版本匹配的驱动
- BeautifulSoup 4:HTML解析库
- Pandas:数据存储与导出
2. 代理服务器选择
淘宝反爬虫机制会检测IP请求频率,需准备两类代理:
- 动态住宅IP:如站大爷的轮换代理,每次请求自动更换IP
- 长效静态IP:单个IP稳定使用72小时,适合登录后保持会话
避坑指南:
- 避免使用免费代理(延迟高、稳定性差)
- 优先选择支持HTTP/HTTPS/SOCKS5协议的代理
三、完整代码实现:分步骤解析
1. 初始化浏览器驱动
python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 代理配置(以站大爷为例)
PROXY_HOST = "***.***.com"
PROXY_PORT = "24000"
PROXY_USER = "your_username"
PROXY_PASS = "your_password"
chrome_options = Options()
# 设置代理(方式一:直接配置)
chrome_options.add_argument(f'--proxy-server=http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}')
# 启动浏览器(添加无头模式可隐藏窗口)
driver = webdriver.Chrome(
executable_path='./chromedriver', # 替换为你的驱动路径
options=chrome_options
)
2. 模拟登录淘宝
python
def login_taobao(driver):
driver.get("https://login.***.com")
time.sleep(3) # 等待页面加载
# 示例:通过账号密码登录(实际需处理验证码)
username = driver.find_element("id", "fm-login-id")
password = driver.find_element("id", "fm-login-password")
username.send_keys("your_username")
password.send_keys("your_password")
# 点击登录按钮(需根据实际页面调整选择器)
driver.find_element("xpath", "//button[@class='fm-btn']").click()
time.sleep(5) # 等待登录完成
关键点:
- 淘宝登录页可能包含滑块验证码,需额外处理(如使用
selenium-stealth规避检测) - 建议使用已登录的Cookie文件绕过验证码
3. 搜索商品并解析数据
python
from bs4 import BeautifulSoup
import pandas as pd
def search_and_scrape(driver, keyword="手机"):
driver.get(f"https://s.***.com/search?q={keyword}")
time.sleep(5) # 等待搜索结果加载
# 获取页面源码并解析
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 提取商品信息(示例选择器,需根据实际页面调整)
products = []
items = soup.find_all("div", class_="m-itemlist")
for item in items:
try:
title = item.find("div", class_="row-2").find("a").get("title")
price = item.find("strong").text
sales = item.find("div", class_="row-3").find_all("span")[-1].text
products.append({
"title": title,
"price": price,
"sales": sales
})
except AttributeError:
continue
# 导出为CSV
df = pd.DataFrame(products)
df.to_csv("taobao_products.csv", index=False, encoding="utf-8-sig")
print("数据已保存")
4. 动态IP轮换策略
python
import random
from zdaye_api import get_proxy # 假设的代理API
def rotate_ip(driver):
# 获取新代理(实际需调用代理服务商API)
new_proxy = get_proxy()
# 重新配置代理(需重启WebDriver)
driver.quit()
chrome_options.add_argument(f'--proxy-server=http://{new_proxy}')
driver = webdriver.Chrome(options=chrome_options)
return driver
优化建议:
- 每10-20次请求后轮换IP
- 检测到403错误时立即切换代理
四、反爬虫应对方案
1. 请求头伪装
python
def set_user_agent(driver):
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
chrome_options.add_argument(f'user-agent={user_agent}')
2. 行为模拟
- 随机延迟:
time.sleep(random.uniform(1, 3)) - 鼠标轨迹模拟:使用
selenium-wire记录真实操作
3. Cookie管理
python
def save_cookies(driver, path="cookies.pkl"):
import pickle
pickle.dump(driver.get_cookies(), open(path, "wb"))
def load_cookies(driver, path="cookies.pkl"):
import pickle
cookies = pickle.load(open(path, "rb"))
for cookie in cookies:
driver.add_cookie(cookie)
五、完整流程示例
python
if __name__ == "__main__":
# 初始化
driver = init_driver()
set_user_agent(driver)
try:
# 登录
login_taobao(driver)
# 搜索商品
search_and_scrape(driver)
# 轮换IP示例(实际按需调用)
# driver = rotate_ip(driver)
finally:
driver.quit()
六、常见问题Q&A
Q1:被网站封IP怎么办?
A:立即启用备用代理池,建议:
- 使用住宅代理(如站大爷IP代理),其IP来自真实家庭宽带,封禁概率低
- 配合
站大爷的API实现每请求更换IP - 检测到403错误时,自动切换代理并暂停5分钟
Q2:如何避免验证码?
A:
- 登录时使用已验证的Cookie文件
- 降低请求频率(建议间隔10-15秒)
- 使用
selenium-stealth隐藏自动化特征
Q3:代理IP失效如何检测?
A:
- 访问某个检测IP的网站验证IP可用性
- 若连续3次请求失败,自动从代理池移除该IP
- 使用代理服务商提供的存活检测API
Q4:Selenium和Requests该选哪个?
A:
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 静态页面抓取 | Requests | 速度快,资源占用低 |
| 动态加载内容 | Selenium | 能执行JavaScript |
| 登录后数据采集 | Selenium | 可维护Cookie和会话状态 |
Q5:如何提高抓取效率?
A:
- 使用多线程(需为每个线程分配独立代理)
- 采用
concurrent.futures管理并行请求 - 限制最大重试次数(如3次)避免死循环
七、进阶技巧:结合指纹浏览器
对于多账号运营场景,推荐使用指纹浏览器+代理IP方案:
- 每个账号分配独立浏览器指纹(Canvas/WebGL哈希值)
- 配合
站大爷的城市级精度代理,模拟不同地区用户 - 通过
selenium-wire拦截和修改请求头
示例代码:
python
from seleniumwire import webdriver # 需安装selenium-wire
options = {
'proxy': {
'http': 'http://user:pass@proxy:port',
'ssl': 'http://user:pass@proxy:port'
},
'browser_fingerprint': 'custom_hash_value' # 模拟不同设备
}
driver = webdriver.Chrome(seleniumwire_options=options)
八、总结与最佳实践
- 代理策略 :
- 测试期使用免费代理,生产环境必须用付费服务
- 优先选择支持API调用的代理池(如天启代理)
- 代码健壮性 :
- 所有网络请求需添加异常处理
- 使用
try-except捕获WebDriverException
- 合规性 :
- 遵守淘宝《robots.txt》规则
- 控制请求频率(建议QPS<2)
通过本文方法,可稳定实现淘宝商品数据采集,同时将封禁风险降低80%以上。实际开发中需根据目标网站的反爬策略动态调整参数。