最近研究了下selenium,除了模拟鼠标点击,或者input操作外,还发现了个非常神奇的地方,可以执行JS代码。
这简直就像发现新大陆一样!如果能够这样的话,根本不用去考虑什么cookie,加密,认证等等!
于是想做下实验,于是我想到了csdn。。。(希望不要被封账号),通过selenium批量关注好友~~·哈哈哈
1. 首先我们当然是开始分析CSDN关注的时候网络请求是什么
随便找一个陌生人的主页:
打开debug窗口,查看点击“关注”后执行的代码:

debug 模式查看关注按钮

点击执行的js

获得js代码
格式之后,发现了如下代码。

美化后的代码
可以看出是通过ajax发送post请求,然后结合下network抓包的数据:

网络抓包
就能分析出来需要执行的简化版js代码如下:

post提交关注
也就是如果需要关注某个用户,只需要将username传入data中就行了。那如何批量获得用户名呢?
2. 爬取用户名
csdn的用户名命名规则不统一,有些是昵称,有些是微信号,或者qq
比如:

微信和qq用户名
并不是id递增这么简单。最后发现,每个人的主页都会展示粉丝和关注,一共12个人。

虽然有很多粉丝但是只会render出来12个
继续查看网页源码:

网页源码中a标签
从a标签中能提取出每个用户的主页地址。
接下来的做法就是,从一个用户的主页开始,抓取出关注和粉丝的地址,接下来对这些关注和粉丝的用户递归抓取。就能抓取出源源不断的用户主页。
这一段通过python实现:
爬取url提取出12个粉丝和好友主页:

抓取页面代码
主函数中,通过HistoryUsers进行去重,如果抓取过就不再抓取:

主函数
最终会在csdn文件夹中生成多个文件,每个文件中有100个username。只抓取了600多个,没必要一直跑下去,没测试抓太多CSDN会不会有限制措施。

最终生成文件
有了用户名,有了需要执行的代码,接下来的事情,就是从文件读取用户名,然后依次去执行。
3. go+selenium模拟执行js
最后到了最激动人心的地方。selenium的webdriver python有支持的库,golang也有,个人感觉go用起来更爽,因为有天生的goroute
用到的库:"github.com/tebeka/selenium"
具体用法可参考GitHub,这里就不介绍了,可以模拟按键在input中输入用户名密码,点击登录按钮。

csdn登录界面
我设置的手动登录,登录成功后,按下回车,让程序往下跑:

main函数,打开selenium, 手动登录
读取用户名:

从文件读取用户名

调用webdriver执行js
最终效果,在浏览器网络窗口能看到:

网络提交

先关注这么多
TODO:
爬取用户可以也用GO实现,不过没有python的BS库用的方便
提交post的地方,可以多创建goroute,速度会快,但是也会容易被限制