日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
只聽說過用Python做爬蟲,Java程序員笑了!

網(wǎng)絡(luò)爬蟲技術(shù),早在萬維網(wǎng)誕生的時候,就已經(jīng)出現(xiàn)了,今天我們就一起來揭開它神秘的面紗!

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的邢臺網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

一、摘要

說起網(wǎng)絡(luò)爬蟲,相信大家都不陌生,又俗稱網(wǎng)絡(luò)機(jī)器人,指的是程序按照一定的規(guī)則,從互聯(lián)網(wǎng)上抓取網(wǎng)頁,然后從中獲取有價(jià)值的數(shù)據(jù),隨便在網(wǎng)上搜索一下,排在前面基本都是 pyhton 教程介紹。

的確,pyhton 在處理網(wǎng)頁方面,有著開發(fā)簡單、便捷、性能高效的優(yōu)勢!

但是我們 java 也不賴,在處理復(fù)雜的網(wǎng)頁方面,需要解析網(wǎng)頁內(nèi)容生成結(jié)構(gòu)化數(shù)據(jù)或者對網(wǎng)頁內(nèi)容精細(xì)的解析時,java 可以說更勝一籌!

下面我們以爬取國家省市區(qū)信息為例,使用 java 技術(shù)來實(shí)現(xiàn),過程主要分三部:

  • 第一步:目標(biāo)網(wǎng)頁分析
  • 第二步:編寫爬蟲程序,對關(guān)鍵數(shù)據(jù)進(jìn)行抓取
  • 第三步:將抓取的數(shù)據(jù)寫入數(shù)據(jù)庫

廢話不多說,直接開擼!

二、網(wǎng)頁分析

網(wǎng)絡(luò)爬蟲,其實(shí)不是一個很難的技術(shù),只是需要掌握的技術(shù)內(nèi)容比較多,只會 java 技術(shù)是遠(yuǎn)遠(yuǎn)不夠,還需要熟悉 html 頁面屬性!

以爬取國家省市區(qū)信息為例,我們可以直接在百度上搜索國家省市區(qū),點(diǎn)擊進(jìn)入全國行政區(qū)劃信息查詢平臺。

在民政數(shù)據(jù)菜單欄下,找到最新的行政區(qū)域代碼公示欄。

點(diǎn)擊進(jìn)去,展示結(jié)果如下!

可以很清楚的看到,這就是我們要獲取省市區(qū)代碼的網(wǎng)頁信息。

可能有的同學(xué)會問,這么直接干合不合法?

國家既然已經(jīng)公示了,我們直接拿來用就可以,完全合法!而且國家省市區(qū)代碼是一個公共字典,在很多業(yè)務(wù)場景下必不可少!

當(dāng)我們找到了目標(biāo)網(wǎng)頁之后,我們首先要做的就是對網(wǎng)頁進(jìn)行分析,打開瀏覽器調(diào)試器,可以很清晰的看到它是一個table表格組成的數(shù)據(jù)。

熟悉 html 標(biāo)簽的同學(xué),想必已經(jīng)知道了它的組成原理。

其實(shí)table是一個非常簡單的 html 標(biāo)簽,主要有tr和td組成,其中tr代表行,td代表列,例如用table標(biāo)簽畫一個學(xué)生表格,代碼如下:

 
 
 
 
  1.  
  2.  
  3.   
  4.   
  5.  
  6.  
  7.  
  8.   
  9.   
  10.  
  11.  
  12.   
  13.   
  14.  
  15. 編號 姓名
    100 張三
    101 李四

 展示結(jié)果如下:

了解了table標(biāo)簽之后,我們再對網(wǎng)頁進(jìn)行詳細(xì)分析。

首先對整個內(nèi)容進(jìn)行觀察,很容易的看到,市級以上(包括市級),都是黑體字加粗的,區(qū)或者縣級地區(qū),都是常規(guī)!

出現(xiàn)這個現(xiàn)象,其實(shí)是由樣式標(biāo)簽CSS來控制的,點(diǎn)擊北京市,找到對應(yīng)的代碼位置,從圖中我們可以很清晰的看到,市級對應(yīng)的樣式class為xl7030796,區(qū)或者縣級地區(qū)對應(yīng)的樣式class為xl7130796

除此之外,我們繼續(xù)來看看省和市級的區(qū)別!

可以很清晰的看到,市級相比省級信息,多了一個span占位符標(biāo)簽。

于是,我們可以得出如下結(jié)論:

省級信息,樣式標(biāo)簽為xl7030796

市級信息,樣式標(biāo)簽為xl7030796,同時包含span占位符標(biāo)簽

區(qū)或者縣級信息,樣式標(biāo)簽為xl7130796

等會會通過這些規(guī)律信息來從網(wǎng)頁信息中抓取省、市、區(qū)信息。

三、編寫爬蟲程序

3.1、創(chuàng)建項(xiàng)目

新建一個基于 maven 工程 java 項(xiàng)目,在pom.xml工程中引入如下 jar 包!

 
 
 
 
  1.     org.jsoup
  2.     jsoup
  3.     1.11.2

3.2、編寫爬取程序

先創(chuàng)建一個實(shí)體數(shù)據(jù)類,用于存放抓取的數(shù)據(jù)

 
 
 
 
  1. public class ChinaRegionsInfo {
  2.     /**
  3.      * 行政區(qū)域編碼
  4.      */
  5.     private String code;
  6.     /**
  7.      * 行政區(qū)域名稱
  8.      */
  9.     private String name;
  10.     /**
  11.      * 行政區(qū)域類型,1:省份,2:城市,3:區(qū)或者縣城
  12.      */
  13.     private Integer type;
  14.     /**
  15.      * 上一級行政區(qū)域編碼
  16.      */
  17.     private String parentCode;
  18.     //省略get、set
  19. }

然后,我們來編寫爬取代碼,將抓取的數(shù)據(jù)封裝到實(shí)體類中

 
 
 
 
  1. //需要抓取的網(wǎng)頁地址
  2. private static final String URL = "http://www.mca.gov.cn//article/sj/xzqh/2020/202006/202008310601.shtml";
  3. public static void main(String[] args) throws IOException {
  4.     List regionsInfoList = new ArrayList<>();
  5.  //抓取網(wǎng)頁信息
  6.     Document document = Jsoup.connect(URL).get();
  7.  //獲取真實(shí)的數(shù)據(jù)體
  8.     Element element = document.getElementsByTag("tbody").get(0);
  9.     String provinceCode = "";//省級編碼
  10.     String cityCode = "";//市級編碼
  11.     if(Objects.nonNull(element)){
  12.         Elements trs = element.getElementsByTag("tr");
  13.         for (int i = 3; i < trs.size(); i++) {
  14.             Elements tds = trs.get(i).getElementsByTag("td");
  15.             if(tds.size() < 3){
  16.                 continue;
  17.             }
  18.             Element td1 = tds.get(1);//行政區(qū)域編碼
  19.             Element td2 = tds.get(2);//行政區(qū)域名稱
  20.             if(StringUtils.isNotEmpty(td1.text())){
  21.                 if(td1.classNames().contains("xl7030796")){
  22.                     if(td2.toString().contains("span")){
  23.                         //市級
  24.                         ChinaRegionsInfo chinaRegions = new ChinaRegionsInfo();
  25.                         chinaRegions.setCode(td1.text());
  26.                         chinaRegions.setName(td2.text());
  27.                         chinaRegions.setType(2);
  28.                         chinaRegions.setParentCode(provinceCode);
  29.                         regionsInfoList.add(chinaRegions);
  30.                         cityCode = td1.text();
  31.                     } else {
  32.                         //省級
  33.                         ChinaRegionsInfo chinaRegions = new ChinaRegionsInfo();
  34.                         chinaRegions.setCode(td1.text());
  35.                         chinaRegions.setName(td2.text());
  36.                         chinaRegions.setType(1);
  37.                         chinaRegions.setParentCode("");
  38.                         regionsInfoList.add(chinaRegions);
  39.                         provinceCode = td1.text();
  40.                     }
  41.                 } else {
  42.                     //區(qū)或者縣級
  43.                     ChinaRegionsInfo chinaRegions = new ChinaRegionsInfo();
  44.                     chinaRegions.setCode(td1.text());
  45.                     chinaRegions.setName(td2.text());
  46.                     chinaRegions.setType(3);
  47.                     chinaRegions.setParentCode(StringUtils.isNotEmpty(cityCode) ? cityCode : provinceCode);
  48.                     regionsInfoList.add(chinaRegions);
  49.                 }
  50.             }
  51.         }
  52.     }
  53.     //打印結(jié)果
  54.     System.out.println(JSONArray.toJSONString(regionsInfoList));
  55. }

運(yùn)行程序,輸出結(jié)果如下:

json解析結(jié)果如下:

至此,網(wǎng)頁有效數(shù)據(jù)已經(jīng)全部抓取完畢!

四、寫入數(shù)據(jù)庫

在實(shí)際的業(yè)務(wù)場景中,我們需要做的不僅僅只是抓取出有價(jià)值的數(shù)據(jù),最重要的是將這些數(shù)據(jù)記錄數(shù)據(jù)庫,以備后續(xù)的業(yè)務(wù)可以用的上!

例如,當(dāng)我們在開發(fā)一個給員工發(fā)放薪資系統(tǒng)的時候,其中的社保、公積金,可能每個城市都不一樣,這個時候就會到國家省市區(qū)編碼。

因此,我們可以將抓取的國家省市區(qū)編碼寫入數(shù)據(jù)庫!

在上面,我們已經(jīng)將具體的省市區(qū)數(shù)據(jù)結(jié)構(gòu)封裝成數(shù)組對象,寫入過程也很簡單。

首先,創(chuàng)建一張國家行政地域信息表china_regions

 
 
 
 
  1. CREATE TABLE `china_regions` (
  2.   `id` bigint(20) unsigned NOT NULL COMMENT '主鍵ID',
  3.   `code` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '行政地域編碼',
  4.   `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '行政地域名稱',
  5.   `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '行政地域類型,1:省份,2:城市,3:區(qū)域',
  6.   `parent_code` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '上一級行政編碼',
  7.   `is_delete` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否刪除 1:已刪除;0:未刪除',
  8.   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  9.   `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  10.   PRIMARY KEY (`id`),
  11.   KEY `idx_code` (`code`) USING BTREE,
  12.   KEY `idx_name` (`name`) USING BTREE,
  13.   KEY `idx_type` (`type`) USING BTREE,
  14.   KEY `idx_parent_code` (`parent_code`) USING BTREE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='國家行政地域信息表';

搭建一個springboot工程,通過mybatis-plus組件,一鍵生成代碼

最后,配置好數(shù)據(jù)源,重新封裝數(shù)組對象,調(diào)用批量插入方法,即可插入操作

 
 
 
 
  1. chinaRegionsService.saveBatch(regionsInfoList);

插入執(zhí)行完之后,數(shù)據(jù)庫結(jié)果如下

至此,大部分工作基本已經(jīng)完成!

但是,細(xì)心的你,可能會發(fā)現(xiàn)還有數(shù)據(jù)問題,因?yàn)槲覀儑以谑〖墔^(qū)域上,還有一個直轄市的概念,以北京市為例,在數(shù)據(jù)庫中type類型為1,表示省級類型,但是它的子級是一個區(qū),中間還掉了一層市級類型。

因此,我們還需要對這些直轄市類型的數(shù)據(jù)進(jìn)行修復(fù),查詢出所有的直轄市類型的城市。

對這些編號的城市,單獨(dú)處理,中間加一層市級類型!

至此,國家省市區(qū)編碼數(shù)據(jù)字典,全部處理完畢!

五、總結(jié)

本篇主要以爬取國家省市區(qū)編號為例,以 java 技術(shù)為背景進(jìn)行講解,在整個爬取過程中,最重要的一部分就是網(wǎng)頁分析,找出規(guī)律,然后通過jsoup工具包解析網(wǎng)頁,獲取其中的有效數(shù)據(jù)。

同時,技術(shù)是一把雙面刀,希望同學(xué)們能正當(dāng)使用!

七、參考

1、2020年行政區(qū)劃代碼

2、jsoup -中文文檔


網(wǎng)頁標(biāo)題:只聽說過用Python做爬蟲,Java程序員笑了!
URL標(biāo)題:http://m.5511xx.com/article/ccspdes.html