Scrapy爬虫抓取700+条目但实际仅245条的问题排查求助
问题分析与解决方案
核心问题
目标仅245条数据,但爬虫抓取700+条目,根源在于:
- 请求URL的
page-size递增但offset固定为0,导致每个请求返回的结果包含之前所有页面的数据,引发重复抓取 CLOSESPIDER_ITEMCOUNT设置值略低于目标数量,且重复数据触发停止逻辑时,实际有效数据未达标
可行解决方案
1. 修复分页请求逻辑
原请求中offset=0固定不变,page-size从36递增到240,每个请求都会返回前N条数据(N=page-size),导致大量重复。应改为固定page-size为36,递增offset,每次请求下一页的新数据:
修改start_requests方法:
def start_requests(self): # 245条数据,每页36条,需要8页(36*7=252 ≥245) for offset in range(0, 252, 36): yield scrapy.Request( url=f"https://www2.hm.com/en_us/men/new-arrivals/view-all/_jcr_content/main/productlisting.display.json?sort=stock&image-size=small&image=model&offset={offset}&page-size=36", method='GET', callback=self.parse )
2. 调整CLOSESPIDER_ITEMCOUNT配置
目标是245条数据,将setting.py中的值调整为245或稍大,确保抓取完所有目标数据后停止:
CLOSESPIDER_ITEMCOUNT = 245
3. 添加数据去重机制
在爬虫中维护已抓取的articleCode集合,避免重复生成Item:
修改parse方法:
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.processed_articles = set() # 存储已处理的articleCode def parse(self, response): json_resp = json.loads(response.body) products = json_resp.get('products') for product in products: article_code = product.get('articleCode') if article_code in self.processed_articles: continue self.processed_articles.add(article_code) loader = ItemLoader(item=HmsItem()) loader.add_value('title', product.get('title')) loader.add_value('articleCode', article_code) loader.add_value('category', product.get('category')) loader.add_value('src', product.get('image')[0].get('src')) loader.add_value('price', product.get('price')) loader.add_value('swatchesTotal', product.get('swatchesTotal')) loader.add_value('brandName', product.get('brandName')) yield loader.load_item()
验证效果
- 运行爬虫后,每个请求仅返回36条新数据,无重复
- 抓取到245条数据后,爬虫自动停止
- 即使接口返回重复数据,去重机制也会过滤掉已处理条目
内容的提问来源于stack exchange,提问作者usman Abbasi
相关产品推荐
相关产品推荐

