Hello大家好,本章學習如何爬取豆瓣書籍資訊。有問題可以聯絡我mr_beany@163.com。另求各路大神指點,感謝
前幾天(其實是好久之前)答應大家寫一篇關於爬蟲的文章,沒印象的可以看一下這篇文章,防止XSS攻擊,沒想到一拖就到了19年,先給大家拜個早年,祝大家年終獎大大的有(微笑臉?)
正巧近幾天手裡有一個小型圖書管理系統,其中有匯入書籍基本資訊一項,我這麼懶的人怎麼可能去網上查然後複製貼上錄入系統呢!於是,這篇文章就誕生了(其實我是為了廣大爬蟲小白簡單介紹一下啦,你們懂的!)
好了,廢話不多說,我們直接開始吧!
一:引入Jsoup依賴
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>複製程式碼
二:確立目標
新的一年,我一定要不間斷寫文章,堅持更新技術,繼續找物件,繼續尋找不脫髮方案.......
不好意思,走錯片場了。首先我們需要確定我們需要爬取哪些書籍資訊(定好目標好下手啊)
開啟豆瓣讀書,搜尋《明朝那些事》,嗯....隨意,其他的也可以,類別選擇書籍,我們可以看到如下頁面
點選第一個吧,可以看到如下書籍資訊
好,我們鎖定目標,我們需要抓取書籍的封面圖片,作者,豆瓣評分,內容介紹(夠了,這幾樣掌握了其他的可以舉一反三)
三:頁面分析
該步驟為爬蟲最重要的一步,通過分析網頁佈局DOM來判斷我們需要的資料所在的DOM。
通過瀏覽器,我們可以非常清楚的發現整個DOM渲染的層級關係。
其中Url為我們的搜尋路徑,那麼我們的搜尋路徑就可以是:
https://www.douban.com/search?cat=1001&q=書籍名稱複製程式碼
通過點選書籍名稱,發現跳轉到書籍詳情頁,檢查DOM,可以發現如下結構
好,基本思路確認,我們接下來開始程式設計工作。
四:編碼
建立CrawlerDoubanUtils.java
public static String getSearchUrl(String bookName){
return "https://www.douban.com/search?cat=1001&q="+bookName;
}
/**
* 根據書名獲取搜尋結果頁dom
* @param url 請求路徑
* @return
*/
public static Document getDom(String url){
try{
//獲取頁面元素dom 其中.get()為發起get請求
Document doc = Jsoup.connect(url).get();
return doc;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 獲取具體某個書籍的跳轉路徑
* @param doc 頁面dom
* @param index 取書籍資訊序號
* @return
*/
public static String getBookItemUrl(Document doc,int index){
//根據class來獲取元素 .get為獲取第幾個dom
Element element = doc.getElementsByClass("result").get(index);
//.first()為獲取第一個dom
Element element1 = element.getElementsByClass("title").first();
//.getElementsByTag()為根據標籤來獲取dom
Element element2 = element1.getElementsByTag("a").first();
//.attr()獲取標籤中某個屬性的值
return element2.attr("href");
}
public static void main(String[] args){
String url = getSearchUrl("明朝那些事");
Document doc = getDom(url);
System.out.println(getBookItemUrl(doc,0));
}複製程式碼
以下為輸出結果:
https://www.douban.com/link2/?url=https%3A%2F%2Fbook.douban.com%2Fsubject%2F1873231%2F&query=%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B&cat_id=1001&type=search&pos=1 複製程式碼
根據地址開啟瀏覽器,頁面成功跳轉到書籍詳情頁,但是我們發現url地址發生了重定向,所以我們需要拿到重定向之後的地址。
public static String getUrl(String str){
String realUrl = "";
try {
URL url = new URL(str);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.getResponseCode();
realUrl=conn.getURL().toString();
conn.disconnect();
}catch (Exception e){
e.printStackTrace();;
}
return realUrl;
}複製程式碼
public static void main(String[] args){
String url = getSearchUrl("明朝那些事");
Document doc = getDom(url);
System.out.println(getUrl(getBookItemUrl(doc,0)));
}複製程式碼
輸出結果為:
https://book.douban.com/subject/1873231/複製程式碼
ok,成功拿到詳情頁路徑,接下來根據上面的經驗來繼續擼程式碼
/**
* 獲取圖書封面圖片
* @param doc
* @return
*/
public static String getBookCoverImg(Document doc){
String bookCoverImg = "";
try {
Element element = doc.getElementById("mainpic");
Element element1 = element.getElementsByTag("a").first();
Element element2 = element1.getElementsByTag("img").first();
return element2.attr("src");
}catch (Exception e){
e.printStackTrace();
}
return bookCoverImg;
}
/**
* 獲取圖書作者
* @param doc
* @return
*/
public static String getBookAuhor(Document doc){
String bookAuthor = "";
try {
Element element = doc.getElementById("info");
Element element1 = element.getElementsByTag("a").first();
//.text()為獲取dom中文字資訊
return element1.text();
}catch (Exception e){
e.printStackTrace();
}
return bookAuthor;
}
/**
* 獲取豆瓣評分
* @param doc
* @return
*/
public static String getDoubanScore(Document doc){
String doubanScore = "";
try {
Element element = doc.getElementsByClass("rating_num").first();
return element.text();
}catch (Exception e){
e.printStackTrace();
}
return doubanScore;
}
/**
* 獲取書籍簡介
* @param doc
* @return
*/
public static String getBookIntroduction(Document doc){
String articleIntroduction = "";
try {
Element element = doc.getElementsByClass("intro").first();
return element.text();
}catch (Exception e){
e.printStackTrace();
}
return articleIntroduction;
}
public static String getBookDetailsUrl(String bookName){
String url = getSearchUrl(bookName);
Document doc = getDom(url);
return getUrl(getBookItemUrl(doc,0));
}
public static void main(String[] args){
String url = getBookDetailsUrl("明朝那些事");
Document doc = getDom(url);
System.out.println(getBookIntroduction(doc));
}複製程式碼
經過測試,均能獲取到對應的資訊。
結尾
祝大家新年快樂。感謝支援!
其他文章:
碼雲地址: gitee.com/beany/mySpr…
GitHub地址: github.com/MyBeany/myS…