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 抓取省市区的更多相关文章

  1. jsoup抓取网页内容

    java项目有时候我们需要别人网页上的数据,怎么办?我们可以借助第三方架包jsou来实现,jsoup的中文文档,那怎么具体的实现呢?那就跟我一步一步来吧 最先肯定是要准备好这个第三方架包啦,下载地址, ...

  2. jsoup抓取网页+具体解说

    jsoup抓取网页+具体解说 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目.我以前在 IBM DW 上发表过两篇关于 htmlparser 的文章.各自 ...

  3. Jsoup抓取网页数据完成一个简易的Android新闻APP

    前言:作为一个篮球迷,每天必刷NBA新闻.用了那么多新闻APP,就想自己能不能也做个简易的新闻APP.于是便使用Jsoup抓取了虎扑NBA新闻的数据,完成了一个简易的新闻APP.虽然没什么技术含量,但 ...

  4. 使用java开源工具httpClient及jsoup抓取解析网页数据

    今天做项目的时候遇到这样一个需求,需要在网页上展示今日黄历信息,数据格式如下 公历时间:2016年04月11日 星期一 农历时间:猴年三月初五 天干地支:丙申年 壬辰月 癸亥日 宜:求子 祈福 开光 ...

  5. Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

    需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...

  6. HttpClient+Jsoup 抓取网页信息(网易贵金属为例)

    废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...

  7. 使用jsoup抓取新闻信息

    1,jsoup简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和 ...

  8. HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件

    前言 首先先介绍一下Jsoup:(摘自官网) jsoup is a Java library for working with real-world HTML. It provides a very ...

  9. jsoup抓取借书记录

    package tushuguan; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; ...

随机推荐

  1. ubuntu下搭建android开发环境之超顺畅模拟器

    如果说android系统的卡,像耳边蚊子让人抓狂,那么android模拟器的卡,那就像午睡时的苍蝇.大概就是一样的恶心~~ 那么,这样的问题对于开发者肯定忍无可忍,我也一样,虽然我还没有入门,但我也一 ...

  2. Android中的Handler介绍

    一.Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控 ...

  3. hibernate方言

    hibernate中,方言是解决hql翻译成sql保证语法的正确,首先数据库都是支持sql的,不同的数据库会存在一些语法上面的差异.HQL则是基于对象的查询语言,当系统需要数据库的变换时,那么用hib ...

  4. yii2 定义友好404

    1.frontend->config->main.php添加如下: 'errorHandler' => [ 'errorAction' => 'site/error', ], ...

  5. Fiddldr 教程之:HTTP协议详解(转)

    原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...

  6. Actor模型文章收集

    参与者模式——维基百科 Akka.Net——github开源项目 Actor原理——比较深入的文章

  7. 暂停、恢复CALayer 动画

    CALayer都是实现了CAMediaTiming协议(或者叫做接口).所以layer的动画有一个很有意思的属性speed.如果一个layer的动画速度变成0.0的时候,很显然这个动画就不再动了.设置 ...

  8. 编写高质量代码改善C#程序的157个建议——建议125:避免用FCL的类型名称命名自己的类型

    建议125:避免用FCL的类型名称命名自己的类型 试想过自己写一个Socket类型吗?如果没有,我们来尝试一下: public class Socket { //省略 } 把以上代码同某些其他工具类封 ...

  9. 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

    内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...

  10. no getter for property named 'power_state

    错误信息:nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for pr ...