`
MouseLearnJava
  • 浏览: 459533 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

豆瓣API获取图书信息

阅读更多
在本篇文章中,主要是通过豆瓣API实现获取图书信息的小功能。

一. 豆瓣API能干什么?

参考链接:[url]http://www.douban.com/service/ [/url]

豆瓣API是豆瓣为第三方开发人员提供的编程接口。利用豆瓣API,你可以在你的网站或程序中使用豆瓣的数据和功能.目前的豆瓣API支持的功能包括:

  • 搜索并查看书籍、电影、音乐信息
  • 搜索并查看用户信息,查看用户友邻信息
  • 查看用户收藏
  • 添加、更新、删除用户收藏
  • 查看评论
  • 发布、修改、删除评论
  • 查看、添加、删除用户广播
  • 查看、添加、删除用户日记
  • 搜索并查看、添加、删除活动
  • 查看、添加、删除、回复推荐
... ...

二. 根据书本ISBN来获取图书信息

豆瓣API提供了根据ISBN来查询书本信息的服务,链接:

http://api.douban.com/book/subject/isbn/+ISBN。如ISBN为9787308083256,我们就可以通过链接(http://api.douban.com/book/subject/isbn/9787308083256)获取到下面的信息。





在这个返回的XML文件中,包含了书籍的诸多信息,如书本的题目,作者,内容摘要,出版日期…等等。

三. 解析XML来获取书本的详细信息


3.1写一个豆瓣的书本类

import java.io.Serializable;

public class TudouBookInfo implements Serializable {

	private static final long serialVersionUID = 2179631010054135058L;

	private String tags;//书本标签

	private String isbn10;//10位ISBN
	
	private String isbn13;

	private String title;

	private String pages;

	private String author;

	private String price;

	private String binding;

	private String publisher;

	private String pubdate;

	private String summary;

	private String imagePath;

	/**
	 * @return the imagePath
	 */
	public String getImagePath() {
		return imagePath;
	}

	/**
	 * @param imagePath
	 *            the imagePath to set
	 */
	public void setImagePath(String imagePath) {
		this.imagePath = imagePath;
	}

	public TudouBookInfo() {
	}

	/**
	 * @return the tags
	 */
	public String getTags() {
		return tags;
	}

	/**
	 * @param tags
	 *            the tags to set
	 */
	public void setTags(String tags) {
		this.tags = tags;
	}

	/**
	 * @return the isbn10
	 */
	public String getIsbn10() {
		return isbn10;
	}

	/**
	 * @param isbn10
	 *            the isbn10 to set
	 */
	public void setIsbn10(String isbn10) {
		this.isbn10 = isbn10;
	}

	/**
	 * @return the isbn13
	 */
	public String getIsbn13() {
		return isbn13;
	}

	/**
	 * @param isbn13
	 *            the isbn13 to set
	 */
	public void setIsbn13(String isbn13) {
		this.isbn13 = isbn13;
	}

	/**
	 * @return the title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * @param title
	 *            the title to set
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * @return the pages
	 */
	public String getPages() {
		return pages;
	}

	/**
	 * @param pages
	 *            the pages to set
	 */
	public void setPages(String pages) {
		this.pages = pages;
	}

	/**
	 * @return the author
	 */
	public String getAuthor() {
		return author;
	}

	/**
	 * @param author
	 *            the author to set
	 */
	public void setAuthor(String author) {
		this.author = author;
	}

	/**
	 * @return the price
	 */
	public String getPrice() {
		return price;
	}

	/**
	 * @param price
	 *            the price to set
	 */
	public void setPrice(String price) {
		this.price = price;
	}

	/**
	 * @return the binding
	 */
	public String getBinding() {
		return binding;
	}

	/**
	 * @param binding
	 *            the binding to set
	 */
	public void setBinding(String binding) {
		this.binding = binding;
	}

	/**
	 * @return the publisher
	 */
	public String getPublisher() {
		return publisher;
	}

	/**
	 * @param publisher
	 *            the publisher to set
	 */
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}

	/**
	 * @return the pubdate
	 */
	public String getPubdate() {
		return pubdate;
	}

	/**
	 * @param pubdate
	 *            the pubdate to set
	 */
	public void setPubdate(String pubdate) {
		this.pubdate = pubdate;
	}

	/**
	 * @return the summary
	 */
	public String getSummary() {
		return summary;
	}

	/**
	 * @param summary
	 *            the summary to set
	 */
	public void setSummary(String summary) {
		this.summary = summary;
	}

}


3.2写一个XML的解析类
通过ISBN查询得到的信息以XML格式的形式返回,所以写一个针对此类XML格式解析的类才能得到我们想要的具体的信息(如:标题,作者,简介等等)。

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;


public class BookXMLParser extends DefaultHandler {

	private TudouBookInfo book = null;

	private final StringBuilder buff = new StringBuilder();
	private String attname = null;
	private final List<String> tags = new ArrayList<String>();

	/**
	 * @return the book
	 */
	public TudouBookInfo getBook() {
		return book;
	}

	public BookXMLParser(InputStream is) {
		try {
			SAXParserFactory spfactory = SAXParserFactory.newInstance();
			spfactory.setValidating(false);
			SAXParser saxParser = spfactory.newSAXParser();
			XMLReader xmlReader = saxParser.getXMLReader();
			xmlReader.setContentHandler(this);
			xmlReader.parse(new InputSource(is));
		} catch (Exception e) {
			System.err.println(e);
			System.exit(1);
		}
	}

	public void startElement(String uri, String localName, String name,
			Attributes atts) throws SAXException {
		if (name.equalsIgnoreCase("entry")) {
			book = new TudouBookInfo();
		} else if (name.equalsIgnoreCase("db:attribute")) {
			attname = atts.getValue("name");
		} else if (name.equalsIgnoreCase("db:tag")) {
			tags.add(atts.getValue("name"));
		} else if (name.equalsIgnoreCase("link")) {
			if ("image".equalsIgnoreCase(atts.getValue("rel"))) {
				book.setImagePath(atts.getValue("href"));
			}
		}
		buff.setLength(0);
	}

	public void endElement(String uri, String localName, String name)
			throws SAXException {
		if ("entry".equalsIgnoreCase(name)) {
			StringBuilder str = new StringBuilder();
			for (String t : tags) {
				str.append(t + "/");
			}
			book.setTags(str.toString());
		} else if (name.equalsIgnoreCase("db:attribute")) {
			String value = buff.toString().trim();
			if ("isbn10".equalsIgnoreCase(attname)) {
				book.setIsbn10(value);
			} else if ("isbn13".equalsIgnoreCase(attname)) {
				book.setIsbn13(value);
			} else if ("title".equalsIgnoreCase(attname)) {
				book.setTitle(value);
			} else if ("pages".equalsIgnoreCase(attname)) {
				book.setPages(value);
			} else if ("author".equalsIgnoreCase(attname)) {
				book.setAuthor(value);
			} else if ("price".equalsIgnoreCase(attname)) {
				book.setPrice(value);
			} else if ("publisher".equalsIgnoreCase(attname)) {
				book.setPublisher(value);
			} else if ("binding".equalsIgnoreCase(attname)) {
				book.setBinding(value);
			} else if ("pubdate".equalsIgnoreCase(attname)) {
				book.setPubdate(value);
			}
		} else if ("summary".equalsIgnoreCase(name)) {
			book.setSummary(buff.toString());
		}
		buff.setLength(0);
	}

	public void characters(char ch[], int start, int length)
			throws SAXException {
		buff.append(ch, start, length);
	}

}


3.3最后写一个测试类

import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class RetrieveDocumentByURL {
	
	public RetrieveDocumentByURL(String url) throws ClientProtocolException, IOException{
		DefaultHttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		HttpResponse response = client.execute(get);
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();
        TudouBookInfo book = new BookXMLParser(is).getBook();
        System.out.println("title:->" + book.getTitle());
        System.out.println("summary:->"+ book.getSummary());
        System.out.println("price:-->" + book.getPrice());
        System.out.println("author:-->" + book.getAuthor());
        System.out.println("ImagePath:-->" + book.getImagePath());
	}
	public static void main(String[] args) throws ClientProtocolException, IOException {
		new RetrieveDocumentByURL("http://api.douban.com/book/subject/isbn/9787308083256");
	}

}


Eclipse工具中设置断点,查看得到的书本具体信息如下图所示:

控制台输出
title:->马云的颠覆智慧
summary:->他是“教主”!是极具煽动力的“布道者”!是不走寻常路的企业家!
在阿里巴巴、淘宝一个个大放异彩的案例中,他如何以颠覆完成超越?
他自称完全不懂网络,却打造了阿里巴巴帝国,颠覆了中国互联网生态;他演讲激情澎湃,不走寻常路,成为一名孜孜不倦的布道者;他宣称在阿里巴巴,股东的地位在顾客、员工之后,股东却纷纷向他伸出橄榄枝!他如何以颠覆完成超越?
本书正是从分析马云异于常人的企业运营智慧和理念出发,用清晰地案例和深刻的分析,展现其以颠覆完成超越的独到智慧。
关于“颠覆”,马云如是说——
做任何事,必须要有突破,没有突破,就等于没做。
——马云在《赢在中国》节目中的点评
世界永远不缺创新,永远不缺的是借口。
——2010年马云在IT领袖峰会上的演讲
今时今日,一场由互联网技术掀起的革命正初露端倪,这股浪潮必将永久改变顾客与企业之间的力量态势。在世界各地,能够把握这些新契机和新趋势的中小型企业必将在竞争中脱颖而出。
——2009年马云在新加坡APEC中小企业高峰会议的演讲《因小而美》
假如没有变革,怎么会有中小企业,假如没有变革,我们这些所有垄断的企业,怎么有利益在?所以说不破不立。
——2008年马云新浪博客文章《呼唤企业家精神 坚持梦想敢于担当》

蓝海战略是一种颠覆性的思考。
——2006年马云在浙商大会暨首届浙商投资博览会上的发言
阿里巴巴进入淘宝,将会颠覆C2C、B2C等概念,而未来两到三年内,阿里巴巴与淘宝也必然走向融合,这是一个大趋势。
——2005年12月25日上海交通大学安泰管理学院演讲
price:-->35.00元
author:-->快刀洪七
ImagePath:-->http://img3.douban.com/spic/s4644461.jpg





至此,通过豆瓣提供的API,一个简单的图书信息获取小程序就完成了。


四.获取图书信息后能做什么呢?

获取书本信息之后,最简单的应用就可以为自己建立一个图书信息库,实现一个简单的Web应用。比如将得到的书籍信息存入到数据库中,然后以分页的形式将书本信息显示在页面上,最后用户可以点击某个书本,弹出一个框显示详细信息,如下图:



转载请注明出处:http://mouselearnjava.iteye.com/blog/1961777
  • 大小: 43 KB
  • 大小: 5.9 KB
  • 大小: 19.2 KB
1
1
分享到:
评论
1 楼 xiai_fei 2015-10-21  

没有办法做图书库库等相关应用啊,豆瓣使用条款中说明不能缓存数据的。

相关推荐

    豆瓣API获取书籍详细信息

    使用豆瓣API,根据书籍ISBN码,获取该本书籍的详细信息

    豆瓣API接口获取书籍详细信息C#

    程序是通过ISBN获取到书籍信息,调用的接口是豆瓣的API接口 程序使用C#代码编写

    豆瓣API获取书籍详细信息(Java代码)

    使用豆瓣API,根据书籍ISBN码,获取该本书籍的详细信息

    C# 通过豆瓣API简单获取豆瓣书籍信息(源代码)

    资源主要是结合博客文章:http://blog.csdn.net/eastmount/article/details/24850315主要讲述使用C# 系统应用之通过豆瓣API获取书籍信息,实现的方法是通过HTTP发送获取XML信息,再读取其标签实现获取信息及书籍封面...

    调用豆瓣API抓取图书信息的php源代码

    调用豆瓣API抓取图书信息的php源码,调用豆瓣网站的部分源码,主要利用了豆瓣的API来获取书籍的名称、作者、封面等资料,值得借鉴!非常有帮助的源码类~

    调用豆瓣API抓取图书信息的php文件

    自己山寨的豆瓣网站的部分源码,主要利用了豆瓣的API来获取书籍的名称、作者、封面等资料,值得借鉴!

    vue版豆瓣图书api搜索

    采用vue-resource.js获取豆瓣api制作的豆瓣图书搜索。豆瓣接口已经无法调用,可作为参考学习

    微信小程序使用豆瓣API接口

    小程序使用豆瓣API接口,实现获取数据,回调数据,分页等功能

    ISBN获取及JSON数据解析

    利用豆瓣API V2.0 ISBN码 获取书籍的相关信息,未采用控件获取https的网络数据,得到JOSN的返回数据后进行解析。

    android利用ZXing Jsoup 和豆瓣API做出的图书搜索-IT计算机-毕业设计.zip

    Android应用源码开发Demo,主要用于毕业设计学习。

    JAVA批量查询书籍信息-豆瓣读书

    由于目前豆瓣读书搜索api已废弃了,官方也做反爬虫机制(用传统爬网页的方式不可取),搜索图书页面需要登录,用selenium方式取设置用户信息,多次尝试发现也不行(有可能是我的方式不对)。所以我只有用曲线救国的...

    微信小程序访问豆瓣api403问题

    通过豆瓣api可以获取很多电影、书籍等的数据信息。昨晚上用微信小程序请求豆瓣api,竟然被豆瓣拒绝了。(豆瓣设置了小程序的访问权限)。 问题 小程序请求是这样子: onLoad: function (options) { this....

    Android应用源码扫描书籍条形码获取书籍信息图书扫扫

    返回ISBN值之后,然后再去豆瓣图书API:http://developers.douban.com/wiki/?title=book_v2上获取数据,然后解析,更新到UI上MainActivity.java是主界面的Activity ;BookView.java是显示图书基本信息的界面;...

    微信小程序之小豆瓣图书.doc

    demo中用到的豆瓣图书api只有两个,一个是图书搜索,另一个是获取图书详情。 搜索图书搜索图书 GET https://api.douban.com/v2/book/search 参数 意义 备注 q 查询关键字 q和tag必传其一 tag 查询的tag q和tag必传其...

    PHP通过图书ISBN码抓取信息

    因为最近要做一个扫描图书的ISBN编码获取图书信息的功能,要用到一个开放的API,首先想到的就是豆瓣。但是豆瓣由于什么原因关闭了开放的API。所以做了一个抓取豆瓣图书的网页信息,此功能用于学习。

    微信小程序图书管理

    图书的查询 ...设计是调用“扫描二维码”功能扫图书的ISBN码,然后从豆瓣获取图书信息,然后把信息存到数据库的。但小程序目前还没有扫二维码API,所以暂时先hard code 10个ISBN,然后随机获取一个进行录入。

    微信小程序 - 豆瓣读书

    本项目是基于微信小程序框架开发的的Demo,只作为学习使用,不用于商业实践,图书版权归豆瓣所有 所有图书数据是通过豆瓣读书公开的API获取,实现了按名称查询图书、图书列表展示、图书详情、底部自动触发加载图书...

    wemp-library:微信小程序库

    微信小程序 图书馆 WeChat mini program library 企业内部使用的图书馆小程序,使用wepy框架,豆瓣API获取图书信息

    doubanbook一个简单的豆瓣图书SDK

    douban-book:一个简单的豆瓣图书 SDK,你可以使用它用于获取指定书籍的基本信息

Global site tag (gtag.js) - Google Analytics