爬取网址 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/index.html

因为数据比较大,存储为一个json,会内存溢出。

所以按照每个省市进行存储。

同时因为远程访问链接拿取数据,所以会将已经拿到网页进行缓存,以便下次使用。

package com.witwicky.jsoup;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.witwicky.vo.CrawlingVo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; public class Crawling {
private static final String BASE_SAVE_DIR = "E:\\工作\\extract";
private static final String RESULT_SAVE_DIR = "E:\\工作\\extract_result"; public static void main(String[] args) throws Exception {
Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
Gson gsonSimple = new GsonBuilder().create();
List<CrawlingVo> crawlingVos = new ArrayList<CrawlingVo>();
Elements select = getElements("index.html", "tr.provincetr > td > a");
for (Element element : select) {
List<CrawlingVo> crawlingVos1 = new ArrayList<CrawlingVo>();
String val = element.attr("href");
crawlingVos.add(new CrawlingVo(val.substring(0, val.indexOf(".")), element.text(), crawlingVos1)); String baseUrl = element.attr("href");
String baseUrlPre = baseUrl.substring(0, baseUrl.indexOf("."));
Elements ele = getElements(baseUrl, "tr.citytr");
for (Element nextE : ele) {
List<CrawlingVo> crawlingVos2 = new ArrayList<CrawlingVo>();
crawlingVos1.add(new CrawlingVo(nextE.select("td:eq(0) a").text(), nextE.select("td:eq(1) a").text(), crawlingVos2)); String href = nextE.select("td:eq(1) a").attr("href");
String substring = href.substring(0, baseUrl.indexOf("."));
Elements contryElements = getElements(href, "tr.countytr");
for (Element contryElement : contryElements) {
List<CrawlingVo> crawlingVos3 = new ArrayList<CrawlingVo>();
crawlingVos2.add(new CrawlingVo(contryElement.select("td:eq(0) a").text(), contryElement.select("td:eq(1) a").text(), crawlingVos3)); String href1 = contryElement.select("td:eq(1) a").attr("href"); if (!"".equalsIgnoreCase(href1)) {
String substring1 = href1.substring(0, baseUrl.indexOf("."));
Elements elements = getElements(substring + "/" + href1, "tr.towntr");
for (Element element1 : elements) {
List<CrawlingVo> crawlingVos4 = new ArrayList<CrawlingVo>();
crawlingVos3.add(new CrawlingVo(element1.select("td:eq(0) a").text(), element1.select("td:eq(1) a").text(), crawlingVos4)); String href2 = element1.select("td:eq(1) a").attr("href");
Elements elements1 = getElements(baseUrlPre + "/" + substring1 + "/" + href2, "tr.villagetr");
for (Element element2 : elements1) {
crawlingVos4.add(new CrawlingVo(element2.select("td:eq(0)").text(), element2.select("td:eq(2)").text(), new ArrayList<CrawlingVo>()));
}
}
}
}
}
save2File(gsonSimple.toJson(crawlingVos), element.text() + ".json", RESULT_SAVE_DIR);
save2File(gsonPretty.toJson(crawlingVos), element.text() + "_pretty.json", RESULT_SAVE_DIR); System.out.println(element.text() + " is complete!");
}
} private static Elements getElements(String u, String selector) throws IOException, InterruptedException {
String url = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/" + u;
String cleanUrl = cleanName(url);
Document select = null;
File localFile = new File(BASE_SAVE_DIR, cleanUrl);
if (localFile.exists()) {
select = Jsoup.parse(localFile, "UTF-8");
}
boolean remoteUrl = false;
if (select == null) {
int intRd = new Random().nextInt(5) + 1;
Thread.sleep(intRd * 1000);
select = Jsoup.connect(url).get();
remoteUrl = true;
}
if (remoteUrl) {
save2File(select.toString(), cleanName(url), BASE_SAVE_DIR);
}
return select.select(selector);
} private static String cleanName(String name) {
return name
.replace("\\", "_")
.replace("/", "_")
.replace("//", "_")
.replace(".", "_")
.replace(":", "_");
} private static void save2File(String content, String fileName, String saveDir) {
File dir = new File(saveDir);
if (!dir.exists()) {
boolean mkdirs = dir.mkdirs();
if (!mkdirs) {
return;
}
} File file = new File(dir, fileName);
if (file.exists()) {
return;
} try {
FileOutputStream outSTr = new FileOutputStream(file);
BufferedOutputStream Buff = new BufferedOutputStream(outSTr);
Buff.write(content.getBytes());
Buff.flush();
Buff.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.witwicky.vo;

import java.util.List;

public class CrawlingVo {
private String value;
private String label;
private List<CrawlingVo> children; public CrawlingVo() {
} public CrawlingVo(String value, String label, List<CrawlingVo> children) {
this.value = value;
this.label = label;
this.children = children;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public String getLabel() {
return label;
} public void setLabel(String label) {
this.label = label;
} public List<CrawlingVo> getChildren() {
return children;
} public void setChildren(List<CrawlingVo> children) {
this.children = children;
}
}
 
 
 
\\审判系统
[\\Shěnpàn xìtǒng]
\\ trial system
 

java 爬取 国税局 省市区级联关系的更多相关文章

  1. MinerHtmlThread.java 爬取页面线程

    MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...

  2. MinerConfig.java 爬取配置类

    MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...

  3. Java爬取网络博客文章

    前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...

  4. Java爬取校内论坛新帖

    Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...

  5. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

  6. java爬取网页内容 简单例子(2)——附jsoup的select用法详解

    [背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...

  7. java爬取并下载酷狗TOP500歌曲

    是这样的,之前买车送的垃圾记录仪不能用了,这两天狠心买了好点的记录仪,带导航.音乐.蓝牙.4G等功能,寻思,既然有这些功能就利用起来,用4G听歌有点奢侈,就准备去酷狗下点歌听,居然都是需要办会员才能下 ...

  8. Java爬取并下载酷狗音乐

    本文方法及代码仅供学习,仅供学习. 案例: 下载酷狗TOP500歌曲,代码用到的代码库包含:Jsoup.HttpClient.fastJson等. 正文: 1.分析是否可以获取到TOP500歌单 打开 ...

  9. Java爬取先知论坛文章

    Java爬取先知论坛文章 0x00 前言 上篇文章写了部分爬虫代码,这里给出一个完整的爬取先知论坛文章代码. 0x01 代码实现 pom.xml加入依赖: <dependencies> & ...

随机推荐

  1. LeetCode(15. 三数之和)

    问题描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...

  2. 通过按键实现LED灯的亮灭(含两种情况)

    #include "stm32f10x.h"// 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpio ...

  3. shell脚本使用技巧3--调试

    1.使用-x,开启shell脚本的跟踪调试功能 ex:bash -x script.sh or sh -x script.sh 2.使用set -x 和 set +x对脚本进行部分调试(输入中间的内容 ...

  4. 近年NOIP考点与主要做法

  5. 回文检测 [USACO Training Section 1.3]

    题目描述 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文.你的工作就是去寻找这些牛制造的奇观(最棒的回文). 在寻找回文时不用理睬那些标点符号.空格( ...

  6. TFS 安装 扩展包

    TFS 2015以后的版本支持安装扩展插件,我们可以自己开发插件,也可以从市场上下载. 市场地址为:http://go.microsoft.com/fwlink/?LinkId=722825& ...

  7. 游戏中Row所指代的是什么?

    游戏中Row所指代的是: HTML中row指的是行 SQL指的是列 其实,在翻译中来说,Row既是行也是列:准确一点讲,是横着的 现多指代的是行:

  8. 重写父类、多线程、多进程、logging模块

    1. 重写父类 1)  子类定义父类同名函数后,父类函数被覆盖: 2)  如果需要,可以在子类中调用父类方法:”父类名.方法(self)”.”父类名().方法()”.”super(子类名,self). ...

  9. jquery .stop()的用法

    jquery的.stop()的用法: 目的:为了 了解stop()的用法,举个例子,直观的方式看看. 实物:一个id="animater"的div包含了一段文字.(以下用anima ...

  10. PHP06

    PHP06 1. 2.可视化工具navicat: 1)查询 : select 字段名1,字段名2- from 表名; 对于可能与关键词重名的名称,建议使用反引号`括起来 可用*通配符代替字段名 sel ...