一、问题背景
最近接到一个采集需求:目标网站是一个商业品牌数据库,需要采集5个分类的品牌数据。
采集字段:品牌名称、创立时间、开店方式、合作期限、面积要求
技术难点:
网站需要登录才能访问完整数据
列表页只有品牌名称,详细信息在详情页
需要覆盖5个分类,每个分类有分页
数据量要求2000+条
如果用requests写一个脚本也能跑,但为了后续维护和复用,我选择了Scrapy框架。
二、解决思路
第一步:分析接口
登录网站,打开F12 → Network,找到品牌列表的真实接口:
URL:
http://www.xxxxx.com/wsapi/brand/getBigdataList3_4方法:POST
参数:
ytlb1(分类)、pageNum(页码)、pageSize(每页数量)返回:JSON,包含品牌列表和
hasNextPage翻页标识
第二步:处理登录态
从浏览器复制完整的Cookie和Token,放入请求头。这是绕过登录的关键。
第三步:定义数据字段(items.py)
class WsItem(scrapy.Item): brand_name = scrapy.Field() create_time = scrapy.Field() open_way = scrapy.Field() coop_term = scrapy.Field() area_req = scrapy.Field()第四步:编写爬虫(brand.py)
核心逻辑:
循环5个分类,发起POST请求
解析列表页,提取
brandId请求详情页,用XPath提取4个字段
判断
hasNextPage,自动翻页
第五步:保存数据(pipelines.py)
通过Pipeline将数据写入Excel。
三、核心代码
def parse_detail(self, response): item = WsItem() item["brand_name"] = response.meta["brand_name"] values = response.xpath('//ul[@class="detail-option border-b"]/li/span[2]/text()').getall() item["create_time"] = values[1] if len(values) > 1 else "" item["open_way"] = values[2] if len(values) > 2 else "" item["coop_term"] = values[3] if len(values) > 3 else "" item["area_req"] = values[4] if len(values) > 4 else "" yield item在此展示部分代码
四、运行结果
成功拿到数据
五、踩坑与解决
| 问题 | 解决方案 |
|---|---|
| 请求返回404 | URL路径大小写问题,对比浏览器确认 |
| 返回“未登录” | 缺少Cookie/Token,从浏览器完整复制 |
| 数据字段为空 | XPath写错,用getall()打印所有值定位 |
| 翻页无限循环 | 检查hasNextPage字段,正确判断结束条件 |
🙋 关于我
爬虫 学习者,已完成多个网站采集项目。有数据采集需求或想交流技术,欢迎私信。