【玩转掘金】掘金专栏文章正生成pdf文档 |Python 主题月

简介: 掘金有在看各位的很多优秀的专栏,我一直在思考,如何把这些专栏的文章内容整合在一起呢?对,生成PDF文件,数据聚合,方便你我她他它。Don't worry! 实现的方法方式都很简单,一共不到200行代码。

前言


掘金有在看各位的很多优秀的专栏,我一直在思考,如何把这些专栏的文章内容整合在一起呢?


对,生成PDF文件,数据聚合,方便你我她他它。


Don't worry!  实现的方法方式都很简单,一共不到200行代码。


源码:JueJinColToPdf

在线预览:我的掘金前端周栏.pdf


效果演示


代码执行


1.JPG


PDF文档效果


2.JPG


基本思路


  1. 收集API信息和关联
  2. 下载专栏数据
  3. 生成html代码 (markdown转html)
  4. 生成pdf文件


收集API信息和关联


数据是一切的根源,所以先分析如何获取掘金专栏数据。


其实三个API就满足需求:


  1. 专栏摘要信息
    作用: 获取专栏的摘要信息,主要是专栏ID和专栏名称
    API地址:api.juejin.cn/content_api…
  2. 专栏文章列表
    作用: 获取专栏文章列表,主要是文章ID,一个中间商罢了。
    API地址:api.juejin.cn/content_api…
  3. 文章详情
    作用: 获取文章详情,主要是文章标题和MarkDown格式的文章内容
    API地址api.juejin.cn/content_api…


整体流程如下:


3.JPG


获取专栏信息


API地址: api.juejin.cn/content_api…


请求参数

QueryString

  1. column_id 专栏ID


数据结构

有用的就是 title字段,生成html和pdf时需要。


{
    column_id:""6979380367216082957" 
    data: {
        "column_version": {
            "title": "前端基础进阶“  // 专栏标题
        }
    }
}
复制代码


获取专栏文章列表


API 地址https://api.juejin.cn/content_api/v1/column/articles_cursor

请求参数


{
    "column_id":"6979380367216082957", // 专栏ID
    "cursor":"0", // 当前下标
    "limit":20, // 一页大小
    "sort":0  // 0 发布事件从近到远,反之从远到近
}  
复制代码


数据结构有用的其实就 artcile_id


{
   "err_no": 0,
   "err_msg": "success",
   "cursor": "2",
   "count": 5,
   "has_more": false,
   "data": [
       {
            "article_id": "6989391487200919566",
             .....................
       }
   ]
}
复制代码


获取文章详情


API地址:

https://api.juejin.cn/content_api/v1/article/detail


请求参数:


{
    "article_id": "6989391487200919566" // 文章ID
}    
复制代码


返回结果:

data属性中的mark_content字段就是markdown语法的原始内容。


{
    "data": {
        "article_id": "6989391487200919566",
        "article_info": {
            "mark_content": "---\ntheme: channing-cyan\nhighlight: a11y-dark\n---\n\n\n## 前言\n\n本文收录在 **[前端基础进阶](https://juejin.cn/column/6979380367216082957)** 专栏"
        }
    },
    "err_no": 0,
    "err_msg": "success",
}
复制代码


下载专栏数据


我们选择Python里面比较有名的requests库,虽然不支持异步,不过问题不大。

基本顺序:


  1. 下载专栏信息
  2. 下载专栏文章列表信息
  3. 下载单篇文章信息


注意点:


  1. 我们会按照专栏ID创建文件夹,把下载下来的JSON格式的文件都放到下面
    至于为什么? 21世纪什么最重要, 数据!!

有了数据,你可以自己生成网页,做成word, pdf,亦或其他,无线的选择。

本着本文为Python类别,还是贴一段主流程代码: 更多细节查看源码 JueJinColToPdf


def downloadColumn(cid):
    column = getColumn(cid);
    print("获取专栏信息成功,专栏名称:", column["data"]["column_version"]["title"]);
    saveColumn(cid, json.dumps(column["data"]))
    articleList = getArticleList(cid)
    saveArticleList(cid, json.dumps(articleList["data"]))
    articleIds = list(map(lambda item: item["article_id"], articleList["data"]))
    print("获取专栏文章列表成功:", articleIds)
    for artId in articleIds:
        artContent = getArticleContent(artId)
        saveArticleContent(cid, artId, json.dumps(artContent["data"]))
        print("文章ID为 %s 的文章下载完毕" % artId)
复制代码


生成Html代码


直接说一些问题


如何把markdown格式转为html代码


巨人的肩上markdown


html += markdown.markdown(
         removeScheme(article["article_info"]["mark_content"]), extensions=extensions)
复制代码


如何高亮代码


Pygments库,


pygmentize -S default -f html -a .codehilite > code.css
复制代码


然后设置一个markdown库的extensions


extensions = [  # 根据不同教程加上的扩展
    'markdown.extensions.extra',
    'markdown.extensions.codehilite',  # 代码高亮扩展
    'markdown.extensions.toc',
    'markdown.extensions.tables',
    'markdown.extensions.fenced_code',
]
 html += markdown.markdown(
            removeScheme(article["article_info"]["mark_content"]), extensions=extensions)
复制代码


去掉掘金主题和代码风格


如果你选择了主题或者代码高亮,markdown头部会多出如下的内容。


---
theme: github
highlight: a11y-light
---
复制代码


方案:正则替换或者字符串截取


如何自定义样式


新建一个 extend.css


* {
    font-size: 30px;  // 默认字体
}
img{
    display: block;  
    min-width: 50%; // 图片至少50%
}
复制代码


如何生成一个大的html文件


  1. 创建一个html文件,
  2. core.cssextend.css文件写入html的style标签里面
  3. 写入头部的html,
  4. 写入markdown转换后的html,
  5. 最后写入尾部的html。


如果文章太多,怎么办


以一定文章数量分割,比如20篇

以一定文字数量分割,比如5万字

在笔者的代码中是未实现的,不过问题不大,我之前有用html生成400多页的pdf也妥妥的。


转为pdf文件


借助 wkhtmltopdf.exe, 这款神奇可以把网络地址或者本地html文件直接转换成为pdf文件。


最重要的是其完美的支持目录。


从官方下载安装,然后配置一下环境变量就可以,代码嘛就下面这点。


def genPdf(title):
    # TODO:: 需要配置全局路径
    exePath = "wkhtmltopdf.exe"
    sourcePath = "./htmls/%s.html" % title
    targetPath = "./pdfs/%s.pdf" % title
    cmd = '"%s" --outline-depth 2 --footer-center [page] "%s" "%s"' % (
        exePath, sourcePath, targetPath)
    print(cmd)
    subprocess.call(cmd)
复制代码


写在最后


写作不易,你的一赞一评,就是我最大的动力。



相关文章
|
2月前
|
数据采集 Python
Python实用记录(七):通过retinaface对CASIA-WebFace人脸数据集进行清洗,并把错误图路径放入txt文档
使用RetinaFace模型对CASIA-WebFace人脸数据集进行清洗,并将无法检测到人脸的图片路径记录到txt文档中。
48 1
|
2月前
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
36 1
|
10天前
|
存储 运维 安全
《VERICUT 9.X电脑配置要求与安装说明(官方)》—— PDF文档
本文档详细介绍了 CGTech Vericut 9.X 的安装指南,涵盖安装前准备、安装流程、系统要求、故障排除、许可证配置及多种接口配置等内容,为用户提供全面的软件安装与配置指导。
31 2
|
1月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
1月前
|
测试技术 开发者 Python
对于Python中的异常要如何处理,raise关键字你真的了解吗?一篇文章带你从头了解
`raise`关键字在Python中用于显式引发异常,允许开发者在检测到错误条件时中断程序流程,并通过异常处理机制(如try-except块)接管控制。`raise`后可跟异常类型、异常对象及错误信息,适用于验证输入、处理错误、自定义异常、重新引发异常及测试等场景。例如,`raise ValueError("Invalid input")`用于验证输入数据,若不符合预期则引发异常,确保数据准确并提供清晰错误信息。此外,通过自定义异常类,可以针对特定错误情况提供更具体的信息,增强代码的健壮性和可维护性。
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
118 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
54 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
1月前
|
API C#
在.NET中使用QuestPDF高效地生成PDF文档
在.NET中使用QuestPDF高效地生成PDF文档
|
2月前
|
人工智能 开发者 Python
python读取word文档 | AI应用开发
在RAG系统中,构建知识库时需读取多种外部文档,其中Word文档较为常见。本文介绍如何使用`python-docx`库读取Word文档(.docx格式)中的标题、段落、表格和图片等内容。首先通过`pip install python-docx`安装库,然后利用提供的接口提取所需信息。尽管该库功能强大,但在识别标题样式时需自定义逻辑,并且仅提供图片的URI而非直接加载。示例代码展示了读取文本、识别标题、读取表格及获取图片URI的方法。【10月更文挑战第2天】
107 2
|
2月前
|
Python
Python对PDF文件页面的旋转和切割
Python对PDF文件页面的旋转和切割
52 3