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

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

於是,我一氣之下,爬取了學校的畢設題目,也順便學學爬蟲。
效果
爬取學校教學平台上所有的畢設題目,保存到本地數據庫中

思路
獲取要爬取頁面的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>
-
建表
想要保存序號,題目,學院,導師四個信息
-
代碼
- 實體類 Project
- 數據庫操作類 DataUtil
- 爬取主類
java爬蟲過程解析
進入學校的教務系統,找到了所有畢設題目

按下f12,查看網絡信息

從上圖可以得到我們要訪問的url,同時我們要拿到cookie信息,因為只有登錄后才能進來這個url,所以我們先用瀏覽器登錄上,然后復制當前cookie信息,通過代碼訪問url時附上該登錄信息。
Document document = Jsoup.connect(url).header("Cookie", cookie).get();
上面代碼中,url和cookie自行傳入

通過調試模式查看得知,訪問該url時,返回的不是json數據而是直接返回了HTML,因此我們需要去解析該頁面,從中找出我們想要的數據部分
首先,先定位表格所在的位置,找到他的嵌套關系,直接看源碼的嵌套關系如下圖紅色,也可以直接從瀏覽器的下方看到我點中的tr標簽的嵌套順序如下圖藍色

接着通過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方法。
就在此時,我發現了頁面保存的參數

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