爬取国家统计局城乡数据
项目需求,,国家省市区名称代码,网上找了一圈2020年的都不是免费的,后来就自己做了个爬虫,因为自己本身做的时JAVA 开发,平常也没学过python,所以只能使用Java做一个爬虫,爬国家统计局的2020年城乡统计,爬到了村居委会一级共67w条数据
day01:https://blog.csdn.net/weixin_43638187/article/details/110220248
源码及2020年数据 :https://github.com/zhouqiang0821/smallTools
数据是在:https://wws.lanzous.com/b01zvqqch密码:bvlt
base_region_detail.sql :是统计到乡镇、村社区的数据,另一个没那么全
1 获取数据
1.1 爬取省数据
首先就是获取每一个省,然后根据每一个省层层往下扒,直到获取完这个省下边的所有市县村,在获取下一个省的数据
获取所有省的URL:
http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/
省的官方数据结构
可以看到需要的数据是从一个class=‘provincetr’ 下的 <a> 标签中拿到的,我们主要的任务就是拿到class=‘provincetr’,并遍历获取所有 <td> 下的 <a> 标签 中数据,根据这个 *.html获取这个省下边的所有市信息.
/***
* 获取省信息
*/
public void getProvince() throws InterruptedException {
// 初始化 httpClint
initHttpClint();
// 从index.html 中获取所有 省、直辖市、自治区 数据
Document doc = Jsoup.parse(toGet("/index.html"));
Elements provincetrEles = doc.getElementsByClass("provincetr");
// 查找数据库中保存的最后一个省的regionCode
List<String> provinceCodeList = baseRegionDetailDao.getAllProvince();
for (Element e :
provincetrEles) {
Elements tdEles = e.getElementsByTag("td");
for (Element td :
tdEles) {
Elements a = td.select("a");
if (!a.isEmpty()) {
// 解析数据 获取 指向市的href
String href = td.select("a").attr("href");
// 获取省份名称
String name = td.select("a").text().trim();
// 获取省份代码
String areaCode = "";
areaCode = href.substring(0, href.indexOf(".")) + "00";
String last2code = getLast2code(href, 0, 2);
// 判断 数据库中 没有省信息 则证明是第一次爬取
if (provinceCodeList == null || !provinceCodeList.contains(areaCode)) {
System.out.println("--------------省-------------");
System.out.println("省: " + name + " 代码:" + areaCode + " href:" + href);
// 保存省信息数据
ArrayList<BaseRegionDetailModel> list = new ArrayList<>();
list.add(createModel(name, areaCode, "0", "0"));
baseRegionDetailDao.insert(list);
getCity(toGet(href), areaCode