走路草,白天沉睡,夜晚潜行,我来过,并将信息镌刻在深深的记忆里。
To crawl csgo skin from buff.163.com
.
If there is no data available, crawl from the website, then analyse data from local pandas DataFrame to avoid more crawling behavior.
First Rule: BE GOOD AND TRY TO FOLLOW A WEBSITE’S CRAWLING POLICIES. Don't crawl the website with a high frequency!
该爬虫只是为了买个性价比最高的饰品卖到steam里换个买游戏钱,所以本质上不会被经常使用,也不需要爬取太多数据。
总体原则是“缓慢”地获取“少量”数据。这里有一些建议,通过修改配置config.ini
,能帮助你更合理地使用oddish:
frequency_interval_low
和frequency_interval_high
,爬取时间间隔越长,爬得越慢,越安全;category_white_list
限定爬取饰品的类别,类别越少,要爬的数据量越小;category_black_list
限定爬取饰品的类别,类别越多,要爬的数据量越小;crawl_min_price_item
和crawl_max_price_item
缩小要爬去饰品的价格区间,区间越小,要爬的数据量越小;最直白的方式,就是再跟着视频一步步来:oddish纯小白使用教程
从v4.0.0版本开始,从steam获取数据时,换成了aio(async io),速度极大提升,基本上一分钟以内就能搞定了。 相应的,要装的aio相关依赖也多了一些。
如果实在搞不定,建议下载v4.0.0之前的版本。用起来稍微简单点儿,缺点就是非常慢。和v4.0.0相比,二者大概就是一分钟和一小时的差距吧。
但个人还是建议先尝试一下v4.0.0+版本,毕竟速度快了不是一星半点儿。
这里还有两篇文章介绍了oddish初期构建和优化思路,如果你想看的话:
警告:由于现在buff有反爬机制,爬的过频繁会账号冷却。目前程序配置的是4-8s爬取一次。可自行在配置文件config.ini
里配置间隔时间,但为了您的账号安全,程序无论如何都不会以小于4s的间隔爬数据。
如果还不放心,建议时间间隔再调大一些。当然,调的越大,爬得越慢。所以建议同时使用配置里的黑白名单缩小饰品爬取范围, 减少没必要的爬取。
当首次爬取某url时,会从网站爬取数据,保存到本地。之后再次爬取时,默认先检测本地文件,如果有,直接从本地加载。
url对应内容的缓存时间可在配置里自行设置,可配置是否强制从网站上爬取。
总体来讲,缓存时间设置的越长,信息越不是最新的,失效可能性越大。反之,越能获取最新信息,但爬取的工作量越大,需要时间更久。
buff提供完用户名密码之后还要使用网易易盾验证登录,挺烦的。所以目前简单起见,直接使用已登录的cookies进行访问。
你可以在界面内登陆获取cookies,也可以手工把cookie贴到config/config.ini
里,使用该cookie运行。
建议使用Chrome登录buff,手工查看cookie(可自行百度方法),贴到配置里,粘贴后配置示例如下:
[BASIC]
buff_cookie = _ntes_nnid=b14d347a6d72cfffffffffa5cdbb99a7,1571493626117; _ntes_nuid=b14d347a6d72c258095b57a5cdbb99a7; ...
steam_cookie = timezoneOffset=28800,0; steamMachineAuth76561198093333055=649A9B56941EC90A07EEEEEE0A907688C5D6042; ...
并不能找到国内的质量比较高的合(免)适(费)的代理服务器。如果不能裸访问steam商店,需要本地开启代理(或者vpn),
同时需要在config/config.ini
中提供一个socks
代理配置(即ss或v2ray的本地端口),以科学爬取社区市场数据。
如果不需要代理即可直连steam商店,将配置文件中的 proxy
留空即可。
你也可以使用网易UU加速器,只需使用模式一、二或三加速Steam社区/商店,并将配置文件中的proxy
留空。
完成配置后, 工程根目录下运行:python -m src
或下载release版本直接运行。
如果需要使用旧式命令行窗口,可以传入--console
或者在配置中设置console=True
如果不关心过程,只查看分析结果即可。
以源代码的方式运行需要安装必需的依赖。
如果只会使用Anaconda人肉安装,就安装以下依赖:
由于aiohttp-socks没有移植到Anaconda,所以只能使用pip安装。点击Anaconda界面首页的'CMD.exe Promt'下面的Launch按钮,
会打开一个命令行,输入pip install aiosocks
即可安装。
使用pip可直接执行以下命令安装:
pip install -r requirements.txt
修改config/config.ini
中的一些参数,进行自己希望的自定义配置。所有配置的含义见文件中的注释,或者wiki介绍。
价格区间设定在2.0.0版本中是一个非常重要的优化。
之前的价格筛选方式为:爬取所有饰品,按照价格区间进行筛选。优化之后,先使用buff对价格进行筛选,然后爬去筛选后的物品。 这样做之后爬取数据量骤减,效率极大提升。
价格区间配置为config/config.ini
的crawl_min_price_item
和crawl_max_price_item
,有以下限定:
比如区间设定为5~1
元,则会被系统调整为5~5
元,即只爬取5元饰品。
但是不得不说buff的区间筛选API很是清奇,限定价格之后,返回的
page_num
和page_size
竟然都是错的。也就是说返回的数据并不能告诉我们在这个价格区间内 一共有多少页共计多少饰品。然鹅机智的我发现,如果将page number设定为超出实际页数的值,这两个数据就会变成正确值。比如,价格在98~99.9的饰品共计3页42件,但是返回值告诉我们一共有720页14388件,而这实际是buff现售物品总数,并不是价格筛选后的件数。 想获取准确值3页42件,只需给page number设定为超出3的值即可,所以我用了sys.maxsize
,一个巨大无比的值。只有trick能击败trick,然后让代码变得更加tricky :D
增设类别限定,可以配置自己只想爬取的类别(白名单)或者不想爬取(黑名单)的类别。
白名单优先级高于黑名单优先级。
高级技巧(小白慎入):黑白名单均支持通配符匹配,如 weapon_knife* 等,更多用法请搜索 "Shell 通配符"。
所以规则如下:
config/reference/category.md
;比如:
category_white_list = ["weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer"]
category_black_list = ["weapon_m4a1"]
则最终会爬取AK、M4A1、M4A4三种物品。
NOTE: M4A1游戏代号为"weapon_m4a1_silencer"、M4A4游戏代号为"weapon_m4a1"。 不要问为什么,我猜是V社员工一开始起名的时候没想好,后来由于兼容性等原因不好改了。那咋办嘛,就这么用着呗。
类别名称一定不能写错了(建议复制粘贴),否则buff直接返回所有类别的物品……什么鬼设定……
最终我发现,这种方法未必比充值卡更优惠,但绝对更安全、快速。再也不用:
额外好处是,充值卡只能买固定面值的,这种却可以根据需要的余额数,买任意价位的饰品转余额。
而且程序给出的收益是使用steam售价的.25分位点的价格计算的,偏保守,所以实际收益一般会更多。
一个示例:
想要对oddish做出力所能及的贡献?请参考CONTRIBUTING.md。