java 爬取 国税局 省市区级联关系
爬取网址 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;
}
}
java 爬取 国税局 省市区级联关系的更多相关文章
- MinerHtmlThread.java 爬取页面线程
MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...
- MinerConfig.java 爬取配置类
MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...
- Java爬取网络博客文章
前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...
- Java爬取校内论坛新帖
Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...
- Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云
一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...
- java爬取网页内容 简单例子(2)——附jsoup的select用法详解
[背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...
- java爬取并下载酷狗TOP500歌曲
是这样的,之前买车送的垃圾记录仪不能用了,这两天狠心买了好点的记录仪,带导航.音乐.蓝牙.4G等功能,寻思,既然有这些功能就利用起来,用4G听歌有点奢侈,就准备去酷狗下点歌听,居然都是需要办会员才能下 ...
- Java爬取并下载酷狗音乐
本文方法及代码仅供学习,仅供学习. 案例: 下载酷狗TOP500歌曲,代码用到的代码库包含:Jsoup.HttpClient.fastJson等. 正文: 1.分析是否可以获取到TOP500歌单 打开 ...
- Java爬取先知论坛文章
Java爬取先知论坛文章 0x00 前言 上篇文章写了部分爬虫代码,这里给出一个完整的爬取先知论坛文章代码. 0x01 代码实现 pom.xml加入依赖: <dependencies> & ...
随机推荐
- 手动添加jar包到本地仓库
最近写一个小项目需要用到阿里大鱼的短信功能,安装官网提供的maven及demo做了下测试,在测试过程中,发现导入的pom文件是无效的,也就是说本地的maven仓库中并么有我们pom中的依赖.于是我在网 ...
- Java笔记(六)列表和队列
列表和队列 一)ArrayList 1.基本原理 ArrayList是一个泛型容器.内部会有一个数组elementData,一般会有预留空间 有一个整数记录实际的元素个数. private trans ...
- Tomcat安装与环境变量的配置
Tomacat的下载 去Tomcat官网下载,我使用的是apache-tomcat-7.0.78的版本. 安装 下载完成之后,我们解压缩到相应的目录.这里我解压缩到d盘下面 1.然后去配置系统的环 ...
- 最优贸易 [NOIP 2009]
Description C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向 ...
- C#数组,ArrayList,List
一.数组声明方式 1,声明一个未经初始化的数组引用,以后可以把这引用初使化为一个数组实例 int[] int_array; int_array = new int[2]; 注:数组的引用必须以相同或相 ...
- bootstrap-datetimepicker时间插件
bootstrap-datetimepicker时间插件 依赖的jar包 bootstrap的js和css jquery.js datetimepicker的js文件: bootstrap-datet ...
- JS_高阶函数(filter)
//2017/7/18 //高阶函数:filter. //filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素.和map()类似,Array的filter()也接收一 ...
- javascript对内容的操作
我在这里介绍innerHTML.innerText.innerContent 一,innerHTML(可以识别标签): 案例1:替换掉整个标签 <!--innerHTML--> <p ...
- 【暴力枚举&BFS】Flow Free @RMRC2017/upcexam5124
时间限制: 1 Sec 内存限制: 128 MB 题目描述 Flow Free is a puzzle that is played on a 2D grid of cells, with some ...
- JAVA自学笔记10
JAVA自学笔记10 1.形式参数与返回值 1)类名作为形式参数(基本类型.引用类型) 作形参必须是类的对象 2)抽象类名作形参 需要该抽象类的子类对象,通过多态实现 3)接口名为形参 需要的是该接口 ...