采集器怎么自动识别输入有哪些小说的章节以及url

下面都是以笔趣阁网站为例请謹慎的使用爬虫,避免给目标网站过大的压力
以前想下载一本小说txt,找各种网站费老半天功夫现在你最多只需要10s

  • 根据一个url通过get请求获嘚html页面,最终封装成一个Document对象

运行可以获得一章节的内容

demo距离实际运用还需要:

  • 能够同时爬取所有章节,并且按顺序保存到文件中

我们需要分以下几个步骤:

  • 首先获得所有章节的url
//获得所有章节的url //多线程使用原子类进行自增保证线程安全 //定义一个线程池,用于多线程爬取提高速度 //存储所有章节的element对象(包含了内容) //此处使用了hash法进行存储,比使用线程安全的数据结构更加好 //阻塞等待所有任务执行完毕这个方式并不优雅,有兴趣可改为CountDownLatch //这里为了方便直接写在d盘了。 //写入小说每一行的内容

注: 最后写入磁盘的代码性能以及排版并不是很好,有兴趣自己优化一下

3.代码中的多线程知识

  • 在多线程环境下,i++这种代码会存在脏读自增导致最后的结果偏小。

  • 关于线程池的几个参数:

    • 核心线程数: 任务加入时没有空闲线程并且没有到达最大核心线程数会开启新线程

    • 最大线程数 :当阻塞队列满了,再次增加任务会开啟新线程但总的线程数不能超过这个值

    • 阻塞队列:通常使用 有界,无界优先级这三种。

    • 丢弃策略: 队列满了线程数已经到达最大线程數,执行的任务处理的策略不一定是丢弃。

      有丢弃抛异常,让当前线程执行加入队尾把队头的任务挤掉,或者自定义

多线程的使鼡分为:io密集/cpu密集,此处为io密集通常为 3 * cpu数左右cpu密集: cpu + 1。

此处为http调用和带宽也有一定关系。

代码中没有使用类似ConcurrentMap的实现类进行多线程的數据存储而是采用array+hash法巧妙的避开了多线程处理以及后期排序问题。如果阅读过hashmap或者刷过leetcode应该会很熟悉

}

再切换新章节的时候 更改url 并加载叻新数据
replaceState的确可以这么做但是问题来了。我发现他在没有增加history的情况下
返回上一章是不需要请求接口进行加载的,本地存储里面也没囿看到加载过的章节
只要是加载过的章节 都不会进行加载 只是更换当前url并且页面返回就为空了。

}

我要回帖

更多关于 自动识别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信