使用JSOUP爬取国家统计局的地理位置数据

最近因工作需要,我需要爬取国家统计局的最新统计数据。因此参照网上的例子使用JSOUP爬取了国家统计局的省、市、县、镇、村的数据。因为要爬取的数据较多,因此在里面使用了多线程的相关技术。下面首先讲解下多线程相关的东西。


首先理解下什么是线程池?
因为创建和销毁线程是一件非常耗费时间的工作,因此,如果线程可以再一定程度上复用,那么肯定可以再节省不少的时间。线程池的作用可以类比MYSQL中的连接池理解。
参考文章:Java常用四大线程池用法以及ThreadPoolExecutor详解


其次是多线程中的Future模式。
因为爬取的省份较多,因此需要多个线程并发执行,但是必须保证在IO操作的写操作执行前,所有的数据都已经爬取完毕。因此,必须使用多线程的Future模式,Future模式可以保证多个线程并发执行,并且可以通过future.get()方法在适当的地方进行线程堵塞,保证在结果输出前各个子线程已经执行结束。因为在调用到某个子线程的future.get()方法之前,各个子线程会继续并发执行,因此,调用future.get()方法阻塞主线程消耗的时间会非常的少,因此可以再一定的程度上节省时间开销。

        /**
         * 等待所有的子线程执行完毕
         */
        for (Future future : futureList) {
            future.get();
        }

Future模式的参考文章:Java多线程 - Future模式


最后讲述下说说Runnable与Callable的区别:
二者的实际异同为以下几点:
相同点:
1、 两者都是接口;(废话)
2、两者都可用来编写多线程程序;
3、两者都需要调用Thread.start()启动线程;
不同点:
1、两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果;
2、Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛;
注意点:
Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!

参考文章:说说Runnable与Callable


下面是使用Jsoup爬取国家统计局数据的具体代码:
这里写图片描述

源码:Jsoup爬取国家统计局的数据


Previous
使用XShell部署SpringBoot的jar文件到Linux服务器上 使用XShell部署SpringBoot的jar文件到Linux服务器上
最近师傅教我了通过jenkins发布项目,但是发现公司的Maven出了点问题,因此就用XShell进行项目的发布操作。发布的步骤如下: 在eclipse中通过Maven命令Clean–>Install生成jar文件;clean:清楚
2018-12-04 Pursue
Next
使用Jenkins配置Git+Maven的自动化构建 使用Jenkins配置Git+Maven的自动化构建
最近安装Jenkins,参照网上的各种资料进行尝试,折腾了好久,但是查找了这么多资料,相似度在90%以上!!!,相同的安装过程,测试了几台机器,未曾成功,不得不感慨自己能力有限,最终慢慢摸索,形成思路,现分享给大家,希望大家在安装的时候少
2018-12-04 Pursue