java爬取豆瓣书籍信息

1,660 阅读4分钟
Hello大家好,本章学习如何爬取豆瓣书籍信息。有问题可以联系我mr_beany@163.com。另求各路大神指点,感谢

前几天(其实是好久之前)答应大家写一篇关于爬虫的文章,没印象的可以看一下这篇文章,防止XSS攻击,没想到一拖就到了19年,先给大家拜个早年,祝大家年终奖大大的有(微笑脸😀)

正巧近几天手里有一个小型图书管理系统,其中有导入书籍基本信息一项,我这么懒的人怎么可能去网上查然后复制粘贴录入系统呢!于是,这篇文章就诞生了(其实我是为了广大爬虫小白简单介绍一下啦,你们懂的!)

好了,废话不多说,我们直接开始吧!

一:引入Jsoup依赖

<dependency>
   <groupId>org.jsoup</groupId>
   <artifactId>jsoup</artifactId>
   <version>1.10.2</version>
</dependency>
 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jS的操作方法来取出和操作数据。

二:确立目标

新的一年,我一定要不间断写文章,坚持更新技术,继续找对象,继续寻找不脱发方案.......

不好意思,走错片场了。首先我们需要确定我们需要爬取哪些书籍信息(定好目标好下手啊)

打开豆瓣读书,搜索《明朝那些事》,嗯....随意,其他的也可以,类别选择书籍,我们可以看到如下页面


点击第一个吧,可以看到如下书籍信息


好,我们锁定目标,我们需要抓取书籍的封面图片,作者,豆瓣评分,内容介绍(够了,这几样掌握了其他的可以举一反三)

三:页面分析

该步骤为爬虫最重要的一步,通过分析网页布局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));
}

经过测试,均能获取到对应的信息。


结尾

祝大家新年快乐。感谢支持!


其他文章:

从零搭建自己的springboot后台框架

码云地址: gitee.com/beany/mySpr…

GitHub地址: github.com/MyBeany/myS…