如何通过Waxpeer API筛选日销量低于1的CSGO商品?
解决方案:筛选日销量低于1的Waxpeer商品
首先,你的核心需求是筛选出日均销量低于1的商品,结合你提供的代码和API返回的count字段,我会给出两种简单的实现方式,同时顺便修正代码里的一些小问题~
方法1:爬取单个商品时直接筛选(推荐,减少内存占用)
在你计算完avgn(日均销量)之后,添加一个判断条件:只有当avgn < 1时,才将该商品的数据加入dfs列表。这样可以避免存储不需要的商品数据,节省内存。
修改后的核心代码片段如下:
for names in namelist: headers = {'content-type': 'application/json;charset=UTF-8'} data = {"name": names} r = requests.post('https://waxpeer.com/api/get-sales-history', headers=headers, json=data) history = r.json() # 处理空数据情况,避免计算时报错 if not history.get('data'): print(f"商品 {names} 无销售数据,跳过") continue count = [i['count'] for i in history['data']] AveragePrice = numpy.mean([i['avg'] for i in history['data']]) counter = [list(map(int, x)) for x in count] avgn = numpy.mean(counter) # 关键筛选条件:只保留日均销量<1的商品 if avgn < 1: # 修正原代码的namer覆盖问题,用当前循环的names作为商品名 itemois = pd.DataFrame({ 'Names': [names], 'Average Sales Per Day': [avgn], 'AveragePrice': [AveragePrice] }) dfs.append(itemois)
方法2:在最终DataFrame中批量筛选
如果你已经爬取了所有商品数据,也可以在最后通过Pandas的条件过滤来快速筛选:
# 合并所有数据后添加筛选逻辑 itemois = pd.concat(dfs, ignore_index=True) # 筛选日均销量低于1的商品 low_sales_items = itemois[itemois['Average Sales Per Day'] < 1] print(low_sales_items) low_sales_items.to_excel('waxpeer_low_sales.xlsx')
顺便修正代码里的几个小问题
namer变量覆盖问题:原代码中namer是在while循环里赋值,但后续创建DataFrame时仍用namer,会导致所有商品的名称都被替换成最后一个爬取的商品名,要改成用循环里的names。- while循环逻辑错误:原代码把
offset +=50放在了for循环外面,会导致while循环只执行一次就终止,应该把偏移量递增移到while循环内部,同时通过判断返回的商品列表是否为空来终止循环(比硬编码offset>10000更可靠):
while not at_end: response = requests.get(URL.format(offset=offset)).json() items = response.get("items", []) if not items: # 没有更多商品时终止循环 at_end = True break for data in items: namer = data["name"] listo.append(namer) offset += 50 print(f"已获取 {offset} 条商品数据")
这样你的代码不仅能精准筛选低销量商品,还能更稳定地爬取全量数据~
内容的提问来源于stack exchange,提问作者Josh Murphy




