我是笔者:实时抓取同花顺概念时遇到的问题及解决
优采云 发布时间: 2022-06-28 16:27我是笔者:实时抓取同花顺概念时遇到的问题及解决
同花顺为每个个股标注的概念是十分受市场关注的信息。新增概念往往受到市场追捧。受朋友之托,笔者尝试编写程序实现实时刷新和提示同花顺概念。过程中遇到一处困难,特此撰文以记录。
第一种思路
每一个概念都是标注在个股上的,因此遍历个股就可以得到概念变动的情况。如图所示,同花顺的F10页面包含每支个股的所有概念的信息。实时爬取每只股票的F10页面并汇总成总体变化,这是笔者首先想到的思路。
F10页面
遇到的困难
思路很简单,但在爬取页面时遇到了困难。调出控制台查看网页的头文件,很容易可以发现,cookie字段下的“v”值是一串变动的加密字符,随着网页刷新而变化。为避免被系统识别,这个问题必须要解决。通过selenium调用浏览器可以绕过问题,但是速度又慢又占用系统资源,不适合实时程序。因此,找到构造密文的方法是唯一出路。
动态“v值”
Hook出目标文件
注意到,“v”只是一个很普通的字母,几乎没有特征,直接搜索很难定位到生成密文的js文件。因此,选择采用Hook的方式定位文档。在TamperMonkey中编写如下图所示的js自执行函数即可在网页生成“v”值时打上断点。打上断点后,进一步观察历史调用栈可以发现,所使用到的都是一个以“chameleon”(变色龙,哈哈)开头的文件。可以肯定,生成“v”值的方法就在这个“变色龙”文件里。
Hook方法
历史调用
解决问题
找到了文件,只需要将方法本地化即可。通过跟栈,很容易能够找到生成“v”值的具体函数。可以看到,函数中调用了其他一些参数以及方法——鼠标点击位置,诸如此类。逐个还原这些方法和参数费时费力。笔者将整个“变色龙”文件下载到本地,并在密文生成处封装了一个函数以直接获取“v”值。在python中使用execjs打开js文件,直接调用封装函数“v”,就可以得到所需的密文。
“v”值的生成函数
简单封装
后续
通过上述过程,笔者成功解决了页面爬取时,cookie变动的问题。
然而,在后续的实践中,笔者发现,得到“v”值并不能完全避免同花顺系统检测。过快地刷新仍然会导致ip被封的情况出现。如何彻底解决这个问题还需要另辟蹊径,用别的思路实现程序。当然这就是另一个故事了,不是本篇讨论的内容。