java爬蟲爬取學校畢設題目


 

 

背景

  最近很多大四學生問我畢業設計如何選題
  “你覺得圖書管理系統怎么樣?”
  “導師不讓做這個,說太簡單”
  “那你覺得二手交易平台怎么樣?”
  “導師說沒新意,都有咸魚了你做這個有什么意思?要新穎的”
  “那你覺得個人博客平台的搭建怎么樣?”
  “啥是博客?”
  “emmmm……在線售票怎么樣?”
  “導師說今年不讓選xx管理系統,這些都太簡單”

 

   enter description here

 

 

  “那你覺得做人臉識別或者垃圾自動分類怎么樣”
  “導師說這些太難了,我肯定做不出來”

 

   enter description here

 

 

  於是,我一氣之下,爬取了學校的畢設題目,也順便學學爬蟲。

效果

  爬取學校教學平台上所有的畢設題目,保存到本地數據庫中

 

   enter description here
 

 

思路

  獲取要爬取頁面的url,爬取數據,發現返回的是HTML,利用jsoup做HTML的解析,從中找出需要的部分,保存進數據庫。
jsoup是用來解析HTML的,具體使用可以參考官網文檔:https://jsoup.org/

代碼准備

  • 依賴(jar包)

    解析HTML需要用到jsoup,數據庫操作用dbutils,數據庫連接池c3p0,數據庫驅動
  <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.12.1</version>
    </dependency>
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>

  

  • 建表

    想要保存序號,題目,學院,導師四個信息

     

    enter description here

     

     

  • 代碼

    • 實體類 Project

     

    enter description here

     

     

    • 數據庫操作類 DataUtil

     

    enter description here

     

     

    • 爬取主類

     


     

     

java爬蟲過程解析

  進入學校的教務系統,找到了所有畢設題目

 

   enter description here

 

 

  按下f12,查看網絡信息

 

   enter description here

 

 

  從上圖可以得到我們要訪問的url,同時我們要拿到cookie信息,因為只有登錄后才能進來這個url,所以我們先用瀏覽器登錄上,然后復制當前cookie信息,通過代碼訪問url時附上該登錄信息。

 Document document = Jsoup.connect(url).header("Cookie", cookie).get();

 

  上面代碼中,url和cookie自行傳入

 

   enter description here

 

 

  通過調試模式查看得知,訪問該url時,返回的不是json數據而是直接返回了HTML,因此我們需要去解析該頁面,從中找出我們想要的數據部分

  首先,先定位表格所在的位置,找到他的嵌套關系,直接看源碼的嵌套關系如下圖紅色,也可以直接從瀏覽器的下方看到我點中的tr標簽的嵌套順序如下圖藍色

 

   enter description here

 

 

  接着通過select方法,我們可以根據css選擇器和標簽類型一步步定位到我們要的部分

Elements elements = document.select("div.Nsb_pw > div.Nsb_layout_r > form > table > tbody > tr");

  最后遍歷elements,拿到其中的元素賦值給project對象,然后進行保存。這里我是定位到了標簽,也就是說elements返回的是所有的tr標簽元素。因此,拿到的elements其實相當於一個集合,里面的每一個元素,是一個tr標簽及其內部全部內容。
  elements.child(int index)方法,是得到其子元素,也就是說td標簽
  接着調用ownText()方法得到該元素的文本內容。

for(int j=1;j<elements.size();j++){
  Project project=new Project(id++,elements.get(j).child(1).ownText(),elements.get(j).child(2).ownText(),elements.get(j).child(3).ownText());
  DataUtil.insert(project);
  System.out.println(elements.get(j).child(1).ownText());
 }

  

  下面是表格的源碼,看完源碼就可以理解我為什么要這么寫了。第一個tr表示表格標題,所以跳過;我們只想得到題目,學院,導師的信息,因此調用child方法時傳參分別為1,2,3

 


 

 

如何解決分頁問題

  系統用了分頁,每次訪問時默認都返回的是第一頁的十條數據,通過查看源碼我發現,下一頁按鈕對應的是一個js方法,於是我百度找了好久,想通過代碼去執行“下一頁”功能的那個js方法。
  就在此時,我發現了頁面保存的參數

 

   enter description here

 

 

  哦?既然有當前頁碼數,那是否意味着我在url后面加上這個參數就可以訪問到任意頁面的數據,於是我試了一下用以下url:http://jwxt.qlu.edu.cn/jsxsd/bysj/xsxt.do?pageIndex=15
  我擦,真的訪問到了第十五頁。那還百度個屁啊。於是就有了這段代碼,循環搞定url

 

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM