Java爬虫jsoup访问CSDN博客

背景

看到CSDN上面的部分博客,写了好几年,访问量依然只有几十,于是想,写个爬虫,模拟人来查看博客,达到访问量增加的目的。

理论知识

CSDN博客的阅读数是如何增加的?

当一篇博客在一台电脑上被访问时,该博客的阅读数+1,但是,在1分钟内连续多次访问,阅读数只加1。

jsoup用法

jsoup可以很方便的用JS的选择器功能,对于了解前端知识的人来说,非常方便查找页面上某个DOM元素。
官网:https://jsoup.org/
测试样式:https://try.jsoup.org/

这里,我举例说明一下我的博客是如何利用jsoup查找的。

例一:查找博客的具体url
Java爬虫jsoup访问CSDN博客_第1张图片

例二:查找阅读数
Java爬虫jsoup访问CSDN博客_第2张图片

写代码

伪代码

//1.遍历每一页,获取每篇博客的url
//2.遍历所有博客,获取博客的阅读量
//3.编译所有博客,访问阅读量低的博客

单线程版

代码地址(可直接运行):https://github.com/wayss000/PracticeCode/blob/master/jsoup-web-page/src/main/java/pers/wayss/crawler/Crawler.java

多线程版

https://github.com/wayss000/PracticeCode/tree/master/jsoup-web-page/src/main/java/pers/wayss/crawler/thread

参考博文

注意: 以下两篇博客的已经不能运行了,原因是CSDN博客部分元素的CSS样式已经发生变化,但这两篇博客的思路非常值得参考和学习。

JAVA爬虫挖取CSDN博客文章(续):https://blog.csdn.net/zhang5476499/article/details/54948348

Java的 jsoup使用之抓取CSDN个人博客内容:https://blog.csdn.net/hzp666/article/details/79098321

一些感想

当多线程版的爬虫完工之后,运行,看着阅读量不断增加,但过了一会便失去了刷阅读量的乐趣了。
但程序从0到1的过程很有趣,想记录一下。

过程一:找现成的代码,尝试直接运行
于是,就有了上面的参考博文。在这个过程中,发现这些博客中的程序已经不能运行了,但是,了解到Java有jsoup这个爬虫工具,算是很有用的收获了。

过程二:学习jsoup的使用,尝试自己写程序
第一次访问jsoup官网(soup.org)的时候,官网报了502错误,很尴尬,以为这个工具是烂尾的项目。好在过了一天官网恢复正常,又发现了(https://try.jsoup.org/ )网站,复习复习CSS选择器,很快便写出了单线程版的代码。

过程三:发现单线程问题
假设现在有篇博客阅读量是100,我需要将它增加到1000,那么需要访问900次,也就是900分钟,也就是整整15小时。但是,若是100多篇的话,那就是15*100/24=62.5(天),这个时间太长了,必须优化。

过程三:线程池控制多线程
想到工作三年,基本没在业务中用过线程池,于是,这里的多线程优化,必须采用线程池。

可是,线程池怎么创建来着?那些参数什么意思来着?
查了查资料,第一版的线程池便完工了,但刚运行就抛RejectedExecutionException异常,检查发现,是线程池参数使用的不合理。

重新调整之后,跑起来了,但是,又抛HTTP 544,推测是CSDN的防刷机制,于是,又设置了每个线程访问CSDN服务器的时候应该是串行。
于是,又引入了信号量来控制,获取到信号量许可的线程,可以访问CSDN,否则等待获取信号量。

过程四:完善日志
程序跑着,但过了一段时间又抛异常,一眼也看不出程序是运行到哪里出的异常,sout打印的日志又太少,于是,又加入了log4j。

总结
感觉整个过程很有趣,一直在发现问题,完善程序的路上,并总有新的收获。

你可能感兴趣的:(Java相关)