文档章节

抓取国家统计局2013年全国行政组织机构并插入mysql

凯文加内特
 凯文加内特
发布于 2015/05/25 19:07
字数 1285
阅读 370
收藏 24
点赞 1
评论 2

数据库创建脚本:

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50621
Source Host           : localhost:3306
Source Database       : cmm-db

Target Server Type    : MYSQL
Target Server Version : 50621
File Encoding         : 65001

Date: 2015-05-25 19:05:58
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `region`
-- ----------------------------
DROP TABLE IF EXISTS `region`;
CREATE TABLE `region` (
  `area_code` varchar(50) NOT NULL COMMENT '地区编码',
  `area_name` varchar(50) NOT NULL COMMENT '地区名称',
  `parent_code` varchar(50) NOT NULL COMMENT '地区父编码',
  `place_order` varchar(50) NOT NULL DEFAULT '0' COMMENT '显示顺序',
  PRIMARY KEY (`area_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Records of region
-- ----------------------------

maven依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
</dependency>

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.2</version>
</dependency>

源代码:

import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupRegion {
	/** 整数 */
	private static final String V_INTEGER = "^-?[1-9]\\d*$";

	class Region {
		public String getCode() {
			return code;
		}

		public void setCode(String code) {
			this.code = code;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public int getParentId() {
			return parenId;
		}

		public void setParentId(int parenId) {
			this.parenId = parenId;
		}

		public String getType() {
			return type;
		}

		public void setType(String type) {
			this.type = type;
		}

		private String code;
		private String name;
		private String type;// 乡镇类型
		private int parenId;

	}

	/**
	 * @说明: url2Document
	 * @param @param url
	 * @param @return
	 * @param @throws IOException
	 * @return Document
	 * @throws
	 */
	public static Document url2Doc(String url) throws IOException {
		// 此种方式403
		// return Jsoup.connect(url).get();
		// return Jsoup.connect(url).timeout(600 * 1000)
		// .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36").get();
		//
		return Jsoup.connect(url).timeout(600 * 1000).get();
	}

	/**
	 * 验证是不是整数
	 * 
	 * @param value
	 *            要验证的字符串 要验证的字符串
	 * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false </b>
	 */
	public static boolean Integer(String value) {
		return match(V_INTEGER, value);
	}

	/**
	 * @param regex
	 *            正则表达式字符串
	 * @param str
	 *            要匹配的字符串
	 * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
	 */
	private static boolean match(String regex, String str) {
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		return matcher.matches();
	}

	/**
	 * 追加文件:使用FileWriter
	 * 
	 * @param fileName
	 * @param content
	 */
	public static void appendFile(String fileName, String content) {
		FileWriter writer = null;
		try {
			// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
			writer = new FileWriter(fileName, true);
			writer.write(content);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * @说明: 获取省份
	 * @param @param url
	 * @param @return
	 * @param @throws IOException
	 * @return List<Region>
	 * @throws
	 */
	private static List<Region> getProvince(String url) throws IOException {
		List<Region> list = new ArrayList<Region>();
		Document doc = url2Doc(url);
		Elements proviceTr = doc.getElementsByAttributeValue("class", "provincetr");// 通过css获取tr
		for (Element e : proviceTr) {
			Elements tds = e.select("a[href]");
			for (Element element : tds) {
				Region region = new JsoupRegion().new Region();
				// region.setCode("13");
				region.setCode(element.attr("href").substring(0, 2));
				region.setName(element.text().replaceAll("<br />", ""));
				region.setType("");
				region.setParentId(0);
				list.add(region);
			}
		}
		return list;
	}

	/**
	 * @说明: 获取省份下的市
	 * @param @param url
	 * @param @return
	 * @param @throws IOException
	 * @return List<Region>
	 * @throws
	 */
	private static List<Region> getCity(String url) throws IOException {
		List<Region> list = new ArrayList<Region>();
		Document doc = url2Doc(url);
		Elements proviceTr = doc.getElementsByAttributeValue("class", "citytr");// 通过css获取tr
		for (Element e : proviceTr) {
			Elements tds = e.select("a[href]");
			for (Element element : tds) {
				if (Integer(element.text())) {
					continue;
				}
				Region region = new JsoupRegion().new Region();
				String code = element.attr("href").substring(3, 7);
				region.setCode(code);
				region.setName(element.text());
				region.setParentId(Integer.valueOf(code.substring(0, 2)));
				region.setType("");
				list.add(region);
			}
		}
		return list;
	}

	/**
	 * @说明: 县
	 * @param @param url
	 * @param @return
	 * @param @throws IOException
	 * @return List<Region>
	 * @throws
	 */
	private static List<Region> getCounty(String url) throws IOException {
		List<Region> list = new ArrayList<Region>();
		Document doc = url2Doc(url);
		Elements proviceTr = doc.getElementsByAttributeValue("class", "countytr");// 通过css获取tr
		for (Element e : proviceTr) {
			Elements tds = e.select("a[href]");
			for (Element element : tds) {
				if (Integer(element.text())) {
					continue;
				}
				Region region = new JsoupRegion().new Region();
				String code = element.attr("href").substring(3, 9);
				region.setCode(code);
				region.setName(element.text());
				region.setParentId(Integer.valueOf(code.substring(0, 4)));
				region.setType("");
				list.add(region);
			}
		}
		return list;
	}

	/**
	 * @说明: 镇
	 * @param @param url
	 * @param @return
	 * @param @throws IOException
	 * @return List<Region>
	 * @throws
	 */
	private static List<Region> getTown(String url) throws IOException {
		List<Region> list = new ArrayList<Region>();
		Document doc = url2Doc(url);
		Elements proviceTr = doc.getElementsByAttributeValue("class", "towntr");// 通过css获取tr
		for (Element e : proviceTr) {
			Elements tds = e.select("a[href]");
			for (Element element : tds) {
				if (Integer(element.text())) {
					continue;
				}
				Region region = new JsoupRegion().new Region();
				String code = element.attr("href").substring(3, 12);
				region.setCode(code);
				region.setName(element.text());
				region.setParentId(Integer.valueOf(code.substring(0, 6)));
				region.setType("");
				list.add(region);
			}
		}
		return list;
	}

	/**
	 * @说明: 村
	 * @param @param url
	 * @param @return
	 * @param @throws IOException
	 * @return List<Region>
	 * @throws
	 */
	private static List<Region> getVillage(String url) throws IOException {
		List<Region> list = new ArrayList<Region>();
		Document doc = url2Doc(url);
		Elements proviceTr = doc.getElementsByAttributeValue("class", "villagetr");// 通过css获取tr
		for (Element e : proviceTr) {
			Elements trs = e.select("tr");
			for (Element element : trs) {
				Elements tds = element.select("td");
				Region region = new JsoupRegion().new Region();
				for (Element element2 : tds) {
					String value = element2.text();
					if (Integer(value) && value.length() == 3) {
						region.setType(element2.text());
					}
					if (Integer(value) && value.length() > 3) {
						region.setCode(value);
						region.setParentId(Integer.valueOf(value.substring(0, 9)));
					} else {
						region.setName(value);
					}

				}
				list.add(region);

			}
		}
		return list;
	}

	public static void insertDb() {

	}

	/**
	 * @Description:
	 * @param
	 * @return Connection 返回类型
	 * @throws
	 */
	private static Connection connection() throws ClassNotFoundException, SQLException {
		// 调用Class.forName()方法加载驱动程序
		Class.forName("com.mysql.jdbc.Driver");
		String url = "jdbc:mysql://localhost:3306/cmm-db?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"; // JDBC的URL
		Connection conn = DriverManager.getConnection(url, "root", "root");
		return conn;
	}

	public static void insertRegion(Region region) throws ClassNotFoundException, SQLException {
		Connection conn = connection();
		conn.setAutoCommit(false);
		// 插入数据的代码
		String sql2 = "insert into region(area_code,area_name,parent_code,place_order) values(?,?,?,?) ";
		PreparedStatement pst = conn.prepareStatement(sql2);

		pst.setString(1, region.getCode());
		pst.setString(2, region.getName());
		pst.setString(3, region.getParentId()+"");
		pst.setString(4, region.getCode());
		pst.addBatch();
		// 执行批量更新
		pst.executeBatch();
		// 语句执行完毕,提交本事务
		conn.commit();
		pst.close();
		conn.close();
	}

	public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
		String url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/";
		List<Region> all = new ArrayList<Region>();
		List<Region> province = getProvince(url + "/index.html");
		all.addAll(province);
		List<String> done = new ArrayList<String>();// 用来存已经抓取过的省份
		for (Region regionProvince : province) {// 遍历省
			if (done.contains(regionProvince.getCode())) {
				continue;
			}
			insertRegion(regionProvince);
			System.out.println(regionProvince.getCode() + regionProvince.getName());

			List<Region> city = getCity(url + regionProvince.getCode() + ".html");
			for (Region regionCity : city) {// 遍历市
				insertRegion(regionCity);
				System.out.println(regionCity.getCode() + "||" + regionCity.getName());

				List<Region> county = getCounty(url + regionProvince.getCode() + "/" + regionCity.getCode() + ".html");
				all.addAll(county);
				for (Region regionCounty : county) {// 遍历县
					insertRegion(regionCounty);
					System.out.println(regionCounty.getCode() + "||" + regionCounty.getName());

					List<Region> town = getTown(url + regionProvince.getCode() + "/" + regionCity.getCode().substring(2, 4) + "/" + regionCounty.getCode() + ".html");
					all.addAll(town);
					for (Region regionTown : town) {// 遍历镇
						insertRegion(regionTown);
						System.out.println(regionTown.getCode() + "||" + regionTown.getName());

						List<Region> village = getVillage(url + regionProvince.getCode() + "/" + regionCity.getCode().substring(2, 4) + "/" + regionCounty.getCode().substring(4, 6) + "/"
								+ regionTown.getCode() + ".html");
						all.addAll(village);
						for (Region regionVillage : village) {// 遍历村
							insertRegion(regionVillage);
							System.out.println(regionVillage.getCode() + "||" + regionVillage.getName());
						}
					}

				}

			}
		}
	}
}


© 著作权归作者所有

共有 人打赏支持
凯文加内特
粉丝 326
博文 664
码字总数 86609
作品 0
青岛
后端工程师
加载中

评论(2)

xtgss007
xtgss007
http://my.oschina.net/xtgss007/blog/420038 心血来潮用php来写了一遍
snowdream
snowdream
给力
Winform开发框架之字典管理模块的更新,附上最新2013年全国最新县及县以上行政区划代码sql脚本

在很多项目里面,字典管理是必备的项目模块,而这个又是比较通用的功能,因此可以单独做成一个通用字典管理,例如这个模块,可以通过集成的方式,使用在我的《Winform开发框架》、《WCF开发框...

walb呀 ⋅ 2017/12/04 ⋅ 0

各级(省市县镇村)行政区域获取

在各种WEB应用中,会填写个人或者企业的地址信息,如下图所示,是京东上填写收货地址的页面截图。 小弟最近也碰到了类似的问题,需要得到所有省份,每个省份下属的市区,没事市区下属的县、乡...

r-ricky ⋅ 2015/06/24 ⋅ 2

意大利国防部将转投 LibreOffice 阵营

据外媒报道,LibreItalia 协会已经和意大利国防部达成了开源合作,后者将从 Microsoft Office 迁移至 LibreOffice 所主导的开放文档格式。LibreItalia 协会总裁 Sonia Montegiove 和意大利国...

oschina ⋅ 2015/09/16 ⋅ 36

谈谈行政管理费

1. 今年第四期的《炎黄春秋》上,有一篇文章《中国财政支出结构的过去、现在与未来》。 我第一眼看到,就决定一定要转载。因为它说出了我一直想说的东西----政府的财政支出太不合理、太黑暗。...

阮一峰 ⋅ 2008/06/03 ⋅ 0

2017年医学博士英语考试答.案+201761858考后付

2017年医学博士英语考试答.案+201761858考后付 2017年医学博士英语+201761858保通过 2017年医学博士英语201761858 2017年医学博士英语=201761858保过 2017年医学博士英语《201...

dengqi8 ⋅ 2017/02/28 ⋅ 0

python中如何实现抓取的url如果在mysql数据库中存在则不插入,如果不存在则插入

各位达人,小弟在用python抓取url,数据库用的是mysql,如何实现抓取的url如果在mysql数据库中存在则不插入,如果不存在则插入,万分感谢!

哈泥湖 ⋅ 2013/05/05 ⋅ 3

百度奇虎等签搜索公约:共守 robots 协议

11月1日消息,中国互联网协会已于今日下午召集百度、奇虎360、搜狗、搜搜等12家公司签署搜索公约。该公约的第七条明确规定,遵循国际通行的行业惯例与商业规则,遵守机器人协议(robots协议)...

oschina ⋅ 2012/11/03 ⋅ 38

国家频抛利好政策 互联网将成医联体建设神经中枢?

  医联体,是一种打破医院、区域、医生限制的全新医疗服务组织。近年来,不管是国家还是地方,都有心加快医改脚步,并尝试推进各种“医联体”。但由于不是内部自发产物,所以目前来看,大部...

王利阳 ⋅ 2017/06/03 ⋅ 0

2017年医学考博英语考试答.案+201761858考后付

2017年医学考博英语考试答.案+201761858考后付 2017年医学考博英语+201761858保通过 2017年医学考博英语201761858 2017年医学考博英语=201761858保过 2017年医学考博英语《201...

dengqi8 ⋅ 2017/02/28 ⋅ 0

工信部:网络出版服务管理规定3月10日起施行

第一章总则 第一条为了规范网络出版服务秩序,促进网络出版服务业健康有序发展,根据《出版管理条例》、《互联网信息服务管理办法》及相关法律法规,制定本规定。 第二条在中华人民共和国境内...

oschina ⋅ 2016/02/15 ⋅ 50

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vue使用mockjs

在使用vue开发的时候,一直疑惑与mockjs怎么用,开了mockjs的开发文档,还是一脸蒙蔽,无从下手!mockjs在前后端分离开发上进行模拟数据,是不可避掉的一环。在网上看了一些博文还有查阅了其...

JamesView ⋅ 18分钟前 ⋅ 0

解决问题的思路

1.相对来说,程序逻辑解决问题的思路应该更加趋向于通过逻辑结构来解决问题,而不是通过更小的类级别和方法级别的改进 2.类级别和方法级别的改进需要的技术能力更高一点

th778899 ⋅ 24分钟前 ⋅ 0

HTTP请求状态及jQuery AJAX请求异常处理

上一周调优一个项目的Js部分,其中一个严重的问题就是在页面初始化数据时,没有对异常进行处理, 导致Loading一直在等待中,无提示无处理。在用户体验上很不好,即使网络条件无法保证,在出错...

临江仙卜算子 ⋅ 24分钟前 ⋅ 0

error code 1874. innodb is in read only mode--报错解决

参考网页 https://zhidao.baidu.com/question/746894876932022292.html https://blog.csdn.net/shushugood/article/details/80226767 问题背景 创建了一个数据库然后想删除,因为自己本机性能......

karma123 ⋅ 25分钟前 ⋅ 0

JVM系列:jinfo命令详解

jinfo全称Java Configuration Info,主要作用是实时查看和调整JVM配置参数。 一.查看JVM参数 用法:jinfo -flag <name> PID 示例: # jinfo -flag MaxMetaspaceSize 11180 # -XX:MaxMetaspac......

Jacktanger ⋅ 30分钟前 ⋅ 0

exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp

1. exportfs命令 一般情况下重启服务器上nfs服务时,需把客户端上的挂载先卸载掉,以免进程后面杀不掉。当客户端服务器很多时,操作起来就比较麻烦。此时可以使用exportfs命令重新加载下。 ...

laoba ⋅ 39分钟前 ⋅ 0

基于Python的信用评分卡模型分析

信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常按照主...

火力全開 ⋅ 40分钟前 ⋅ 0

执行make命令时报错g++: Command not found

执行make命令时报错g++: Command not found 2016年10月24日 12:31:29 阅读数:4366 朋友安装node时遇到的问题 报错截图: 其实很简单只需要安装一下 yum -y install gcc automake autoconf l...

rootliu ⋅ 40分钟前 ⋅ 0

Loongnix(龙芯)系统,优盘安装指南

U盘安装分为两种方式:"usb disk" 及 "usb cd"。其中usb cd是将usb disk做为usb光驱使用。 usb disk安装步骤: 需要准备一个大小超过3.5G的U盘,格式化ext3格式 下载安装光盘镜像xxx.iso,将...

gugudu ⋅ 44分钟前 ⋅ 0

HTML5中meta属性的使用详解

meta属性在HTML中占据了很重要的位置。如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等。虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能...

guorongjin ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部