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…