CSDN批量关注 python+golang+selenium 逐步分析+源码

408 阅读3分钟
原文链接: t.jinritoutiao.js.cn

最近研究了下selenium,除了模拟鼠标点击,或者input操作外,还发现了个非常神奇的地方,可以执行JS代码。

这简直就像发现新大陆一样!如果能够这样的话,根本不用去考虑什么cookie,加密,认证等等!

于是想做下实验,于是我想到了csdn。。。(希望不要被封账号),通过selenium批量关注好友~~·哈哈哈

1. 首先我们当然是开始分析CSDN关注的时候网络请求是什么

随便找一个陌生人的主页:

打开debug窗口,查看点击“关注”后执行的代码:

CSDN批量关注 python+golang+selenium 逐步分析+源码

debug 模式查看关注按钮

CSDN批量关注 python+golang+selenium 逐步分析+源码

点击执行的js

CSDN批量关注 python+golang+selenium 逐步分析+源码

获得js代码

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

美化后的代码

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

网络抓包

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

post提交关注

也就是如果需要关注某个用户,只需要将username传入data中就行了。那如何批量获得用户名呢?

2. 爬取用户名

csdn的用户名命名规则不统一,有些是昵称,有些是微信号,或者qq

比如:

CSDN批量关注 python+golang+selenium 逐步分析+源码

微信和qq用户名

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

虽然有很多粉丝但是只会render出来12个

继续查看网页源码:

CSDN批量关注 python+golang+selenium 逐步分析+源码

网页源码中a标签

从a标签中能提取出每个用户的主页地址。

接下来的做法就是,从一个用户的主页开始,抓取出关注和粉丝的地址,接下来对这些关注和粉丝的用户递归抓取。就能抓取出源源不断的用户主页。

这一段通过python实现:

爬取url提取出12个粉丝和好友主页:

CSDN批量关注 python+golang+selenium 逐步分析+源码

抓取页面代码

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

主函数

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

最终生成文件

有了用户名,有了需要执行的代码,接下来的事情,就是从文件读取用户名,然后依次去执行。

3. go+selenium模拟执行js

最后到了最激动人心的地方。selenium的webdriver python有支持的库,golang也有,个人感觉go用起来更爽,因为有天生的goroute

用到的库:"github.com/tebeka/selenium"

具体用法可参考GitHub,这里就不介绍了,可以模拟按键在input中输入用户名密码,点击登录按钮。

CSDN批量关注 python+golang+selenium 逐步分析+源码

csdn登录界面

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

CSDN批量关注 python+golang+selenium 逐步分析+源码

main函数,打开selenium, 手动登录

读取用户名:

CSDN批量关注 python+golang+selenium 逐步分析+源码

从文件读取用户名

CSDN批量关注 python+golang+selenium 逐步分析+源码

调用webdriver执行js

最终效果,在浏览器网络窗口能看到:

CSDN批量关注 python+golang+selenium 逐步分析+源码

网络提交

CSDN批量关注 python+golang+selenium 逐步分析+源码

先关注这么多

TODO:

爬取用户可以也用GO实现,不过没有python的BS库用的方便

提交post的地方,可以多创建goroute,速度会快,但是也会容易被限制