一个关于爬虫的抢购软件优化问题

2018-12-01 17:19:47 +08:00
 wc110302

整体的抢购逻辑流程如下:

1.使用 selenium 模拟登陆拿到账号的 cookie 信息并保存

2.获取目标抢购角色的网页链接以及价格(发送生单请求时需要这两个参数)

3.完成生单之后进行支付,即发送支付请求

4.在进行支付请求时,需要拿到订单号,然而这里涉及到两个重定向,于是使用 allow_redirects=false,获取到正常的 cookie 进行下一步操作

5.在支付页面,需要发送支付请求,即输入密码后发送 post 请求,这里涉及到 md5+aes 加密,这里略过,js 是已经趴下来使用 pyexesjs 模拟,公钥是直接贴在支付页面的静态 html 里的,每次支付都会变化,所以已经没有步骤可以省略了

然后整个流程,在本机跑下来,大概是 1.8S ,其中生单 0.4S ,在浙江的服务器上,因为目标网站是搭在浙江的,ping 值理论是最小的,能够达到 1.0-1.3S 。但是这个速度根本无法抢购到目标角色,因为某宝已经能达到控制在 1S 以内,具体是多少 ms 不清楚。如下图

https://i.imgur.com/BTiutdQ.png

而我现在只能达到 1S+的速度 当然应该就是抢不到 虽然能够扣款成功 但是都会被退回

https://i.imgur.com/dms91fC.png

现在也不知道能有什么好的办法能够优化一下 加快速度了 确实也仔细看了 抓包下来 每个请求都仔细分析过 已经是没有可以省略的步骤了 但是为啥还是干不过某宝的那些人了 确实是很奇怪

6395 次点击
所在节点    Python
37 条回复
fenghuang
2018-12-01 17:26:13 +08:00
抢购的时候快就行了,难道支付也需要很快?
wc110302
2018-12-01 17:31:53 +08:00
@fenghuang 然鹅这个网站的规则是先付款的才可以抢购成功,生单成功之后只是为了拿到支付链接的 url,实际还是得看最终支付时间,我感觉和某宝差的也只是毫秒级上的,但是每次都干不过,都会在成功付款之后退回。
snal123
2018-12-01 17:37:10 +08:00
pyexecjs 其实挺慢的 这里优化空间挺大的
wc110302
2018-12-01 17:46:54 +08:00
@snal123 我这里使用的是 pyexecjs+node.js 来模拟生成加密后的密码报文的,由于加密数据是由 CryptoJS 加密的,重构成其他语言的代码不太现实 请问一下有什么好的方法推荐吗
locoz
2018-12-01 20:31:37 +08:00
直接拿 nodejs 写?
zy8595208
2018-12-01 20:45:31 +08:00
抢购什么的,这么变态,还有看付款时间的
Pionxzh
2018-12-01 21:35:41 +08:00
这都抢不到? 也太变态了点
csx163
2018-12-01 21:39:33 +08:00
可能淘宝的那些都用 c 吧,或者你试试 go
一般的加密 PyCrypto 都可以解决,试试看
crab
2018-12-01 21:48:52 +08:00
1 秒内的差距就是运气。多买几台不同节点的服务器。
whoami9894
2018-12-02 10:42:26 +08:00
selenium 实例化一个浏览器这么快吗 我电脑上都是 5s+
fenghuang
2018-12-02 10:50:14 +08:00
@wc110302 这种速度估计 python 就不行了
AX5N
2018-12-02 13:46:18 +08:00
这种脚本一般是在家还是在服务器上跑的,会不会是家庭宽带延迟比较大。
zr8657
2018-12-02 14:11:01 +08:00
@whoami9894 我的和你差不多速度,3-5S 吧
ospider
2018-12-02 19:12:41 +08:00
换 pyppeteer 吧
wc110302
2018-12-02 22:59:15 +08:00
@locoz 是用 pyexecjs 来加载目标网站的 js 实现对密码的加密
wc110302
2018-12-02 23:00:15 +08:00
@csx163 刚刚进行了测试 实际上完成密码加密那一步用了 150ms 不知道如果使用其他方式会不会更快一点
wc110302
2018-12-02 23:03:00 +08:00
@crab
@AX5N
经过 http://ping.chinaz.com/ 测试 目标网站在浙江节点下延迟最低 1-5ms 所以在进行抢购的时候买了一台杭州的 windows server 2008 顶配 按理说应该是延迟最低的情况下了
wc110302
2018-12-02 23:04:43 +08:00
@whoami9894
@zr8657
用 selenium 模拟登录只是为了拿 cookie,在抢购的时候提前几分钟拿到就行了,如果每次抢购都还去登录的话,耗时就更长了
wc110302
2018-12-02 23:06:06 +08:00
@fenghuang 其实也怀疑过是语言的原因 但是 C 的话自己也写不出来--! 也许用 C 写的话能够提升一部分时间吧
wc110302
2018-12-02 23:07:48 +08:00
@ospider 这个模块还没用过 速度相较于 requests 会更快一点吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513354

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX