电商平台爬虫实战:4 大核心技术难点与解决方案(附代码示例)
电商平台爬虫实战:4 大核心技术难点与解决方案(附代码示例)
![]()
一、反爬机制对抗:突破平台 “防御墙”
1. 痛点 1:IP 封锁(最常见)
代理池选型:优先混合使用「住宅 IP(模拟真实用户)+ 短效数据中心 IP(性价比高)」,推荐平台:911S5、BrightData。
轮换策略:每 10-20 次请求切换 1 个 IP,同时控制单 IP 请求间隔(1-3 秒 / 次,模拟人类浏览节奏)。
代码示例(Python+requests):
import requestsimport random# 代理池(实际项目中需从代理API动态获取)PROXY_POOL = ["http://123.45.67.89:8888","http://98.76.55.43:9999"]def get_proxy():return random.choice(PROXY_POOL)def crawl_product(url):proxy = {"http": get_proxy(), "https": get_proxy()}headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/118.0.0.0"}try:response = requests.get(url, headers=headers, proxies=proxy, timeout=5)if response.status_code == 200:return response.textelse:print(f"IP被封,切换代理...")return crawl_product(url) # 递归重试except Exception as e:print(f"代理失效:{e}")return crawl_product(url)2. 痛点 2:动态验证(滑块 / 图形验证码)
简单图形验证码:用 Tesseract-OCR + 图像预处理(降噪、二值化)识别,代码示例:
from PIL import Imageimport pytesseractdef recognize_captcha(image_path):# 图像预处理:转为灰度图+二值化img = Image.open(image_path).convert("L")threshold = 127table = [0 if i < threshold else 1 for i in range(256)]img = img.point(table, "1")# OCR识别return pytesseract.image_to_string(img)复杂滑块验证:优先用打码平台(超级鹰、若快),按 API 文档调用(成本约 0.1 元 / 次);自研可选 Playwright 模拟人类滑动轨迹(需分析滑块缺口位置)。
3. 痛点 3:动态渲染(JS 加载数据)
抓接口:F12 打开 “网络” 面板,筛选 XHR 请求,找到含商品数据的接口(如https://detail.tmall.com/item.htm?id=xxx的后端接口),提取请求参数(注意签名逻辑,如淘宝的sign参数),直接请求 JSON 数据,效率比渲染高 10 倍。
无头浏览器:接口加密无法破解时,用 Playwright 渲染完整页面,代码示例:
from playwright.sync_api import sync_playwrightdef crawl_dynamic_page(url):with sync_playwright() as p:browser = p.chromium.launch(headless=True) # 无头模式page = browser.new_page()page.goto(url, wait_until="networkidle") # 等待网络 idle# 提取商品价格(按实际DOM结构调整)price = page.locator(".tm-price").text_content()browser.close()return price二、动态数据解析:应对页面频繁迭代
痛点:页面结构变更导致解析规则失效
基于文本定位:不用class/id,而是按文本内容找父节点,示例(爬商品名称):
from parsel import Selectordef parse_product_name(html):sel = Selector(text=html)# 先找“商品名称”文本的父节点,再提取相邻的商品名name = sel.xpath('//text()[contains(.,"商品名称")]/parent::*/following-sibling::div[1]/text()').get()return name.strip() if name else NoneAI 解析工具:复杂场景用 Diffbot、ParseHub,自动识别商品、价格等字段,无需手动写 XPath,适合非技术人员或高频变更的页面。
三、海量数据处理:解决 “存不下、查不动”
1. 痛点 1:存储压力
数据类型 | 存储引擎 | 优化策略 |
结构化数据(价格、库存) | MySQL | 按商品 ID 哈希分表(如分 10 张表) |
非结构化数据(评价、图片) | MongoDB | 按时间分片(每月 1 个集合) |
高频查询数据(实时价格) | Redis | 设置 1 小时过期时间,减少 DB 压力 |
历史归档数据(去年评价) | HDFS | 用 Hive 建表,支持离线分析 |
分表示例(MySQL):按商品 ID 分表,product_0存 ID%10=0 的数据,SQL 建表语句:
CREATE TABLE product_0 (product_id BIGINT PRIMARY KEY,name VARCHAR(255),price DECIMAL(10,2),create_time DATETIME) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 痛点 2:数据清洗效率低
import pandas as pdimport re# 1. 读取爬取数据df = pd.read_csv("product_data.csv")# 2. 去重(按商品ID)df = df.drop_duplicates(subset=["product_id"], keep="first")# 3. 价格标准化(提取纯数字)df["price"] = df["price"].apply(lambda x: re.findall(r"\d+\.?\d*", str(x))[0] if re.findall(r"\d+\.?\d*", str(x)) else None)# 4. 过滤垃圾评价(长度<5的文本)df["comment"] = df["comment"].apply(lambda x: x if len(str(x)) >=5 else None)# 5. 保存清洗后数据df.to_csv("cleaned_product_data.csv", index=False)四、法律合规:爬得合法是前提
痛点:违规爬取面临法律风险(罚款、诉讼)
遵守 robots 协议:访问https://www.xxx.com/robots.txt,不爬取Disallow路径(如淘宝Disallow: /item/);
控制爬取强度:避开平台高峰期(如双十一、618),单 IP 请求频率≤1 次 / 秒,不占用核心资源;
不碰敏感数据:仅爬取公开的商品名称、价格、销量,不爬取用户手机号、收货地址(违反《个人信息保护法》);
优先用开放 API:京东、拼多多等均有开放平台 API(需申请密钥),通过 API 获取数据无合规风险,效率也更高。
总结与工具推荐
爬虫框架:Scrapy(分布式爬取)、Playwright(动态渲染);
存储工具:MySQL(结构化)、MongoDB(非结构化)、Redis(缓存);
清洗工具:Pandas(批量处理)、jieba(文本分词);
合规查询:平台 robots 协议、开放平台 API 文档。




