Please enable Javascript to view the contents

每周书单推荐文章生成器

 ·  ☕ 3 分钟

每周书单生成器

每周书单停更

每周书单是“码农真经”公众号的一个系列文章。由我将“码农读书交流群”的群友推荐的书籍,整理成一篇文章,每周推送给大家。

每周书单

这个专题已经更新了一年多,推送了57期。停更的原因是:我希望大家能够静下心来好好读书。我们拥有的电子书越来越多,但是读的书却越来越少。我希望能够通过这个专题,让大家读更多的书,而不是收藏更多的书。而我自己也希望能够有更多的时间读书。

当然,我们的读书交流群还是会继续的,只是每周书单专题停更了。欢迎大家加入读书交流群,一起交流读书心得。

读书交流群

每周书单推荐文章生成器

前期我都是手动整理这些书单,但是随着书单的增多,手动整理的工作量也越来越大。于是我用Nodejs写了一个脚本,可以自动生成每周书单推荐文章。这个脚本的好处是:

  1. 生成的文章markdown格式,结构清晰,利于排版和美化。
  2. 生成的文章内容丰富,包含了书籍的封面、书名、作者、豆瓣评分、豆瓣链接、书籍简介等信息。

缺点是:

  1. 生成的文章内容有时候会有重复,需要手动删除。
  2. puppeteer爬虫的速度有点慢,需要等待一段时间。

分享这个脚本,可能会对同类型的博主有帮助。如果你也有类似的需求,可以参考这个脚本。

实现原理

这个脚本的实现原理非常简单,就是通过爬虫,从豆瓣和京东网站上获取书籍的信息,然后将这些信息整理成一篇文章。

  1. 先在豆瓣上搜索书籍,获取书籍的豆瓣链接。
  2. 通过豆瓣链接,获取书籍的封面、书名、作者、豆瓣评分、书籍简介等信息。
  3. 豆瓣上的书籍封面有反爬虫机制,简单起见,通过书名在京东上搜索,获取书籍的封面。

使用方法

1
node index folder_path

代码

mzhren/weeklybooks-script: Node Script to quickly generate recommended book list

主要代码如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
const searchDoubanBooks = require('./douban_search_books');
const getDoubanBookInfo = require('./douban_book_info');
const getJDBookCover = require('./jd_book_cover');
const fs = require('fs');

const get_files = (dir) => {
    const files = fs.readdirSync(dir);
    // exclude .md files
    for (let i = 0; i < files.length; i++) {
        const file = files[i];
        if (file.includes('.md')) {
            files.splice(i, 1);
        }
    }
    return files;
}

const current_dir = process.argv.slice(2);
console.log(current_dir);

const get_book_links = async (files) => {
    const book_links = [];
    for (let i = 0; i < files.length; i++) {
        const file = files[i];
        const book_name = file.split('.')[0];
        const book_link = await searchDoubanBooks(book_name);
        if (book_link.length > 0) {
            book_links.push(book_link[0].url);
        }
    }
    return book_links;
}

const files = get_files(current_dir[0]);

get_book_links(files).then(async (book_links) => {
    console.log(book_links);
    books_info = [];
    for (let i = 0; i < book_links.length; i++) {
        const book_link = book_links[i];
        let info = await getDoubanBookInfo(book_link)
        info.cover = await getJDBookCover(info.title);
        books_info.push(info);
    }


    const markdown = await json_to_markdown(books_info);
    console.log(markdown);
    write_to_file(markdown);

});

const get_current_week_order = () => {
    const today = new Date();
    const firstDayOfYear = new Date(today.getFullYear(), 0, 1);
    const pastDaysOfYear = (today - firstDayOfYear) / 86400000;
    const currentWeek = Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);
    return currentWeek;
}

const json_to_markdown = async (books_info) => {

    let titles = books_info.map((book) => book.title).join('、');
    let markdown = '';
    markdown += titles;
    markdown += "\n\n";
    const current_week_order = get_current_week_order();
    markdown += `
本周是2023年第${current_week_order}周,本周推荐书单均来自群友推荐。欢迎大家在群里推荐书籍,我们会在每周整理出来。也欢迎您的加入,可先加群主微信(微信号:gameboy1000)备注“加群”,群主会拉你进群。
`;

    for (let i = 0; i < books_info.length; i++) {
        const book_info = books_info[i];
        markdown += `
       
## ${book_info.title}

![${book_info.title}](${book_info.cover})

评分:${book_info.rating}

${book_info.intro}
        `;
    }

    markdown += `

### 往期推荐

+ 推荐
+ 推荐
+ 推荐
+ 推荐
+ 推荐

> 关注 码农真经
>
> 点赞、转发、广告,更多优质资源等你来...
>
>( 2023${current_week_order} )

欢迎关注我的公众号“**码农真经**”,原创技术文章第一时间推送。
`;
    console.log(markdown)
    return markdown;
}

const write_to_file = (markdown) => {
    const markdown_file = current_dir[0] + '/books.md';
    fs.writeFileSync(markdown_file, markdown);
}
分享

码中人
作者
码中人
Web Developer