编程之路
首发于编程之路
Java爬虫抓取知乎20万用户信息并做简易分析

Java爬虫抓取知乎20万用户信息并做简易分析

前段时间看 @路人甲 分享了一篇爬取知乎用户的文章,心血来潮,想着也该把自己很早写的知乎爬虫完善一下

趁着每天实习回来还有点时间,整理了下思路和原来的代码

因为自己不太爱用框架,所以爬虫中除了用Jsoup解析了下,其他均用纯Java原生实现

然后用我厂良心前端产品Echart进行了简易的展示

不过话说回来,知乎现在真是越来越难爬了,像啥429连接数过多,封本机IP,JS加载页面,这些坑原来都是没有的啊......好在最后都克服了,开心!

这也预示着知乎越来越正规,越来越安全,这不,前两天刚融了1亿刀,可喜可贺

.


国际惯例,附上源码:KKys/ZhiHuSpider


早期爬虫回答地址:利用爬虫技术能做到哪些很酷很有趣很有用的事情? - 姚晟的回答 - 知乎

Echarts展示页面:知乎用户爬虫展示

没事点个赞也是挺好的~

.


记下爬虫学习历程,为这第一篇专栏文章开个好头


1.爬虫思路

如上图所示,爬虫项目维持了一个线程池,从阻塞队列中不停的取用户url,通过阻塞IO获取字节流,再通过Jsoup解析DOM结构,然后分析DOM结构,获取用户信息,存入数据库中



2.重点分析

  • 线程池数量过多会出现Connection reset与Connection shutdown异常,爬虫设定核心池数为10
  • 每次解析url地址时,自动设置动态IP代理,否则会报429连接数量过多异常
  • 开了一个监听线程,当爬虫线程池中线程出现异常中断时,新开线程加入线程池中,保证线程池数量稳定在10个
  • 去重策略运用Bloom Filter算法,提供稳定的去重服务,内存消耗较少
  • 根据关注的人进行url抽取,爬取高质量用户数据
  • 仅爬取了关注的人第一页的用户放入阻塞队列,因有的用户关注数过多,递归放入怕出现内存、队列异常
  • 爬取过程持续两天一夜,分了4,5次爬取,没有进行中断异常处理,可能会略有有重复数据,速度也有待提升
  • Jsoup解析网页比较简单,在这里就不再赘述


3.数据展示

  • 我把自己的首页作为初始页,爬取的20万信息如下
  • 爬取过程日志如下

4.简易分析

本分析只针对爬取的20万数据,不具有代表性

欢迎通过以下地址查看Echarts展示结果,自带一些简易的交互功能

Echarts展示地址:知乎用户爬虫展示



展示结果如下:


  • 知乎用户性别情况


  • 知乎用户行业分布(未填写行业者除外)

  • 知乎用户公司分布排名

  • 知乎用户受教育程度排名

不查不知道一查吓一跳,不是清北根本不敢往上写.......



  • 知乎用户回答数排行

可以看到 @Phil 和轮子哥 @vczh 贡献了最多的答案,也多亏了轮子哥夜以继日的回答,才能使我辈领略到知乎的乐趣



  • 知乎用户被赞数排行

@张佳玮 张公子当之无愧的第一....@肥肥猫 、大师兄@朱炫 紧随其后



  • 知乎用户被感谢数排行

  • 知乎用户关注数排行

拔叔@Hannibal Lecter@谈无语@黄继新 领跑关注榜




  • 知乎用户粉丝数排行

张公子继续第一....



5.总结

  • 没有做中断异常处理,再次开启爬虫得重新去重,可以进一步改进
  • 围绕并发连接数、开启线程数、解析网页速度几方面可以进一步提升爬虫速度
  • 写下这篇文章记录近期学习的知识点,为秋招做准备
  • 源码地址:KKys/ZhiHuSpider,求个star
编辑于 2017-01-23

文章被以下专栏收录