有朋友需要获取全国2013年统计用区划代码和城乡划分代码,于是写了个爬虫抓数据。 仔细分析页面后,发现其特点是根据最终的区域代码,可以反推上级省、市等代码,故只保存最后一步数据。 第一次接触爬虫,边做边研究。只写了个单线程,下载了41分钟。 后来研究多线程爬虫,又写了个多线程爬知乎话题+回答的程序。由于暂时无法正确保存页面上各种程序语言的代码,半成品的程序就不放出来了。 下面是单线程下载统计局全国区划代码的源码,要改成多线程也不难。不过已经下载到了结果,就懒得再做无用功了。 [java] view plain copy package king.statitics; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class GetNoAndAddress { // 由于每个网页层数未知,用List来保存每一层网页。 // Map的第一个String为网址,第二个String为 代码和地址,用SEPARATOR隔开 private static List<Map<String, String>> tempList = new ArrayList<Map<String, String>>(); private static final String SEPERATOR = "|"; private static Map<String, String> result = new TreeMap<String, String>(); public static void main(String[] args) throws Exception { // 网址: 2013年统计用区划代码和城乡划分代码(截止2013年8月31日) String urlStr = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/index.html"; String filePath = "E:/result.txt"; long start = System.currentTimeMillis(); // 执行 execute(urlStr, filePath); long end = (System.currentTimeMillis() - start) / (1000 * 60); System.out.println("总运行时间" + end + "分钟"); } /** * 程序入口 * @param urlStr */ public static void execute(String urlStr, String filePath) throws Exception { int index = -1; // 照顾下面的循环,从-1开始。 do{ Map<String, String> store = new TreeMap<String, String>(); if (tempList.isEmpty()){ //第一次抓取,即最顶层页面 analysisHtml(urlStr, "", store); } else { for(Map.Entry<String, String> entry : tempList.get(index).entrySet()){ analysisHtml(entry.getKey(), getAddress(entry.getValue()), store); } } if (!store.isEmpty()) tempList.add(store); }while (++index < tempList.size()); System.out.println("下载完成,开始写入文件:"); // print(); // 把所有结果存入文件中 PrintStream output = new PrintStream(filePath); for (Map.Entry<String, String> entry : result.entrySet()){ output.println(entry.getKey() + " " + entry.getValue()); } output.close(); System.out.println("OK!"); } /** * 获取 * @param urlStr 网址 * @throws IOException */ public static void analysisHtml(String urlStr, String parentPath , Map<String, String> store) throws IOException{ // 获取html Document doc = Jsoup.connect(urlStr).get(); // 经观察,符合条件的数据皆以此开头 Elements links = doc.select("tr[class$=tr]"); // 遍历每个 <a 标签 for (Element link : links) { // 用if 过滤结尾的 // <A class=STYLE3 href="http://www.miibeian.gov.cn/" target=_blank>京ICP备05034670号</A> getStatistics(store, link, parentPath); } } /** * 保存结果 * @param store 每一层次页面的结果 * @param link 链接 */ public static void getStatistics(Map<String, String> store , Element link, String parentPath){ String url = ""; // 绝对网址 String code = ""; // 相对网址 String address = ""; // 地址 if ("".equals(parentPath)){ // 父地址是空值,即最顶层页面,提取方法与其他不同 // 包含多个td标签, 每个一组数据 Elements td = link.getElementsByTag("td"); for (Element e : td){ url = e.getElementsByAttribute("href").attr("abs:href"); code = e.getElementsByAttribute("href").attr("href"); if (code.toLowerCase().endsWith(".html")){ code = code.substring(0, code.indexOf(".")); // 提取代码 } address = e.text(); store.put(url, code + SEPERATOR + address); } } else{ url = link.getElementsByAttribute("href").attr("abs:href"); // link包含多个td标签,仍可进一步提取 Elements td = link.getElementsByTag("td"); // 它们都属于同一条数据 for (Element e : td){ if (!e.text().matches("\\d{3}")){ if ("".equals(code)){ code = e.text(); }else{ address = parentPath + e.text(); } } } // 存储 结果 if (url == null || "".equals(url)){ //说明到了最底层 result.put(code, address); } else { store.put(url, code + SEPERATOR + address); } // 控制台输出每一步数据,看看程序有没有在执行 System.out.println(code + "---->" + address); } } /** * 拆分字符串,提取出地址值 * @param group eg:11|北京市 */ private static String getAddress(String group){ return group.substring(group.indexOf(SEPERATOR) + 1); } // 用于测试 private static void print(){ for(Map.Entry<String, String> entry : tempList.get(0).entrySet()){ System.out.println(entry.getKey() + " " + entry.getValue()); } } } 最终获取的文件部分内容: [java] view plain copy 110101001001 北京市市辖区东城区东华门街道办事处多福巷社区居委会 110101001002 北京市市辖区东城区东华门街道办事处银闸社区居委会 110101001005 北京市市辖区东城区东华门街道办事处东厂社区居委会 110101001006 北京市市辖区东城区东华门街道办事处智德社区居委会 110101001007 北京市市辖区东城区东华门街道办事处南池子社区居委会 110101001008 北京市市辖区东城区东华门街道办事处黄图岗社区居委会 110101001009 北京市市辖区东城区东华门街道办事处灯市口社区居委会 110101001010 北京市市辖区东城区东华门街道办事处正义路社区居委会 110101001011 北京市市辖区东城区东华门街道办事处甘雨社区居委会 110101001013 北京市市辖区东城区东华门街道办事处台基厂社区居委会 110101001014 北京市市辖区东城区东华门街道办事处韶九社区居委会 110101001015 北京市市辖区东城区东华门街道办事处王府井社区居委会 110101002001 北京市市辖区东城区景山街道办事处隆福寺社区居委会
相关推荐
java爬虫,国家统计局区划编码http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/;
java爬虫,国家统计局区划编码http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/; 爬取省市区乡镇村数据,共70W+数据.
此次发布内容为2019年全国统计用区划代码(12位)和城乡分类代码(3位),地域范围为国家统计局开展统计调查的全国31个省、自治区、直辖市,未包括我国台湾省、香港特别行政区、澳门特别行政区。
使用java代码从国家统计局抓取2016年区划代码,个人编写,县区级亲测可用,街道级已完成基本方法。由于时间过长没有分拆,需要的话需要作一定修改
抓取区划代码和城乡划分代码
2013年统计用区划代码和城乡划分代码(截止2013年8月31日) 12位行政区划代码,到村级别的,数据是从国家统计局的官网上爬取而来 资源里包括原始的java代码和以及爬取好的数据。
这是Java写的爬虫,从统计局爬取国家区划信息,代码里只有湖南的,直接运行,可以直接爬取湖南省的区划代码,并生成Sql文件,可以直接导入数据,需要爬取其他省份的,或全国的,需要自己修改代码。
1、更新时间:2021年10月31日 2、区域范围:全国 3、数据总量:61万8415条
国家统计局-统计用区划和城乡划分代码-2019版(2020-02-25发布)(黑龙江)完整版,其中包含下辖13地市的所有区县以及乡镇街道、社区村屯,内容完整可用,统计用区划代码和城乡划分代码,在统计工作中应当使用,需要...
2020年国家统计局发布的浙江省最新行政区划代码,文件为MySQL数据库的SQL文件,可以直接运行SQL文件,即可使用;数据精确到村级,如有问题请留言!
从国家统计局下载行政区划数据,仅学习参考
四级地址库-国家标准的行政区划代码(省市区)-附加街道,共48082条数据。是mysql的SQL,下载解压后,直接运行,会自动建表、并导入数据,有层级关系。表结构设计合理;去除了空的“市辖区”;北京、上海、天津、...
统计局2019年公布的2018数据,最新的行政区划代码(新疆维吾尔自治区)精确到村级,文件为SQL文件;如有问题请留言。
{"adcode":100000,"level":"country","center":[116.3683244,39.915085],"name":"全国","children":[{"adcode":110000,"level":"province","center":[116.405285,39.904989],"name":"北京市","children":[{"adcode":...
中国区域数据省市区联动数据,统计用区划代码和城乡划分代码,来源:国家统计局
使用java通过okhttp从国家统计局爬取2020年 统计用区划和城乡划分代码 数据,使用jsoup对数据进行解析,由于是穷逼,挂在了云服务器上,爬一会儿睡一会,也可以使用代理Ip爬取数据,代码没优化,只是考虑正常爬取...
1. 数据来源于统计局最新县及县以上行政区划代码(截止2014年10月31日); 地址: http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html 2. 将HTML取出有用部分,用Chrome控制台的copy,保存为 ...
根据国家统计局2017年3月10日刚刚发布的数据生成,并提供生成代码。今后只需复制国家统计局网站发布的数据到本表,一键生成所需的数据。
[TOC]省市区从国家统计局爬区划代码 别人的git 区划和城乡划分代码 统计用区划代码和城乡划分代码编制规则###省(省级)(sys_province):名称变量名类型必填说明主键idint是主键无意义省行政代码codeint是省名称...
通过实际调试得知, 统计局网站是有单个IP的并发数及访问时间间距控制,某一条条件超过均返回503及502 对应使用线程池参数是控制并发数量. 使用对每个线程Sleep控制间距. 在不断调试下, 兼顾DB写入及WEB访问线程. 预计...