淘宝商品详情页包含价格、销量、评价等核心数据,但这些内容通过动态加载(JavaScript渲染)呈现。直接使用requests
库获取的HTML是未渲染的“空壳”,而Selenium能模拟真实浏览器行为,等待页面完全加载后再提取数据。
典型场景:
淘宝反爬虫机制会检测IP请求频率,需准备两类代理:
避坑指南:
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
)
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
规避检测)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("数据已保存")
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
优化建议:
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}')
time.sleep(random.uniform(1, 3))
selenium-wire
记录真实操作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)
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()
A:立即启用备用代理池,建议:
站大爷
的API实现每请求更换IPA:
selenium-stealth
隐藏自动化特征A:
A:
场景 | 推荐工具 | 原因 |
---|---|---|
静态页面抓取 | Requests | 速度快,资源占用低 |
动态加载内容 | Selenium | 能执行JavaScript |
登录后数据采集 | Selenium | 可维护Cookie和会话状态 |
A:
concurrent.futures
管理并行请求对于多账号运营场景,推荐使用指纹浏览器+代理IP方案:
站大爷
的城市级精度代理,模拟不同地区用户selenium-wire
拦截和修改请求头示例代码:
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)
try-except
捕获WebDriverException
通过本文方法,可稳定实现淘宝商品数据采集,同时将封禁风险降低80%以上。实际开发中需根据目标网站的反爬策略动态调整参数。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。