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> & ...
随机推荐
- JVM笔记(二)JVM基本结构
JVM基本结构 一.运行时内存区域 java虚拟机所管理的内存将会包括以下几个运行时内存区域. 1.程序计数器 Program Counter Register:可以看作当前线程(线程私有)所执行的字 ...
- 【DWM1000】 code 解密10 一 TAG 发送最后一个消息
更上面ANCHOR发送信息时的RTLS_DEMO_MSG_ANCH_RESP, 我们很快就可以找到如下代码 case RTLS_DEMO_MSG_ANCH_RESP: { 这里面一部分是设置重要变量, ...
- Centos 安装lnmp完整版
1.使用putty或类似的SSH工具登录服务器: 登录后运行 screen -S lnmp 2.下载并安装LNMP一键安装包: 我是CentOS系统,所以运行: wget -c http://soft ...
- Sniffer初识
Sniffer,中文可以翻译为嗅探器,是一种基于被动侦听原理的网络分析方式.使用这种技术方式,可以监视网络的状态.数据流动情况以及网络上传输的信息.当信息以明文的形式在网络上传输时,便可以使用网络监听 ...
- CallContext,ThreadStatic,AsyncLocal<T>,ThreadLocal<T>,学习笔记
1.CallContext 在当前调用上下文的线程数据槽里存储对象 2.ThreadStatic 是一个特性 3.AsyncLocal<T> 是一个类型,该字段应当为static,保证单例 ...
- modelform的操作以及验证
1,model的两个功能 1,数据库操作 2,验证只有一个clean方法作为钩子来操作,方法比较少 2,form(专门用来做验证的) 根据form里面写的类,类里面的字段,这些字段里有内置的的正则表达 ...
- GMA Round 1 二项式展开
传送门 二项式展开 求$(2x-y+\frac{3}{x}+4z)^{12}$展开式中不含x的任意非0次幂的项的系数和. 用排列组合的思想,相当于在12个括号里选项出来.先把$2x$和$\frac{3 ...
- springboot获取properties文件的配置内容(转载)
1.使用@Value注解读取读取properties配置文件时,默认读取的是application.properties. application.properties: demo.name=Name ...
- 2.1 mac下多版本jdk的安装和管理
之前已经安装过jdk8了,安装路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk 现在安装jdk10,下载后,双击dmg文件一直到安装完成,安装 ...
- angualrjs 配置超时时间
timeout 1 本想通过$httpProvider的defaults属性配置timeout时间, defaults中没有这个属性. https://docs.angularjs.org/api/n ...