Scrapy抓电商价格易被封IP因行为检测严格,需限并发、轮换代理、补全请求头;价格提取须适配多结构并清洗;登录跳转需维护会话;CSV导出要处理编码与空值。

Scrapy抓取电商价格时,为什么常被反爬封IP?
因为电商网站普遍部署了行为检测:频繁请求、缺失User-Agent、无Referer、Cookie未复用、响应头校验等都会触发风控。Scrapy默认并发为16,且不自动轮换请求头,直接跑下去大概率在第20–50页就被返回403或空数据。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 必须启用
ROTATING_PROXY_LIST(配合scrapy-rotating-proxies)或自建代理池,避免单IP高频访问 - 在
settings.py中设CONCURRENT_REQUESTS = 1起步,确认稳定后再逐步加到3–5 - 强制覆盖
DEFAULT_REQUEST_HEADERS,补全Referer和Accept-Encoding,例如京东商品页referer必须是对应店铺首页 - 禁用
ROBOTSTXT_OBEY = False——电商站robots.txt通常禁止所有爬虫,但实际规则不具法律效力,关掉它才能发请求
如何从HTML中可靠提取价格字段?
电商页面价格结构高度不统一:有的藏在data-price属性里,有的用span嵌套多层,有的甚至用CSS偏移“隐藏”真实数字(如把¥和数字拆成不同标签),还有的价格由JS动态注入。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先查
response.css('span[data-price]::attr(data-price)')或response.xpath('//div[@class="price"]//text()').re(r'¥(\d+\.\d+)'),别硬写//span/text() - 对JS渲染页(如部分拼多多、淘宝联盟链接),Scrapy本身不执行JS,需改用
scrapy-splash或切换为Playwright+Scrapy混合方案 - 价格字段务必做清洗:
re.sub(r'[^\d.]', '', price_str),否则可能拿到“¥ 1,299.00”或“促销价:¥899”这类脏数据 - 永远检查
len(price_list) > 0再取[0],空列表直接取索引会抛IndexError
如何让Scrapy自动处理登录态和商品详情跳转?
多数电商价格需登录后才显示真实价(如天猫会员价)、或需先请求列表页获取商品URL再发起二次请求,Scrapy默认不维护会话状态,也不自动解析链接。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 登录用
FormRequest提交账号密码,关键是要提取csrf_token或login_token隐藏字段,否则请求会被拒绝 - 跳转详情页必须用
response.follow()而非scrapy.Request(url=...),前者自动携带当前cookies和headers - 若登录后仍拿不到价格,检查是否需要额外请求
/api/price?skuId=xxx这类AJAX接口——这时应重写parse_item,用scrapy.Request调API并传入cookies_dict - 在
start_requests里手动yield scrapy.Request(..., cookies=load_cookies())比依赖中间件更可控
保存价格数据时,为什么CSV输出常乱码或缺字段?
Scrapy的FeedExporter默认用utf-8编码写CSV,但Windows Excel打开UTF-8 CSV需带BOM;另外,如果某个item字段为None或含换行符,CSV会错列甚至崩溃。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 导出前统一用
item.get('price', 'N/A')兜底,避免None进pipeline - 在
settings.py加FEED_EXPORT_ENCODING = 'utf-8-sig',让Excel能正确识别 - 价格字段用
str(item['price']).replace('\n', ' ').strip()预处理,防止CSV换行破坏结构 - 不要依赖
-o output.csv命令行导出,改用FEEDS配置支持字段筛选:{'output.csv': {'format': 'csv', 'fields': ['title', 'price', 'url']}}
真正难的不是写spider,而是持续应对前端结构变更——今天好用的XPath,明天商品页一改版就全失效。留个心眼:把选择器逻辑单独抽成配置文件,每次运行前先人工抽检3个SKU,比盲目重跑整个爬虫省时间得多。


















