提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
祝大家发大财!
CS饰品交易是一个很大的市场,本来我只是一个单纯的玩家来着,某一天打游戏的时候队友说我的角色绝版了,涨价了,我去buff一看,原来花了100买大行动换的饰品,竟然价值700!!于是乎走上了buff饰品交易这条不归路。
一、功能需求
buff市场和steam市场存在差价,扫描所有的饰品,对比两个平台的差价,差价很大的有购入价值(俗称挂刀)。市面上有很多挂刀网站,但是数据都不是很及时,自己写个代码爬取交易价格,更具有参考价值。
二、代码实现
1.引入库
代码如下:
import requests as req
import time
import csv
import re,random
import os
import pandas as pd
from datetime import datetime
import winsound
class CS2():
def __init__(self):
self.nowtime=datetime.now()
self.url='https://buff.163.com/api/market/goods'
self.billurl='https://buff.163.com/api/market/goods/bill_order'
self.my_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
"Cookie":"yourcookie",
"Host": "buff.163.com",
"Referer": "https://buff.163.com/market/?game=csgo",
"X-Requested-With": "XMLHttpRequest"
}
buff获取商品信息的api:https://buff.163.com/api/market/goods
定义请求头my_headers
2.请求商品数据
请求参数:
param={
'game':'csgo',
'page_size':'9999',
'min_price' : '10',
'max_price' : '100',
}
最小价格和最大价格,根据自己的实际情况来调整,这里的page_size填一个超大的数,可以一次性把所有符合价格的商品全部请求出来。
下面是所有枪皮的名称(不包括刀手套等):
self.weaponlist = ['weapon_revolver','weapon_bayonet', 'weapon_bizon', 'weapon_sg556', 'weapon_scar20', 'weapon_p250','weapon_m4a1', 'weapon_cz75a', 'weapon_aug','weapon_usp_silencer','weapon_xm1014', 'weapon_elite','weapon_sawedoff','weapon_nova','weapon_famas', 'weapon_fiveseven', 'weapon_g3sg1', 'weapon_galilar','weapon_glock', 'weapon_hkp2000', 'weapon_m249', 'weapon_mac10', 'weapon_mag7','weapon_mp5sd', 'weapon_mp7', 'weapon_mp9', 'weapon_negev', 'weapon_ssg08', 'weapon_zeus','weapon_tec9', 'weapon_ump45', 'weapon_ak47', 'weapon_m4a1_silencer', 'weapon_awp', 'weapon_deagle','weapon_p90']
3.获取商品信息
利用商品名称和价格获取符合条件的商品信息,并根据特定的要求返回数据
def getwrite(self,param):
res = req.get(url=self.url, headers=self.my_headers, params=param)
print(res.json())
list = res.json()['data']['items']
for itemlist in list:
yujishouru=(float(itemlist['sell_min_price']) * 0.96) - (float(
itemlist['goods_info']['steam_price_cny']) * 0.7)
maimaijiacha=float(itemlist['sell_min_price'])-float(itemlist['buy_max_price'])
shourubi=yujishouru/ float(itemlist['goods_info']['steam_price_cny']) * 0.7
jiachabi=maimaijiacha/float(itemlist['buy_max_price'])
if yujishouru > 0 and jiachabi < 0.3 and shourubi > 0.01:
itemdata = {
'id': itemlist['id'],
'求购数': itemlist["buy_num"],
'名称': itemlist['short_name'],
'英文名': itemlist['market_hash_name'],
'磨损度': itemlist['name'][-5:-1],
'在售数量': itemlist['sell_num'],
'buff在售最低价格': itemlist['sell_min_price'],
'buff折现价': float(itemlist['sell_min_price']) * 0.96,
'steam价格': itemlist['goods_info']['steam_price_cny'],
'steam美元价格': itemlist['goods_info']['steam_price'],
'steam购买价(0.7)': float(itemlist['goods_info']['steam_price_cny']) * 0.7,
'预计收入': yujishouru,
'求购最高价':itemlist['buy_max_price'],
'买卖价差':maimaijiacha,
'buff预览': 'https://buff.163.com/goods/' + str(itemlist['id']),
'收入/投入': shourubi
}
print(itemdata)
return itemdata
4.获取交易量
这里增加了一个功能,获取一个商品的交易量,过滤掉交易量过少的商品
def getbillorder(self,dic):
param = {
'game': 'csgo',
'goods_id': '',
}
param.update({'goods_id':dic['id'],})
res = req.get(url=self.billurl,params=param,headers=self.my_headers).json()
list= res['data']['items']
print(list)
nowtime=self.nowtime.timestamp()
n=0#七日交易量
for i in list:
if nowtime-i['transact_time']<604800:
n=n+1
print('七日交易量:',n)
if n > 6:#设置七日交易量的标准
dic.update({
'七日交易量':n
})
return dic
5.数据写入表格
表格名称是根据日期命名
def makeexl(self,dicdata,titlelist):
csvname='cs2/'+re.sub(r'\D', '', str(self.nowtime.date())) +'.csv'
a = titlelist
if os.path.exists(csvname):
with open(csvname, 'a', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=a)
writer.writerow(dicdata) # 写入每一行数据
else:
with open(csvname, 'a', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=a)
writer.writeheader() # 写入列标题
writer.writerow(dicdata) # 写入每一行数据
将csv文件转换为xls方便排序保存
def transxls(self):
filename = 'cs2/' + re.sub(r'\D', '', str(self.nowtime.date()))
df = pd.read_csv(filename+ '.csv')
# 将DataFrame保存为XLS文件
df.to_excel(filename+'.xlsx', index=False, engine='openpyxl')
os.remove(filename+ '.csv')
6.主程序
def run(self,weaponlist):#检查武器价格比较
param={
'game':'csgo',
'page_size':'9999',
'min_price' : '10',
'max_price' : '100',
}
titlelist=['id', '名称', '英文名', '磨损度', '在售数量', '求购数', 'buff在售最低价格','求购最高价','买卖价差', 'steam价格','steam美元价格', 'buff折现价', 'steam购买价(0.7)', '预计收入','收入/投入','七日交易量','buff预览']
for item in weaponlist:
try:
param.update({'category': item})
itemdata = self.getwrite(param)
n1 = self.getbillorder(itemdata)
time.sleep(1)
if n1:
self.makeexl(n1,titlelist)
time.sleep(random.randint(20, 30))
except Exception as e:
print('获取数据失败',str(e))
print(item+'完成')
self.transxls()
if __name__ == '__main__':
weaponlist = ['weapon_revolver','weapon_bayonet', 'weapon_bizon', 'weapon_sg556', 'weapon_scar20', 'weapon_p250',
'weapon_m4a1', 'weapon_cz75a', 'weapon_aug','weapon_usp_silencer',
'weapon_xm1014', 'weapon_elite','weapon_sawedoff','weapon_nova','weapon_famas', 'weapon_fiveseven', 'weapon_g3sg1', 'weapon_galilar', 'weapon_glock', 'weapon_hkp2000', 'weapon_m249', 'weapon_mac10', 'weapon_mag7',
'weapon_mp5sd', 'weapon_mp7', 'weapon_mp9', 'weapon_negev', 'weapon_ssg08', 'weapon_zeus',
'weapon_tec9', 'weapon_ump45', 'weapon_ak47', 'weapon_m4a1_silencer', 'weapon_awp', 'weapon_deagle','weapon_p90']
list = CS2()
list.run(weaponlist )
总结
以上就是获取目商品价格差值并保存为exl的方法了,今天要讲的内容,本文仅仅简单介绍了代码化了价格的爬取和比较,后续的重构简化还有待继续。
感谢大家的支持,欢迎有兴趣的朋友留言一起交流合作。