豆瓣数据获取及备份插件 —— douban-getter

CHANGELOG

[2020-03-18-update] 发布到 npm,引用更简单了。^ ^

[2020-05-11-update] hqweay/MarkAll :提供了 GUI

前言

仓库地址:hqweay/douban-getter

夸夸自己,执行力还挺强的,哈哈。

之前只做了备份「看过的电影」,因为代码写得丑,如果要写其它的诸如备份「想看的电影」、「读过的书籍」之类的,就只能拷贝一份源代码,然后修改……觉得有点杀掉,所以一直没继续做。

这几天在看文档,想打打 JavaScript 的基础,终于了解了一下闭包的概念,看到文档里的示例代码,突然想到阔以用这种方式重构一哈之前的代码。

说做就做,然后写着写着想到不如抽成一个插件好了,于是把 hqweay/MarkAll 里的豆瓣爬虫抽取为插件……

不过插件也是第一次写,我还不确定这个仓库能不能作为插件整合进其它项目……

接下来想尝试写个 Hexo 插件

简要说明

提供一个工厂方法,创建用户在豆瓣标记为电影、书籍、音乐、游戏对应的看过、在看、想看等条目的 Getter 方法。

提供一个 Save 方法,将 Getter 获取的数据保存至本地。

我的目标是备份豆瓣用户在豆瓣上的标记数据,而不是爬取豆瓣数据。所以获取信息的页面,我选取的是 豆瓣标记信息列表 的页面 而不是条目详情页面

如该页面:下一餐有折耳根想看的电影

使用

效果

img

说明

  1. 引入包

    1
    2
    3
    npm i douban-getter
    ## yarn add douban-getter
    ## yarn add https://github.com/hqweay/douban-backup.git
  2. 使用样例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let { createDoubanDataGetter, saveDoubanData, DoubanTypeEnum } = require('douban-getter');

    // 存储路径
    const STORE_PATH = "douban-data-backup";
    // 豆瓣帐号
    const userName = "hqweay";

    let getDoubanWatchedMovies = createDoubanDataGetter(DoubanTypeEnum.watchedMovies);

    // 获取用户在豆瓣标记为想看的电影条目
    getDoubanWatchedMovies(userName, pageStart = 1, pageEnd = 2, sleepTimer = 1500).then(function (data) {
    // 数据、路径、文件名
    saveDoubanData(data, STORE_PATH + "/hqweay/movie/", "watchedMovies");
    })

方法说明

createDoubanDataGetter

提供一个工厂方法,创建用户在豆瓣标记为电影、书籍、音乐、游戏对应的看过、在看、想看等条目的 Getter 方法。

可选参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// let getDoubanWatchedMovies = createDoubanDataGetter(DoubanTypeEnum.watchedMovies);
const DoubanTypeEnum = {
"watchedMovies": "watchedMovies",
"wishMovies": "wishMovies",
"watchingMovies": "watchingMovies",
"readBooks": "readBooks",
"wishBooks": "wishBooks",
"readingBooks": "readingBooks",
"listenedMusics": "listenedMusics",
"wishMusics": "wishMusics",
"listeningMusics": "listeningMusics",
"playedGames": "playedGames",
"wishGames": "wishGames",
"playingGames": "playingGames",
}

参数对应

电影书籍音乐游戏
看过读过听过玩过
想看想读想听想玩
在看在读在听在玩

Getter

createDoubanDataGetter 的返回值是一个豆瓣标记数据的 Getter 函数,里面是一个 Promise,通过回调方法可以对 Getter 获取的数据进行相应处理。如:

1
2
3
4
getDoubanWishMovies(userName, pageStart = 1, pageEnd = 2, sleepTimer = 1500).then(function (data) {
// 数据、路径、文件名
saveDoubanData(data, STORE_PATH + "/hqweay/movie/", "wishMovies");
})

可选参数

1
getDoubanWatchedMovies(userName, pageStart = 1, pageEnd = 2, sleepTimer = 1500);
参数说明
userName豆瓣帐号
pageStart数据获取开始页(注意:一页 15 条数据)
pageEnd数据获取结束页
sleepTimer爬取数据的时间间隔(不建议修改,过快会被限制访问……)默认为 1500(ms)

saveDoubanData

saveDoubanData() 是这个项目核心外的一个方法,用于将 Getter 获取的数据保存至本地。

1
saveDoubanData(data, STORE_PATH = "douban-data-backup", fileName = "my-info");

参数说明

参数说明
data数据
STORE_PATH存储路径
fileName保存文件名

项目说明

MarkAll 里的豆瓣爬虫抽取为插件……

结构

把获取豆瓣数据抽象为三步:获取页面、解析页面、数据存储。

核心是 douban-data-getter-func-creater.js,用户可以通过该文件提供的方法创建一个 获取某项信息的函数。

如:

1
2
let getDoubanWatchedMovies = createDoubanDataGetter("watchedMovies");
let getDoubanWishMovies = createDoubanDataGetter("wishMovies");

douban-data-getter-func-creater.js 依赖 get-douban-data-url.jsresolve-douban-data.jssave-douban-data-to-local.js

get-douban-data-url.js:通过参数获取豆瓣信息页面的 url。

resolve-douban-data.js:解析对应豆瓣信息页面的标签获取数据。

save-douban-data-to.js:备份数据的存储

注意:现在文件夹下的 resolve 文件是 resolve-douban-data-to-json.js,表示获取信息后以 JSON 格式存储。
同理,save 文件是 save-douban-data-to-local.js,表示存储至本地。

豆瓣信息页面的 URL

可参考目录下的 src/config/douban-data-urls.md

备份数据样例

参考 /douban-data-backup 下的文件。

开发

您可以创建自己的 save-douban-data-to-cloud.js 等类似文件编写上传到存储服务的逻辑。

也可以创建自己的 resolve-douban-data-to-csv.js 解析数据为 csv 格式保存……

也许我后面会写……

其它

另外,话说保存数据格式为 JSON,其它格式可以使用在线转换工具嘛……

比如 JSON 转 CSV :https://www.bejson.com/json/json2excel/

一些问题

豆瓣读过的书籍页面直接访问 403,但是先访问用户主页,再访问读过的书籍页面就没问题。对比两个页面的请求头发现相差一个 Cookie 字段,但是——我又没登录。看样子只要有该字段就没问题,服务器没做其它啥验证。