如何获取豆瓣图书的"想读"列表

100
TaoAlpha
2015-06-102465 words8 minutes to read

之前给博客增加了一个打赏页面, 也算是试图筹集资金做些小项目的途径之一. 今天丰富了以下打赏页面, 增加了一个书目的模块, 您也可以给我买书或者把自己看过的我想看的二手书送给我 ^_^

本文则是主要介绍下如何利用豆瓣的图书API获取”想读”列表.

豆瓣API豆瓣作为UGC的大户, 其内容价值含量极高, 所以起API的呼声也极大, 而一直以来, 豆瓣的API都是很多其他产品的一大内容来源. 所以这次考虑在我的页面上加入书目列表时, 第一个想到的也是豆瓣!

首先我们确定下思路, 如果我们想要拉取一个”愿望清单”一样的书目, 最好的方法应该是建立一个豆列, 然后在豆瓣维护这个豆列即可. 这应该也是最直接的方法, 可惜的是, 豆瓣目前尚未开放和豆列有关的API接口, 这样就让我们无法获取豆列的信息了.

那么, 退而求其次, 如果拿不到特定豆列, 我们就只能从我的全部图书方面找突破了. 在众多的图书接口中, 获取某个用户的所有图书收藏信息这个接口可以说是最为接近的了, 而且它提供了status和tag的筛选, 这样就让我们近似模拟一个豆列成为可能.

如何做呢? 首先我们需要把本来计划添加到”愿望清单”豆列的书都放到我们的想读中(愿望清单嘛), 并加上一个特定, 比如”MyWish”的标签, 如此, 我们就可以利用这两个纬度对我们的书目进行过滤, 抽取到我们需要的东西.

根据获取某个用户的所有图书收藏信息的说明, 我们需要三个参数就能实现我们的目的:

  • user id: 指定用户;
  • status: wish - 代表”想读”
  • tag: MyWish - 或者你指定的某个tag

如此我们的api接口地址就构造完成了: “https://api.douban.com/v2/book/user/129154019/collections?status=wish&tag=MyWish" - 就是我的”愿望清单”列表.

通过最简单的get请求就能获得这一json格式的数据了, 这里我们几乎可以完全复用 给jekyll添加google analytics的pageview一文的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function showMyWishBooks(){
var bookapi = "https://api.douban.com/v2/book/user/129154019/collections?status=wish&tag=MyWish";
$.ajax({
url: bookapi,
dataType: 'jsonp',
timeout: 1000 * 3, // 3 sec
success: function(data) {
parseBookDatas(data.collections);
},
error: function() {
// if fail to get up-to-date data from douban, get cached local version
console.log('Failed to get pageview from Douban!');
$.ajax({
url: '/blog/doubanbooks.json',
dataType: 'json',
success: function(data) {
console.log('Local mybooks.data backup file.');
parseBookDatas(data.collections);
}
})
}
})
}

拿到数据后自然就要解析应用, 这部分的话主要是因人而异, 根据自己的设计方式来, 我目前也只是简单的列举出来, 加了简单的hover图层效果.

1
2
3
4
5
6
7
function parseBookDatas(data){
var template = "<li class='book_item'><a href='__book_url__' alt='__book_alt_title__'><img src='__book_img__'><span>__book_title__</span></a></li>"
$.each(data,function(key,item){
var bookitem = template.replace("__book_url__",item.book.alt).replace("__book_alt_title__",item.book.alt_title).replace("__book_title__",item.book.title).replace("__book_img__",item.book.images.large);
$('.books').append(bookitem);
});
}

上述采用静态模板替换的方式来构造每个条目, 如果你喜欢liquid tempalte的话, 想要用Mustache 或者 hanldrbars的话, 也是完全可以的~ 具体实现方法对应的官网都说的很清楚了, 我就不多说喽~

Error: Comments Not Initialized