由于Goodreads不再支持通过其API获取用户的书籍数据, 我决定使用RSS源来爬取/抓取用户的书籍数据,并在Node.js中解析它。

这里的思路是使用rss-parser
包来解析RSS源并提取书籍数据。
import Parser from 'rss-parser'
import type { GoodreadsBook } from '~/types'
let parser = new Parser<{ [key: string]: any }, GoodreadsBook>({
customFields: {
// 定义您想要从RSS源中提取的所有自定义字段
// 这里我列出了Goodreads RSS源中所有可用的字段
item: [
'guid',
'pubDate',
'title',
'link',
'book_id',
'book_image_url',
'book_small_image_url',
'book_medium_image_url',
'book_large_image_url',
'book_description',
'author_name',
'isbn',
'user_name',
'user_rating',
'user_read_at',
'user_date_added',
'user_date_created',
'user_shelves',
'user_review',
'average_rating',
'book_published',
],
},
})
然后您可以使用 parser
对象从RSS源获取数据,并根据需要处理它。
const GOODREADS_RSS_FEED_URL = '<YOUR_GOODREADS_RSS_FEED_URL>'
export async function fetchGoodreadsBooks() {
if (GOODREADS_RSS_FEED_URL) {
try {
let data = await parser.parseURL(GOODREADS_RSS_FEED_URL)
// 所有书籍数据将存储在 `data.items` 数组中
// 根据需要使用解析的数据,例如,您可以将其写入JSON文件:
writeFileSync(`./json/books.json`, JSON.stringify(data.items))
} catch (error) {
console.error(`获取Goodreads RSS源时出错:${error.message}`)
}
} else {
console.log('📚 未找到Goodreads RSS源。')
}
}
NOTE
您可以通过访问用户的个人资料并导航到书架页面来获取Goodreads用户的RSS源URL,然后复制RSS源URL。 例如,这是我的书架页面:https://www.goodreads.com/review/list/190602772
现在您有了数据,您可能需要在存储或在应用程序中使用之前美化它们, 因为数据是以原始格式存储的。
let data = await parser.parseURL(/* GOODREADS_RSS_FEED_URL */)
// 循环遍历 `data.items` 数组来美化数据
for (let book of data.items) {
book.content = book.content.replace(/\n/g, '').replace(/\s\s+/g, ' ') // 移除换行符
book.book_description = book.book_description
.replace(/<[^>]*(>|$)/g, '') // 移除HTML标签
.replace(/\s\s+/g, ' ') // 将多个空格替换为单个空格
.replace(/^["|"]|["|"]$/g, '') // 移除开头和结尾的引号
.replace(/\.([a-zA-Z0-9])/g, '. $1') // 在句号后添加空格
}
// 根据需要使用解析和美化后的数据...
GoodreadsBook
类型定义如下:
export type GoodreadsBook = {
guid: string
pubDate: string
title: string
link: string
book_id: string
book_image_url: string
book_small_image_url: string
book_medium_image_url: string
book_large_image_url: string
book_description: string
author_name: string
isbn: string
user_name: string
user_rating: string
user_read_at: string
user_date_added: string
user_date_created: string
user_shelves: string
user_review: string
average_rating: number
book_published: string
content: string
}
注意事项
如果您在Goodreads上更新了书籍,Goodreads RSS源不会立即更新。 您可能需要等待几个小时才能获取最新数据。
Happy crawling!