一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Jsoup獲取全國地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)

Jsoup獲取全國地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)

2020-01-10 16:10liushaofeng JAVA教程

這篇文章主要介紹了Jsoup獲取全國地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)的相關(guān)資料,需要的朋友可以參考下

jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。

最近手頭在做一些東西,需要一個全國各地的地域數(shù)據(jù),從省市區(qū)到縣鎮(zhèn)鄉(xiāng)街道的。各種度娘,各種谷歌,都沒找到一個完整的數(shù)據(jù)。最后功夫不負(fù)有心人,總算找到一份相對來說比較完整的數(shù)據(jù),但是這里的數(shù)據(jù)也只是精確到鎮(zhèn)級別,沒有村一級的數(shù)據(jù)(后來通過分析數(shù)據(jù)源我知道了為什么,呵呵),在加上博主提供的有些數(shù)據(jù)存在冗余,對于有強(qiáng)迫癥和追求完美的我,心想著我一定要自己動手去把這部分?jǐn)?shù)據(jù)給爬取出來。

  上述博文中的內(nèi)容還算豐富,博主是用的是php來實現(xiàn)的,作為2015年度編程語言排行榜的第一位,我們也不能示弱啊,下面我就帶著大家一起來看看用java怎么從網(wǎng)頁當(dāng)中爬取我們想要的數(shù)據(jù)...

第一步、準(zhǔn)備工作(數(shù)據(jù)源+工具):

  數(shù)據(jù)源(截止目前最全面權(quán)威的官方數(shù)據(jù)):http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/

  爬取數(shù)據(jù)的工具(爬蟲工具):http://jsoup.org/

第二步、數(shù)據(jù)源分析:

  首先jsoup工具的使用我在這里就不做講解了,感興趣的可以自己動手去查閱。

  做開發(fā)就應(yīng)該多去了解一些軟件工具的使用,在平常開發(fā)過程中遇到了才知道從何下手,鼓勵大家多平時留意一些身邊的軟件工具,以備不時之需。在做這個東西以前,我也不知道jsoup要怎么用,但我知道jsoup可以用來干嘛,在我需要的用到的時候,再去查閱資料,自己學(xué)習(xí)。

  上述的數(shù)據(jù)源是2013年中華人民共和國國家統(tǒng)計局發(fā)布的,其準(zhǔn)確性和權(quán)威性不言而喻。

  接下來我們分析一下數(shù)據(jù)源的結(jié)構(gòu),先從首頁說起:    

Jsoup獲取全國地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)

通過分析首頁源碼我們可以得到如下3點:

1.頁面的整個布局是用的table標(biāo)簽來控制的,也就是說我們?nèi)绻ㄟ^jsoup來選擇超鏈接,那么一定要注意,上圖中不是只要標(biāo)注了省市地區(qū)的地方采用的才是表格,整個頁面中存在多個表格,因此是不可以直接通過表格

Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/");
Elements rowProvince = connect.select("table");

來解析數(shù)據(jù)的。

2.頁面中有超鏈接的部分有多少地方??赡苁枪俜娇紤]到了你們這種程序員需要獲取這樣的數(shù)據(jù)的原因吧,頁面很干凈,除開下方的備案號是多余的超鏈接,其他的鏈接可以直接爬取。

3.省份城市的數(shù)據(jù)規(guī)律。包含有效信息的表格的每一行都有一個class屬性provincetr,這個屬性很重要,至于為什么重要,請接著往下看;每一行數(shù)據(jù)中存在多個td標(biāo)簽,每一個td標(biāo)簽中包含一個a超鏈接,而這個超鏈接正是我們想要的超鏈接,超鏈接的文本即使省份(直轄市等)的名稱。

  再次我們再看一下一般的數(shù)據(jù)頁面(一般的數(shù)據(jù)頁面包括市級、縣級、鎮(zhèn)級這三級數(shù)據(jù)展示頁面):

  之所以要把上述三個頁面放在一起,是因為通過分析我們可以發(fā)現(xiàn),這三級數(shù)據(jù)的數(shù)據(jù)頁面完全一致,唯一不同的就是在html源碼數(shù)據(jù)表格中的數(shù)據(jù)行tr的class屬性不一致,分別對應(yīng)為:citytr,countrytrhe towntr。其他均一致。這樣我們就可以用一個通用的方法解決這三個頁面的數(shù)據(jù)爬取?! ?/p>

  

  接下來我們分析一下數(shù)據(jù)源的結(jié)構(gòu),先從首頁說起:  Jsoup獲取全國地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)

  最后看看村一級的數(shù)據(jù)頁面:  

Jsoup獲取全國地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村) 

   在村一級的數(shù)據(jù)中,和上述市縣鎮(zhèn)的數(shù)據(jù)格式不一致,這一級所表示的數(shù)據(jù)是最低一級的,所以不存在a鏈接,因此不能采用上面市縣鎮(zhèn)數(shù)據(jù)的爬取方式去爬取;這里展示數(shù)據(jù)的表格行的class為villagetr,除開這兩點以外,在每一行數(shù)據(jù)中包含三列數(shù)據(jù),第一列是citycode,第二列是城鄉(xiāng)分類(市縣鎮(zhèn)的數(shù)據(jù)格式不存在這一項),第三列是城市名稱。

   把握了以上各個要點之外,我們就可以開始編碼了。

第三步、編碼實現(xiàn):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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 org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
 * 全國省市縣鎮(zhèn)村數(shù)據(jù)爬取
 * @author liushaofeng
 * @date -- 上午::
 * @version ..
 */
public class JsoupTest
{
  private static Map<Integer, String> cssMap = new HashMap<Integer, String>();
  private static BufferedWriter bufferedWriter = null;
  static
  {
    cssMap.put(, "provincetr");// 省
    cssMap.put(, "citytr");// 市
    cssMap.put(, "countytr");// 縣
    cssMap.put(, "towntr");// 鎮(zhèn)
    cssMap.put(, "villagetr");// 村
  }
  public static void main(String[] args) throws IOException
  {
    int level = ;
    initFile();
    // 獲取全國各個省級信息
    Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm//");
    Elements rowProvince = connect.select("tr." + cssMap.get(level));
    for (Element provinceElement : rowProvince)// 遍歷每一行的省份城市
    {
      Elements select = provinceElement.select("a");
      for (Element province : select)// 每一個省份(四川省)
      {
        parseNextLevel(province, level + );
      }
    }
    closeStream();
  }
  private static void initFile()
  {
    try
    {
      bufferedWriter = new BufferedWriter(new FileWriter(new File("d:\\CityInfo.txt"), true));
    } catch (IOException e)
    {
      e.printStackTrace();
    }
  }
  private static void closeStream()
  {
    if (bufferedWriter != null)
    {
      try
      {
        bufferedWriter.close();
      } catch (IOException e)
      {
        e.printStackTrace();
      }
      bufferedWriter = null;
    }
  }
  private static void parseNextLevel(Element parentElement, int level) throws IOException
  {
    try
    {
      Thread.sleep();//睡眠一下,否則可能出現(xiàn)各種錯誤狀態(tài)碼
    } catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    Document doc = connect(parentElement.attr("abs:href"));
    if (doc != null)
    {
      Elements newsHeadlines = doc.select("tr." + cssMap.get(level));//
      // 獲取表格的一行數(shù)據(jù)
      for (Element element : newsHeadlines)
      {
        printInfo(element, level + );
        Elements select = element.select("a");// 在遞歸調(diào)用的時候,這里是判斷是否是村一級的數(shù)據(jù),村一級的數(shù)據(jù)沒有a標(biāo)簽
        if (select.size() != )
        {
          parseNextLevel(select.last(), level + );
        }
      }
    }
  }
  /**
  * 寫一行數(shù)據(jù)到數(shù)據(jù)文件中去
  * @param element 爬取到的數(shù)據(jù)元素
  * @param level 城市級別
  */
  private static void printInfo(Element element, int level)
  {
    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 Document connect(String url)
  {
    if (url == null || url.isEmpty())
    {
      throw new IllegalArgumentException("The input url('" + url + "') is invalid!");
    }
    try
    {
      return Jsoup.connect(url).timeout( * ).get();
    } catch (IOException e)
    {
      e.printStackTrace();
      return null;
    }
  }
}

數(shù)據(jù)爬取過程便是一個漫長的過程,只需要慢慢等待吧,呵呵,由于程序運行時間較長,請不要在控制臺打印輸出,否則可能會影響程序運行....

最終獲取到數(shù)據(jù)的格式如下("{}"中表示城市級別,"[]"中內(nèi)容表示城市編碼):

市轄區(qū){3}[110100000000]
東城區(qū){4}[110101000000]
東華門街道辦事處{5}[110101001000]
多福巷社區(qū)居委會{6}[110101001001]
銀閘社區(qū)居委會{6}[110101001002]
東廠社區(qū)居委會{6}[110101001005]
智德社區(qū)居委會{6}[110101001006]
南池子社區(qū)居委會{6}[110101001007]
黃圖崗社區(qū)居委會{6}[110101001008]
燈市口社區(qū)居委會{6}[110101001009]
正義路社區(qū)居委會{6}[110101001010]
甘雨社區(qū)居委會{6}[110101001011]
臺基廠社區(qū)居委會{6}[110101001013]
韶九社區(qū)居委會{6}[110101001014]
王府井社區(qū)居委會{6}[110101001015]
景山街道辦事處{5}[110101002000]
隆福寺社區(qū)居委會{6}[110101002001]
吉祥社區(qū)居委會{6}[110101002002]
黃化門社區(qū)居委會{6}[110101002003]
鐘鼓社區(qū)居委會{6}[110101002004]
魏家社區(qū)居委會{6}[110101002005]
汪芝麻社區(qū)居委會{6}[110101002006]
景山東街社區(qū)居委會{6}[110101002008]
皇城根北街社區(qū)居委會{6}[110101002009]
交道口街道辦事處{5}[110101003000]
交東社區(qū)居委會{6}[110101003001]
福祥社區(qū)居委會{6}[110101003002]
大興社區(qū)居委會{6}[110101003003]
府學(xué)社區(qū)居委會{6}[110101003005]
鼓樓苑社區(qū)居委會{6}[110101003007]
菊兒社區(qū)居委會{6}[110101003008]
南鑼鼓巷社區(qū)居委會{6}[110101003009]
安定門街道辦事處{5}[110101004000]
交北頭條社區(qū)居委會{6}[110101004001]
北鑼鼓巷社區(qū)居委會{6}[110101004002]
國子監(jiān)社區(qū)居委會{6}[110101004003]

......

拿到以上數(shù)據(jù)以后,自己想干什么都可以自我去實現(xiàn)了,以上的代碼可以直接運行,從數(shù)據(jù)源爬取后,可以直接轉(zhuǎn)換成自己所要的格式。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频在线观看一区二区三区 | 性白俄罗斯高清xxxxx | 深夜在线小视频 | 日韩日韩日韩手机看片自拍 | 日本中文字幕一区二区高清在线 | 青青热久久综合网伊人 | 99久久免费看精品国产一区 | 国内精品免费一区二区三区 | 国产精品美女久久久久网站 | 国产精品永久免费自在线观看 | 网红思瑞一区二区三区 | 奇米影视77777 | 亚洲免费在线观看 | 男男gaygays18中国 | 日本一级不卡一二三区免费 | 大学第一次基本都没了 | 黄瓜视频黄 | 色综合久久六月婷婷中文字幕 | 星星动漫无删减在线观看 | 欧美性色黄大片四虎影视 | 亚洲乱码一区二区三区国产精品 | 被黑人同学彻底征服全文小说阅读 | 4455四色永久免费 | 国产精品制服丝袜白丝www | 久久免费看少妇高潮A片2012 | 日本动漫黄网站在线观看 | 免费国产网站 | 成人免费观看网欧美片 | aaaa黄| 成人私人影院在线观看网址 | 亚洲国产欧美目韩成人综合 | 欧美成人tv在线观看免费 | 国产精品久久一区 | 免费超级乱淫播放手机版 | 亚洲成人国产精品 | 办公室恋情在线观看 | 免费特黄一区二区三区视频一 | 亚洲大爷操 | 俄罗斯13一14处出血视频在线 | 春光乍泄在线 | 日本片免费观看一区二区 |