爬取国家统计局城乡数据

  • 1 准备工作
    •  1.1 使用的jar包:
    •  1.2 思路
    •  1.3 准备数据库表
    •  1.4 准备model类
    •  1.5 mybatis批插入
  • 2 初始化工作
    •  2.1 初始化配置信息
    •  2.2 初始化Http
    •  2.3 发送http请求,获取数据
    •  2.4 BaseRegionDetailModel配置文件

  项目需求,,国家省市区名称代码,网上找了一圈2020年的都不是免费的,后来就自己做了个爬虫,因为自己本身做的时JAVA 开发,平常也没学过python,所以只能使用Java做一个爬虫,爬国家统计局的2020年城乡统计,爬到了村居委会一级共67w条数据
day02: https://blog.csdn.net/weixin_43638187/article/details/110220928
源码及2020年数据 : https://github.com/zhouqiang0821/smallTools
数据是在:<static/sql/base_region.sql>

1 准备工作

 1.1 使用的jar包:

  发送http请求使用的okhttps;

  解析数据用的jsoup;

  数据库操作使用的mybatis(数据量比较大,可以使用批插入);

  commons-lang3 使用了一些其他工具类,如StringUtils,ObjectUtils等;

            <dependency><groupId>com.ejlchina</groupId><artifactId>okhttps</artifactId><version>2.4.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version></dependency>

 1.2 思路

  因为自己是穷屌丝,本身准备找几个代理Ip的网站注册几个,白嫖点Ip,把数据爬一下,注册了个账号,有人给我打电话说先给我个套餐试一下,后来发现我没有业务,直接把我账号给删了…
  没办法只能想别的办法了,我有个自己的云服务器,下下策让程序爬一会儿歇一会儿,后来就是爬完一个市的数据歇30s( TimeUnit.SECONDS.sleep()),爬完一个县的数据歇15s,程序一下没挂,干了一天一夜多吧,把数据给全部爬了下来.

  硬是用时间怼出条路来,接下来就是代码和数据了.代码有点渣,看看就好,爬下来的数据在最后边

 1.3 准备数据库表

数据库样式

DDL语句

CREATE TABLE `base_region_detail` (`region_code` varchar(255) NOT NULL COMMENT '区域代码',`region_name` varchar(255) DEFAULT NULL COMMENT '区域名称',`pid` varchar(255) DEFAULT NULL COMMENT '父级区域代码',`type` varchar(255) DEFAULT NULL COMMENT '0 省级/1  市级/2  区、县/3  乡镇、街道办/其他 村、社区111 主城区、112 城乡结合区、121 镇中心区、122 镇乡结合区、123 特殊区域、210 乡中心区、220 村庄',PRIMARY KEY (`region_code`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 1.4 准备model类

    package com.zq.smallTool.model;import lombok.Data;/*** @program: admin* @description: 区划代码和城乡划分代码* @author: zhouQ* @create: 2020-11-19 09:18**/@Datapublic class BaseRegionDetailModel {/**** 区域代码*/private String regionCode;/**** 区域名称*/private String regionName;/**** 父级区域代码*/private String pid;/**** 区域类型*/private String type;}

 1.5 mybatis批插入

  应为数据有点多,将结果保存至List中分批插入,所以使用的mybatis的批插入

        <insert id="insert" parameterType="List">insert intobase_region_detail(region_code, region_name, pid, type) values<foreach collection="list" item="detail" index="index" separator=",">(#{detail.regionCode,jdbcType=VARCHAR},#{detail.regionName,jdbcType=VARCHAR},#{detail.pid,jdbcType=VARCHAR},#{detail.type,jdbcType=VARCHAR})</foreach></insert>

2 初始化工作

 2.1 初始化配置信息

  spiderPropertyModel是一个配置类,定义了一些配置信息,如是否开启Ip代理,sleep的时间等**(一开始向做的比较高级点,后来也没去优化代码,凑合能用)**

    package com.zq.smallTool.property;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/*** @program: admin* @description: 关于 爬虫的配置文件* @author: zhouQ* @create: 2020-11-19 08:36**/@Data@Component@ConfigurationProperties(prefix = "spider")public class SpiderPropertyModel {/**** 爬取年份数据*/private String spiderYear = "2020";/**** 是否开启动态IP代理*/private Boolean proxyEnable = false;/**** 设置ip代理后ip.txt地址*/private String ipLocation = "111";/**** 是否开启 市级睡眠*/private Boolean isCitySleep = true;/**** 市级睡眠默认时间  s级*/private Integer citySleepTime = 30;/**** 是否开启 区、县 级睡眠*/private Boolean isCountySleep = false;/**** 区、县 级睡眠默认时间 s级*/private Integer countySleepTime = 30;/**** 是否获取乡镇、街道信息*/private Boolean getTowntr = false;/**** 是否获取村、社区信息*/private Boolean getVillagetr = false;}

 2.2 初始化Http

  首先就是主备一个http工具类,发送请求获取数据,然后才是解析,这里使用的是okhttp,已经做好了封装,直接导包使用就好了
  因为要多次发送,因此提了出来,只有当IP被封了,才会重新使用代理Ip构建一个Http客户端

        private static HTTP http = null;/**** 初始化 http* @Param isChange 是否发需要切换代理Ip* @return*/private void initHttpClint() {http = HTTP.builder().config(new HTTP.OkConfig() {@Overridepublic void config(OkHttpClient.Builder builder) {// 配置连接池 最小10个连接(不配置默认为 5)builder.connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES));// 配置连接超时时间(默认10秒)builder.connectTimeout(1000, TimeUnit.SECONDS);// 配置 WebSocket 心跳间隔(默认没有心跳)builder.pingInterval(60, TimeUnit.SECONDS);// 配置拦截器builder.addInterceptor((Interceptor.Chain chain) -> {Request request = chain.request();// 必须同步返回,拦截器内无法执行异步操作return chain.proceed(request);});// 其它配置: CookieJar、SSL、缓存、代理、事件监听...// 是否需要开启动态代理Ipif (spiderPropertyModel.getProxyEnable()) {// 从ipLocation 中获取 ipListgetProxy(spiderPropertyModel.getIpLocation());Map<String, Object> proxy = proxyList.get(new Random().nextInt(proxyList.size()));String ip = proxy.get("ip").toString();System.out.println("--------代理Ip------------" + ip);int port = Integer.parseInt(proxy.get("port").toString());System.out.println("----------端口------------" + port);builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ip, port)));}}}).baseUrl("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/" + spiderPropertyModel.getSpiderYear() + "/").build();}

 2.3 发送http请求,获取数据

       /**** 发送http请求* @param childHref 访问得子页面* @return*/private String toGet(String childHref) {BufferedReader in = null;String ret = "";HttpResult httpResult = null;// GET请求try {httpResult = http.sync(childHref).get();if (httpResult.isSuccessful()) {try {in = new BufferedReader(new InputStreamReader(httpResult.getBody().toByteStream(), "GB2312"));String line = "";while ((line = in.readLine()) != null) {ret += line;}if (StringUtils.isBlank(ret)) {System.out.println("-----获取到得ret == '' ----");initHttpClint();toGet(childHref);}} catch (IOException e) {in.close();}}} catch (Exception e) {// e.printStackTrace();System.out.println("-----连接超时,请求切换代理IP----");initHttpClint();toGet(childHref);}return ret;}

 2.4 BaseRegionDetailModel配置文件

    spider:spider-year: 2020 # 爬取年份的数据proxy-enable: false  # 是否开启动态代理ip-location: 222     #开启的话需要ip地址的存放位置is-city-sleep: true #是否开启市级睡眠city-sleep-time: 30   #开启市级睡眠 的睡眠时间 sis-county-sleep: true #是否开启区 县睡眠county-sleep-time: 15  #开启县级睡眠 的睡眠时间 sget-villagetr: false # 是否获取村、社区信息get-towntr: false # 是否获取乡镇、街道信息

DAY01.使用JAVA从国家统计局爬取2020年全国统计用区划代码和城乡划分代码(省市区数据)相关推荐

  1. Python爬虫练习五:爬取 2017年统计用区划代码和城乡划分代码(附代码与全部数据)

    本文仅供学习,需要数据的文末有链接下载,请不要重复爬取. 最近工作中,因为统计用区划代码和城乡划分代码更新了最新的2017版,需要爬取最新的数据.于是乎,本次花了一定精力,将整个2017版数据完完整整 ...

  2. 城市筛选数据(根据2020年度全国统计用区划代码和城乡划分代码更新维护的标准)

    根据2020年度全国统计用区划代码和城乡划分代码更新维护的标准,整理的城市联动筛选数据: /* 根据2020年度全国统计用区划代码和城乡划分代码更新维护的标准 */ var cityList = [{ ...

  3. Java 爬取国家统计局统计用区划代码和城乡划分代码

    插入速度比较慢,建议修改成批量插入. 用的 Spring Boot2.MyBatis Plus(Jdbc 都行,随便你).Junit5.okhttp.jsoup.dozer(你可以手动赋值,没几个属性 ...

  4. java爬虫京东商品,Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

    1.需求及配置 需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格. 使用maven项目,log4j记录日志,日志仅导出到控制台. maven依赖如下 ...

  5. java 爬取评论,Java基于WebMagic爬取某豆瓣电影评论的实现

    目的 搭建爬虫平台,爬取某豆瓣电影的评论信息. 准备 webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发.webmagic的核心非常简单,但是覆盖 ...

  6. 携程酒店数据爬取2020.5

    携程酒店数据爬取2020.5 1. 开题 目前网上有好多爬取携程网站的教程,大多数通过xpath,beautifulsoup,正则来解析网页的源代码.然后我这个菜b贪方便,直接copy源码的xpath ...

  7. 用java从网上爬取大部头小说

     用java从网上爬取大部头小说 最近,我从网上看到零点看书(www.00ksw.com)网站分章连载了网络作家写的<大主宰>这部玄幻小说.截至目前,这部小说的最新章节已写到第一千三百 ...

  8. 用Java做爬虫爬取王者荣耀的英雄头像

    大家好,今天我和大家分享一下用Java做爬虫爬取王者荣耀的英雄头像. 首先我们需要王者荣耀的网址,然后获取连接,通过IO读取网页的源代码,用正则表达式筛选我们需要的代码,在每个筛选对象(图片的地址)前 ...

  9. Java天猫商品价格爬取

    Java天猫商品价格爬取 现在各大电商平台都有反扒系统,天猫是对复杂的,不仅要找到js还要设置header,而且链接还长!这么长的代码有用的就两个,一个id,一个skuid 代码实现 <depe ...

  10. 爬取2020东京奥运会的所有赛事的情况,并分类输出,使用Python实现

    在爬取2020年东京奥运会的赛事情况并分类输出时,你可以使用 Python 语言实现. 首先,你需要找到一个可以爬取这些信息的网站或数据源.你可以使用 Python 的第三方库 BeautifulSo ...

最新文章

  1. serch安装2012 windows_随身携带电脑系统 U盘系统工具WinToGo系统安装到U盘
  2. oracle增加数据时报没安装java_在linux上安装Oracle Developer Tools for VS Code
  3. HBase参数配置及说明
  4. Windows Embedded Compact 7新特性
  5. 3399 mysql_MySQL索引
  6. Java的Map接口,以及Collection和Collections的区别
  7. SQL Server 2008 BIDS组件的安装
  8. 从功能层次,阐述CPU、接口和外设之间的交互
  9. Idea / Eclipse中使用Lombok
  10. 外贸业务员会计算机知识,外贸业务员、电子商务
  11. ❤️腾讯面试,万字攻略详解, offer到碗里来❤️
  12. Pollard Rho算法分解因数
  13. 5. 工业大数据典型应用
  14. python100day - day24 - DataAnalysis
  15. dede 后台 一直显示验证码不正确的原因
  16. 大数据概论 (理论基础)
  17. 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结
  18. 轻轻松松实现本地和云主机之间的文件上传下载
  19. JQ手册 JQ方法大全 jq获取表单值与赋值代码 50个JQ的例子
  20. 合作共赢:加密云储——穿针引线,布局IPFS分布式存储领域

热门文章

  1. 科学计算机js代码,利用js实现在线科学计算器代码
  2. mysql语句高逼格_求一些逼格高的语句?
  3. 如何用艺术字制作水印?教你一招快速制作专属水印
  4. 2017云计算与IT风向标—— 移动、转型、整合
  5. PXE网络启动 windows PE (使用微软官方工具)
  6. 2019辽宁公务员考试:申论突破80+学习计划第二步
  7. 柳州哪里有短视频创业直播基地?柳州市互联网协会为您精选4家
  8. matlab 拟合曲线 预测,matlab曲线拟合和预测
  9. 仅允许用户radmin使用su命令
  10. ssm毕设项目基于远程协作的汽车故障诊断系统t6ipg(java+VUE+Mybatis+Maven+Mysql+sprnig)