为什么我极力推荐程序员用jupyter写文章

「N体饭」Python小课堂

作者:许立轩

简介

分享实用、新奇、有fun的Python小知识

让您的Python功力更上一层楼吧~

为什么我极力推荐程序员用jupyter写文章

大纲

视频地址https://www.bilibili.com/video/BV1zk4y117PS/

为什么我极力推荐程序员用Jupyter来写文章

jupyter是什么

为什么我极力推荐程序员用jupyter写文章

Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。

Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等

为什么我极力推荐程序员用jupyter写文章

我们可以通过这个链接看看免安装试用jupyter,戳这里: https://jupyter.org/try

jupyter有个重要的概念就是cell

cell有好几种类型,主要就是code(代码)和markdown两种

我们可以在code cell里面编写和执行代码,可以在markdown cell里面编写md标记或html

为什么选择jupyter

  • Jupyter支持在线运行超过40多种编程语言, 包括Python, R, Julia, Java, JavaScript等主流编程语言

为什么我极力推荐程序员用jupyter写文章

  • Jupyter的cell不但支持编写编程语言并执行,还支持Markdown语法,简直是程序员的福音

为什么我极力推荐程序员用jupyter写文章

  • 可以把我们编写的文件导出成html、pdf、png、markdown等文件

为什么我极力推荐程序员用jupyter写文章

  • 支持幻灯片显示cell,我们不需要写了文章还得再去制作一个ppt来讲解

为什么我极力推荐程序员用jupyter写文章

安装与启动jupyter

jupyter是用Python写的程序,所以我们安装jupyter前必须先安装好Python

如果还没安装好Python,可以戳这里了解一下Python的安装步骤:https://www.bilibili.com/video/BV1wi4y1G791/

安装完了Python之后,我们可以通过Python的第三方库安装工具pip来安装Jupyter

pip3 install jupyter

经过一波行云流水的输出后,我们就已经成功安装好了Jupyter了

我们进入控制台(命令行), 输入

jupyter notebook

就成功启动了jupyter notebook的web服务

然后再新建一个Python3的notebook文件ipynb,就可以开始愉快的玩耍了

为什么我极力推荐程序员用jupyter写文章

jupyter导出html

我们可以将写好的ipynb文件转化为html文件

导出后的html支持复制粘贴至目前绝大多数的自媒体平台并且保留原有样式,比如:

  • ****
  • 微信公众号
  • 360doc

上面的几个平台完美支持html的代码块表格引用块等标记

我们可以通过3种方式来把ipynb转为html

1.通过web端下载html,文件 -> 下载 -> HTML(.html)

为什么我极力推荐程序员用jupyter写文章

2.通过jupyter nbconvert命令,我们可以更多选择性地导出html文件

# 将"目标.ipynb"转为"目标.html"
jupyter nbconvert --to html 目标.ipynb

# 使用--template选项指定模板为"full",这与上一句等价,因为默认模板就是"full"
# "full"模板会保留html的一些样式,所以导出的html将和web端显示非常相似
jupyter nbconvert --to html --template full 目标.ipynb

# 使用"basic"模板导出html文件,因为去掉了一些css样式,导出的html将会非常的简洁
# 适合嵌入网页或一些博客中
jupyter nbconvert --to html --template basic 目标.ipynb

当我们使用full模板的时候,导出时甚至可以保留jupyterthemes的主题样式,详情戳:https://www.bilibili.com/video/BV1Et4y1D7ru/ 更换notebook主题

3.通过代码更灵活地将ipynb文件导出html文件

from nbconvert import HTMLExporter
from jupyter_core.paths import jupyter_config_dir

def ipynb2html(ipynb_path, template='full'):
    """
    代码将ipynb文件转为html文件
    """
    # 指定模板,可以为full或basic
    assert template in ('full','basic'), 'template取值为full或basic'
    exporter = HTMLExporter(template_file=f'{template}.tpl')
    
    # 从文件名导入ipynb文件
    # 注意我们指定了config_dir,如果不加的话,full模板将无法应用css样式
    html, _ = exporter.from_filename(ipynb_path, {'config_dir': jupyter_config_dir()})
    
    # 保存html内容至result.html文件
    with open('result.html', 'w', encoding='utf-8') as f:
        f.write(html)
        
    print('done')

# 将目标.ipynb转为result.html文件
ipynb2html('目标.ipynb')
ipynb2html('目标.ipynb', template='basic')

jupyter导出markdown

我们可以将写好的ipynb文件转化为markdown文件

某些自媒体平台直接就支持markdown语法来编写文章,比如****博客

所以我们可以将md文件内容直接粘贴至平台内,即可发布

这样的好处是,我们文章的最终样式会由平台决定

同样有三种方式将ipynb转为md文件

1.通过web端下载markdown,文件 -> 下载 -> Markdown(.md)

为什么我极力推荐程序员用jupyter写文章

2.通过jupyter nbconvert命令来转化markdown文件

通过指定 --to 选项为 markdown

jupyter nbconvert --to markdown 目标.ipynb

3.通过代码更灵活地将ipynb文件导出md文件

from nbconvert import MarkdownExporter

def ipynb2md(ipynb_path):
    """
    代码将ipynb文件转为md文件
    """
    exporter = MarkdownExporter()

    # 从文件名导入ipynb文件
    md, _ = exporter.from_filename(ipynb_path)

    # 保存html内容至result.md文件
    with open('result.md', 'w', encoding='utf-8') as f:
        f.write(md)

    print('done')

# 将目标.ipynb转为result.md文件
ipynb2md('目标.ipynb')

jupyter导出图片

如果已经将ipynb文件通过full模板转为html文件,那么我们可以通过pyppeteer这个python自动化库将html转为png图片

转为图片后,那么几乎所有的自媒体平台都能完美的显示我们的文章

包括:

  • B站专栏
  • 微博
  • 头条号
  • 百家号
  • 企鹅号

因为以上平台不支持代码块表格等md标记,对程序员非常不友好(在这里吐槽一下,勿怪)

缺点就是已经把文字用图片显示,会对推荐算法不友好,导致阅读量减少

pyppeteer是非官方puppeteer自动化库的python实现版本

我们可以通过pip安装它

pip3 install pyppeteer

pyppeteer第一次运行时,会自动下载chromium浏览器,时间可能会有些长

我们也可以主动执行下面的命令来下载浏览器

pyppeteer-install

下载完浏览器之后我们就可以愉快玩耍pyppeteer了

因为pyppeteer是异步的,我们必须用python的异步协程语法来调用它

import asyncio
from pathlib import Path
from pyppeteer import launch

async def get_screenshot(html_path):
    # 通过launch,我们得到了一个浏览器实例
    browser = await launch()
    # 通过newPage,我们得到了一个浏览器页面实例
    page = await browser.newPage()
    # 通过goto,页面访问我们的html文件
    await page.goto('file://' + str(Path(html_path).absolute()))
    # 通过screenshot方法来截图
    # 保存图片为screenshot.png
    # 注意一定要加上fullPage为True,表示全网页截图
    await page.screenshot({'path': 'screenshot.png', 'fullPage': True})
    # 最后关闭浏览器
    await browser.close()

# 表示获取result.html文件的截图
asyncio.get_event_loop().run_until_complete(get_screenshot('result.html'))

这样我们就得到了一个html页面长截图了,OK

总结

  1. jupyter支持多种编程语言在线运行、支持markdown语法,支持幻灯片显示,还支持导出多种格式,简直爽的不要不要的
  2. 快来入坑jupyter,让它来提高我们的写作生产力吧