這是「打造數(shù)據(jù)科學的作品集」系列文章的第二篇。如果你喜歡該系列窟感,而且想知道本系列的下一篇文章什么時候發(fā)布歉井,你可以訂閱我們。讀完本文哩至,你將學會如何使用 Pelican 靜態(tài)網(wǎng)站生成器躏嚎,搭建一個屬于自己的博客,用來展示數(shù)據(jù)科學作品菩貌。
全文大約 9500 字卢佣,讀完需要 15 分鐘左右。
作者:Vik Paruchuri@Dataquest.io
譯者:cystone
校對:EarlGrey
出品:PythonTG 翻譯組/編程派
你可以在這里閱讀本系列第一篇文章:「打造數(shù)據(jù)科學作品集:用數(shù)據(jù)講故事」
寫博客是證明你的實力箭阶、深入學習和建立讀者群的好方法珠漂。有許多數(shù)據(jù)科學和編程類博客幫助他們的作者找到工作,或者認識了重要人物媳危。定期寫博客是有抱負的程序員和數(shù)據(jù)科學家最應(yīng)該做的事情之一荞彼。
不幸的是,寫博客的一大障礙就是先搭建一個博客網(wǎng)站待笑。在這篇文章中鸣皂,我們將學習如何用 Python 創(chuàng)建一個博客網(wǎng)站,怎么用 Jupyter Notebook 寫文章和如何通過 GitHub Pages 部署博客暮蹂。讀完這篇文章寞缝,你就可以使用你熟悉的方式,創(chuàng)建自己的數(shù)據(jù)科學博客了仰泻。
靜態(tài)網(wǎng)站
基本上荆陆,一個靜態(tài)網(wǎng)站就是一個全是 HTML 文件的文件夾。我們可以搭建一個允許別人鏈接到這個文件夾并獲取文件的服務(wù)器集侯。這樣做的好處是不需要數(shù)據(jù)庫或者其他動態(tài)部分被啼,可以很簡單的部署在像 GitHub 之類的網(wǎng)站上。把你的博客做成靜態(tài)網(wǎng)站是一個好主意棠枉,因為維護起來十分簡單浓体。建立靜態(tài)網(wǎng)站的一種方法是手寫 HTML,然后上傳所有的 HTML 文件到服務(wù)器辈讶。這種情況下命浴,你至少要寫一個 index.html
文件。如果你的網(wǎng)站的 URL 是 thebestblog.com
贱除,當訪問者瀏覽 http://www.thebestblog.com
時生闲,他們就會看到 index.html
的內(nèi)容了。HTML 的文件夾可能是下邊的這個樣子:
thebestblog.com
│ index.html
│ first-post.html
│ how-to-use-python.html
│ how-to-do-machine-learning.html
│ styles.css
在上邊的這個網(wǎng)站里月幌,訪問 http://www.thebestblog.com/first-post.html
你就可以看到first-post.html
的內(nèi)容碍讯。first-post.html
可能是下邊這個樣子:
<html>
<head>
<title>The best blog!</title>
<meta name="description" content="The best blog!"/>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<h1>First post!</h1>
<p>This is the first post in what will soon become (if it already isn't) the best blog.</p>
<p>Future posts will teach you about data science.</p>
<div class="footer">
<p>Thanks for visiting!</p>
</div>
</body>
</html>
你可能會立馬發(fā)現(xiàn)手工編輯 HTML 的一些問題:
- 手工編輯 HTML 會很枯燥。
- 如果你想寫多篇文章飞醉,你需要復制很多內(nèi)容冲茸,比如樣式屯阀、Title缅帘、Footer 等。
- 如果你想整合評論系統(tǒng)或者其他插件难衰,你不得不寫 Javascript钦无。
一般來說,你寫博客的時候盖袭,想關(guān)注于博客內(nèi)容失暂,而不是在 HTML 上浪費時間彼宠。謝天謝地,你可以用一個叫做靜態(tài)網(wǎng)站生成器的工具來取代手動編輯 HTML弟塞。
靜態(tài)網(wǎng)站生成器
靜態(tài)網(wǎng)站生成器可以讓你用一些簡單的格式寫文章凭峡,通常是 Markdown,然后再定義一些設(shè)置决记。生成器可以自動把你的文章轉(zhuǎn)換為 HTMl摧冀。使用靜態(tài)網(wǎng)站生成器,你可以把 first-post.html
極大地簡化為 first-post.md
:
# First post!
This is the first post in what will soon become (if it already isn't) the best blog.
Future posts will teach you about data science.
這比處理 HTML 文件要簡單的多系宫!通用的元素索昂,比如 Title 和 Footer,可以放在模板里邊扩借,這樣很容易更改椒惨。
靜態(tài)網(wǎng)站生成器多種多樣。最流行的是用 Ruby 開發(fā)的 Jekyll潮罪。因為我們要搭建一個數(shù)據(jù)科學博客康谆,所以需要網(wǎng)站生成器可以處理 Jupyter Notebooks。
Pelican 是一個用 Python 開發(fā)的網(wǎng)站生成器错洁,可以接受 Jupyter Notebook 文件并轉(zhuǎn)換成 HTML 博客文章秉宿。Pelican 也可以很容易的把文章部署到 GitHub Pages 讓別人閱讀。
安裝 Pelican
開始之前屯碴,這里有一個倉庫(repo)描睦,它就是我們最終成果的示例。
如果你還沒有安裝 Python导而,在開始之前你還需要做一些前期工作忱叭。這里有一些安裝 Python 的說明。我們建議使用 Python3.5今艺。當你安裝完成 Python:
- 創(chuàng)建一個文件夾——我們將把博客網(wǎng)站的內(nèi)容和樣式(Styles)放在這個文件夾里韵丑。該教程把這個文件夾叫做
jupyter-blog
,你可以隨便起名字虚缎。 -
cd
進入jupyter-blog
文件夾撵彻。 - 創(chuàng)建一個叫
.gitignore
的文件,然后把這個文件里的內(nèi)容加進去实牡。我們最后將要把倉庫提交到 git陌僵,而這將會排除一些其他東西。 - 創(chuàng)建并激活一個虛擬環(huán)境创坞。
- 在
jupyter-blog
文件夾里創(chuàng)建一個叫requirements.txt
的文件碗短,內(nèi)容如下:
Markdown==2.6.6
pelican==3.6.3
jupyter>=1.0
ipython>=4.0
nbconvert>=4.0
beautifulsoup4
ghp-import==0.4.1
matplotlib==1.5.1
- 在
jupyter-blog
文件夾里運行pip install -r requirements.txt
來安裝requirements.txt
里邊所有的包。
創(chuàng)建數(shù)據(jù)科學博客
完成了前邊的設(shè)置之后题涨,你就做完創(chuàng)建博客的準備了偎谁!在 jupyter-blog
文件夾里運行 pelican-quickstart
命令总滩,來為你的博客啟動一個交互式安裝序列。你將看到一些幫助你設(shè)置博客屬性的問題巡雨。大多數(shù)問題你只需要點擊 Enter
使用默認設(shè)置就好了闰渔。你需要輸入的就是你網(wǎng)站的名字、網(wǎng)站的作者铐望,另外就是當問到 URL prefix(URL 前綴) 和 timezone(時區(qū)) 的時候選 n
澜建。下邊是個例子:
(jupyter-blog)? jupyter-blog ? pelican-quickstart
Welcome to pelican-quickstart v3.6.3.
This script will help you create a new Pelican-based website.
Please answer the following questions so this script can generate the files
needed by Pelican.
> Where do you want to create your new web site? [.]
> What will be the title of this web site? Vik's Blog
> Who will be the author of this web site? Vik Paruchuri
> What will be the default language of this web site? [en]
> Do you want to specify a URL prefix? e.g., http://example.com (Y/n) n
> Do you want to enable article pagination? (Y/n)
> How many articles per page do you want? [10]
> What is your time zone? [Europe/Paris] America/Los_Angeles
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n)
> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n)
> Do you want to upload your website using FTP? (y/N)
> Do you want to upload your website using SSH? (y/N)
> Do you want to upload your website using Dropbox? (y/N)
> Do you want to upload your website using S3? (y/N)
> Do you want to upload your website using Rackspace Cloud Files? (y/N)
> Do you want to upload your website using GitHub Pages? (y/N)
運行完 pelican-quickstart
以后,jupyter-blog
文件夾里多了兩個文件夾 content
和 output
蝌以,還有一些文件炕舵,比如 pelicanconf.py
和 publishconf.py
。下邊是文件夾目錄的示例:
jupyter-blog
│ output
│ content
│ .gitignore
│ develop_server.sh
│ fabfile.py
│ Makefile
│ requirements.txt
│ pelicanconf.py
│ publishconf.py
安裝 Jupyter 插件
Pelican 默認不支持使用 Jupyter 寫文章跟畅,所以我們需要安裝一個插件來完成這項功能咽筋。我們把插件作為一個 git 子模塊(git submodule)來安裝,這樣便于管理徊件。如果你還沒有安裝 git奸攻,你可以在這里找到安裝說明。當你安裝完成 git 之后:
- 運行
git init
來把當前文件夾初始化為一個 git 倉庫虱痕。 - 創(chuàng)建一個叫
plugins
的文件夾睹耐。 - 運行
git submodule add git://github.com/danielfrg/pelican-ipynb.git plugins/ipynb
來添加插件。
現(xiàn)在應(yīng)該會有一個 .gitmodules
文件和一個 plugins
文件夾:
jupyter-blog
│ output
│ content
│ plugins
│ .gitignore
│ .gitmodules
│ develop_server.sh
│ fabfile.py
│ Makefile
│ requirements.txt
│ pelicanconf.py
│ publishconf.py
為了激活插件部翘,我們需要修改 pelicanconf.py
文件硝训,在最下邊添加幾行代碼:
MARKUP = ('md', 'ipynb')
PLUGIN_PATH = './plugins'
PLUGINS = ['ipynb.markup']
這幾行代碼告訴 Pelican 當生成 HTML 的時候激活插件。
寫第一篇文章
插件安裝完之后新思,就可以寫你的第一篇文章了:
- 創(chuàng)建一個 Jupyter notebook窖梁,簡單寫一些內(nèi)容。這里有一個例子夹囚。
- 把 notebook 文件復制到
content
文件夾纵刘。 - 創(chuàng)建一個和
notebook
同名的文件,但是擴展名是.ipynb-meta
荸哟。這里有一個例子假哎。 - 把下邊的內(nèi)容添加到
ipynb-meta
文件中,但是根據(jù)你自己的文章修改相應(yīng)字段:
Title: First Post
Slug: first-post
Date: 2016-06-08 20:00
Category: posts
Tags: python firsts
Author: Vik Paruchuri
Summary: My first post, read it to find out.
這里以上字段的解釋:
-
Title
——文章的標題鞍历。 -
Slug
——你的文章在服務(wù)器上的路徑舵抹。如果 slug 是first-post
,而且你的服務(wù)器地址是jupyter-blog.com
, 你可以在http://www.jupyter-blog.com/first-post
這個地址找到你的文章堰燎。 -
Date
——文章發(fā)布的日期掏父。 -
Category
——文章的類別——可以是任何東西笋轨。 -
Tags
——文章的標簽秆剪∩奘纾可以隨便掛標簽。 -
Author
——文章作者的名字仅讽。 -
Summary
——文章的摘要陶缺。
每發(fā)布一篇文章,就需要復制一個 notebook 文件洁灵,并創(chuàng)建一個 ipynb-meta
文件
創(chuàng)建好 notebook 和 meta 文件后饱岸,就可以生成博客 HTML 文件了。下邊是 jupyter-blog
文件夾現(xiàn)在的樣子:
jupyter-blog
│ output
│ content
│ first-post.ipynb
│ first-post.ipynb-meta
│ plugins
│ .gitignore
│ .gitmodules
│ develop_server.sh
│ fabfile.py
│ Makefile
│ requirements.txt
│ pelicanconf.py
│ publishconf.py
生成 HTML
為了從文章生成 HTML徽千,我們需要先運行 Pelican 來把 notebooks 轉(zhuǎn)換為 HTML苫费,然后運行本地服務(wù)器來查看:
- 切換到
jupyter-blog
文件夾。 - 運行
pelican content
來生成 HTML双抽。 - 切換到
output
目錄百框。 - 運行
python -m pelican.server
。 - 在瀏覽器里訪問
localhost:8000
來預(yù)覽你的博客牍汹。
在瀏覽器里就可以看到博客里所有文章的列表铐维,以及具體的博客內(nèi)容了。
創(chuàng)建 GitHub Pages
GitHub Pages 是 GitHub 的一項功能慎菲,允許你快速部署靜態(tài)網(wǎng)站嫁蛇,讓所有人都可以通過特定 URL 訪問。為了完成它的配置露该,我們需要:
- 注冊一個 GitHub 帳號睬棚,如果你還沒有的話。
- 創(chuàng)建一個叫
username.github.io
的倉庫解幼,這里username
是你的 GitHub 用戶名闸拿。這里有更詳細的說明告訴你怎么做。 - 切換到
jupyter-blog
文件夾书幕。 - 運行
git remote add origin git@github.com:username/username.github.io.git
把這個倉庫作為遠程倉庫添加到你的本地倉庫新荤,把所有的username
參數(shù)替換為你的 GitHub 用戶名。
GitHub Pages 會把 username.github.io
倉庫的 master
分支下的所有 HTML 文件展示到 username.github.io
這個地址(倉庫和 URL 是一樣的)台汇。
首先我們需要修改 Pelican 使得 URL 指向正確的位置:
- 在
publishconf.py
文件里編輯SITEURL
苛骨,把它設(shè)置為http://username.github.io
,username
還是你的GitHub用戶名苟呐。 - 運行
pelican content -s publishconf.py
痒芝。當你想在本地預(yù)覽你的博客的時候,運行pelican content
牵素。在部署之前運行pelican content -s publishconf.py
严衬。這將使用正確的配置文件進行部署。
提交文件
如果你想把 notebooks 和其他文件作為一個 GitHub Page 放在同一個倉庫里笆呆,你可以使用分支请琳。
- 運行
git checkout dev
切換到一個叫dev
的分支粱挡。我們不能用master
分支來存放 notebooks,因為那個分支是用于 GitHub Pages 展示的俄精。 - 創(chuàng)建一個提交询筏,然后和正常一樣推送到 Github(使用
git add
,git commit
,和git push
)竖慧。
部署到 GitHub Pages
為了讓 Github Pages 正常工作嫌套,我們需要把文章添加到 master
分支中。現(xiàn)在圾旨,HTML
內(nèi)容在 output
文件夾中踱讨,但是我們需要把它放到倉庫的根目錄,而不是子目錄砍的。我們可以使用 ghp-import
工具來完成這項工作:
- 運行
ghp-import output -b master
勇蝙,把output
目錄下的所有東西導入master
分支。 - 使用
git push origin master
把你的內(nèi)容推送到 GitHub挨约。 - 嘗試訪問
username.github.io
——你就可以看到你的頁面了味混!
修改博客后,只要重新運行 pelican content -s publishconf.py
, ghp-import
和 git push
诫惭,你的 GitHub Page 就會更新了翁锡。
下一步
終于搭建好了!你現(xiàn)在可以創(chuàng)作博客夕土,然后推送到 GitHub Pages馆衔。所有人都可以通過 username.github.io
來訪問你的博客(記得把 username 替換為你的 GitHub 用戶名)。這給你提供了一個展示數(shù)據(jù)科學作品集的渠道怨绣。
隨著文章數(shù)和讀者越來越多角溃,你可能就需要在以下方面更深入的研究一下: