基于python开发BUFF市场CS饰品交易工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

祝大家发大财!

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的方法了,今天要讲的内容,本文仅仅简单介绍了代码化了价格的爬取和比较,后续的重构简化还有待继续。

感谢大家的支持,欢迎有兴趣的朋友留言一起交流合作。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值