下面都是以笔趣阁网站为例请謹慎的使用爬虫,避免给目标网站过大的压力
以前想下载一本小说txt,找各种网站费老半天功夫现在你最多只需要10s
- 根据一个url通过get请求获嘚html页面,最终封装成一个Document对象
运行可以获得一章节的内容
demo距离实际运用还需要:
- 能够同时爬取所有章节,并且按顺序保存到文件中
我们需要分以下几个步骤:
- 首先获得所有章节的url
注: 最后写入磁盘的代码性能以及排版并不是很好,有兴趣自己优化一下
3.代码中的多线程知识
-
在多线程环境下,i++这种代码会存在脏读自增导致最后的结果偏小。
-
关于线程池的几个参数:
-
核心线程数: 任务加入时没有空闲线程并且没有到达最大核心线程数会开启新线程
-
最大线程数 :当阻塞队列满了,再次增加任务会开啟新线程但总的线程数不能超过这个值
-
阻塞队列:通常使用 有界,无界优先级这三种。
-
丢弃策略: 队列满了线程数已经到达最大线程數,执行的任务处理的策略不一定是丢弃。
有丢弃抛异常,让当前线程执行加入队尾把队头的任务挤掉,或者自定义
-
多线程的使鼡分为:io密集/cpu密集,此处为io密集通常为 3 * cpu数左右cpu密集: cpu + 1。
此处为http调用和带宽也有一定关系。
代码中没有使用类似ConcurrentMap的实现类进行多线程的數据存储而是采用array+hash法巧妙的避开了多线程处理以及后期排序问题。如果阅读过hashmap或者刷过leetcode应该会很熟悉