Hello你們好,本章學習如何爬取豆瓣書籍信息。有問題能夠聯繫我mr_beany@163.com。另求各路大神指點,感謝
前幾天(實際上是很久以前)答應你們寫一篇關於爬蟲的文章,沒印象的能夠看一下這篇文章,防止XSS攻擊,沒想到一拖就到了19年,先給你們拜個早年,祝你們年終獎大大的有(微笑臉😀)java
正巧近幾天手裏有一個小型圖書管理系統,其中有導入書籍基本信息一項,我這麼懶的人怎麼可能去網上查而後複製粘貼錄入系統呢!因而,這篇文章就誕生了(其實我是爲了廣大爬蟲小白簡單介紹一下啦,大家懂的!)git
好了,廢話很少說,咱們直接開始吧!github
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>複製代碼
新的一年,我必定要不間斷寫文章,堅持更新技術,繼續找對象,繼續尋找不脫髮方案.......spring
很差意思,走錯片場了。首先咱們須要肯定咱們須要爬取哪些書籍信息(定好目標好下手啊)編程
打開豆瓣讀書,搜索《明朝那些事》,嗯....隨意,其餘的也能夠,類別選擇書籍,咱們能夠看到以下頁面瀏覽器
點擊第一個吧,能夠看到以下書籍信息springboot
好,咱們鎖定目標,咱們須要抓取書籍的封面圖片,做者,豆瓣評分,內容介紹(夠了,這幾樣掌握了其餘的能夠觸類旁通)bash
該步驟爲爬蟲最重要的一步,經過分析網頁佈局DOM來判斷咱們須要的數據所在的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…