package com.xazhxc.htjcom.back.controller.base; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xazhxc.htjcom.entity.Citys;
import com.xazhxc.htjcom.init.HttpServerInit;
import com.xazhxc.htjcom.kit.Kits;
import com.xazhxc.htjcom.kit.PropsKit;
import com.xazhxc.htjcom.kit.UploadKit;
import com.xazhxc.htjcom.service.CitysService;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.tio.core.ChannelContext;
import org.tio.core.GroupContext;
import org.tio.http.common.HttpRequest;
import org.tio.http.common.HttpResponse;
import org.tio.http.common.UploadFile;
import org.tio.http.server.annotation.RequestPath;
import org.tio.http.server.mvc.Routes;
import org.tio.http.server.util.Resps; import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* 公共类
*
* @author leizhen.wang
*/
@RequestPath(value = "/base")
@Slf4j
public class BaseController {
static CitysService citysService = Kits.getBean( CitysService.class);
@Mapper
ProductService productService; private static Map<Integer, String> cssMap = new HashMap<Integer, String>();
private static BufferedWriter bufferedWriter = null;
static {
cssMap.put(1, "provincetr");// 省
cssMap.put(2, "citytr");// 市
cssMap.put(3, "countytr");// 市
}
@RequestPath(value = "/pro")
public HttpResponse product(HttpRequest request) throws IOException { new Thread(() -> {
try {
initFile();
Document connect = Jsoup.connect( "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2017/" ).get();
int level = 1;
Elements rowProvince = connect.select("tr." + cssMap.get(level));
for (Element provinceElement : rowProvince) {
Elements select = provinceElement.select("a");
for (Element province : select) {
try {
parseNextLevel(province, level + 1, null, null);
} catch (IOException e) {
e.printStackTrace();
}
// System.out.println("----province-----"+province);
}
}
closeStream();
} catch (IOException e) {
e.printStackTrace();
}
}).start(); return Resps.json( request, Kits.result().ok() );
} private static void closeStream() {
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} private static void parseNextLevel(Element parentElement, int level, String code, String area) throws IOException {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} String attr = parentElement.attr( "abs:href" );
if (StrUtil.isEmpty( code )) {
code = attr.substring( 54,56 )+"0000";
}
// Citys citys = new Citys(String.valueOf( SnowFlakeUtil.getFlowIdInstance().nextId() ), code, parentElement.text(), "-1");
// citysService.insert( citys );
Document doc = Jsoup.connect( attr).get();
if (doc != null) {
Elements newsHeadlines = doc.select("tr." + cssMap.get(level));
for (Element element : newsHeadlines) {
if (StrUtil.isEmpty( area )) {
// printInfo(element, level + 1, code);
} else {
printInfo2(element, level + 1, code);
}
Elements select = element.select("a");// 在递归调用的时候,这里是判断是否是村一级的数据,村一级的数据没有a标签
// System.out.println(select);
if (select.size() != 0) {
code = element.select("td").first().text();
parseNextLevel2(select.last(), level + 1, code, "area");
}
}
} } private static void parseNextLevel2(Element parentElement, int level, String code, String area) throws IOException {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
String attr = parentElement.attr( "abs:href" );
if (StrUtil.isEmpty( code )) {
code = attr.substring( 54,56 )+"0000";
}
Document doc = Jsoup.connect( attr).get();
if (doc != null) {
Elements newsHeadlines = doc.select("tr." + cssMap.get(level));
for (Element element : newsHeadlines) {
printInfo2(element, level + 1, code);
}
} } private static void initFile() throws IOException {
bufferedWriter = new BufferedWriter(new FileWriter(new File("d:\\CityInfo.txt"), true));
}
private static void printInfo(Element element, int level, String pid) {
// System.out.println(pid + "---: "+element.select("td").last().text()+"============="+element.select("td").first().text());
Citys citys = new Citys(String.valueOf( SnowFlakeUtil.getFlowIdInstance().nextId() ), element.select("td").first().text(), element.select("td").last().text(), pid);
citysService.insert( citys );
/*try {
bufferedWriter.write(element.select("td").last().text() + "{" + level + "}["
+ element.select("td").first().text() + "]");
bufferedWriter.newLine();
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}*/
} private static void printInfo2(Element element, int level, String pid) {
// System.out.println(pid + "---: "+element.select("td").last().text()+"============="+element.select("td").first().text());
Citys citys = new Citys(String.valueOf( SnowFlakeUtil.getFlowIdInstance().nextId() ), element.select("td").first().text(), element.select("td").last().text(), pid);
citysService.insert( citys );
/*try {
bufferedWriter.write(element.select("td").last().text() + "{" + level + "}["
+ element.select("td").first().text() + "]");
bufferedWriter.newLine();
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}*/
} }
jsoup 抓取省市区的更多相关文章
-
jsoup抓取网页内容
java项目有时候我们需要别人网页上的数据,怎么办?我们可以借助第三方架包jsou来实现,jsoup的中文文档,那怎么具体的实现呢?那就跟我一步一步来吧 最先肯定是要准备好这个第三方架包啦,下载地址, ...
-
jsoup抓取网页+具体解说
jsoup抓取网页+具体解说 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目.我以前在 IBM DW 上发表过两篇关于 htmlparser 的文章.各自 ...
-
Jsoup抓取网页数据完成一个简易的Android新闻APP
前言:作为一个篮球迷,每天必刷NBA新闻.用了那么多新闻APP,就想自己能不能也做个简易的新闻APP.于是便使用Jsoup抓取了虎扑NBA新闻的数据,完成了一个简易的新闻APP.虽然没什么技术含量,但 ...
-
使用java开源工具httpClient及jsoup抓取解析网页数据
今天做项目的时候遇到这样一个需求,需要在网页上展示今日黄历信息,数据格式如下 公历时间:2016年04月11日 星期一 农历时间:猴年三月初五 天干地支:丙申年 壬辰月 癸亥日 宜:求子 祈福 开光 ...
-
Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息
需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...
-
HttpClient+Jsoup 抓取网页信息(网易贵金属为例)
废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...
-
使用jsoup抓取新闻信息
1,jsoup简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和 ...
-
HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件
前言 首先先介绍一下Jsoup:(摘自官网) jsoup is a Java library for working with real-world HTML. It provides a very ...
-
jsoup抓取借书记录
package tushuguan; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; ...
随机推荐
-
Quartz.NET
http://www.360doc.com/userhome.aspx?userid=11741424&cid=2#
-
jquery getJSON
function onNodeClick(data) { //只能选择体检分组 if (data.GroupType == 1) { ...
-
Canu Parameter Reference(canu参数介绍)
链接:Canu Parameter Reference To get the most up-to-date options, run canu -options The default values ...
-
iOS8 超简单的设置圆角按钮 ImageView等UIView
button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...
-
C# 汉字的字符串截取指定字节的长度
int index = 0; int setCharCount = 74; string str1 = "三星 SCH-I829 电信3G手机(优 ...
-
HDU 1005(周期问题)
HDU 1005 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descript ...
-
POJ1135_Domino Effect(最短)
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8224 Accepted: 2068 Des ...
-
201621123043 《Java程序设计》第2周学习总结
1.本周学习总结 使用jdk文档查阅函数功能及代码 用switch语句是在每个case中可能在第一行是sc.nextLine;来给回车赋值: 在使用循环的时候要注意循环返回的条件,否则陷入死循环可能会 ...
-
FFMPEG中关于ts流的时长估计的实现(转)
最近在做H.265 编码,原本只是做编码器的实现,但客户项目涉及到ts的封装,搞得我不得不配合了解点ts方面的东西.下面技术文档不错,转一下. ts流中的时间估计 我们知道ts流中是没有时间信息的,我 ...
-
Python 数据分析 - 索引和选择数据
loc,iloc,ix三者间的区别和联系 loc .loc is primarily label based, but may also be used with a boolean array. 就 ...