打造數(shù)據(jù)科學作品集:搭建一個數(shù)據(jù)科學博客

這是「打造數(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 文件夾里多了兩個文件夾 contentoutput蝌以,還有一些文件炕舵,比如 pelicanconf.pypublishconf.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.iousername 還是你的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-importgit push诫惭,你的 GitHub Page 就會更新了翁锡。

下一步

終于搭建好了!你現(xiàn)在可以創(chuàng)作博客夕土,然后推送到 GitHub Pages馆衔。所有人都可以通過 username.github.io 來訪問你的博客(記得把 username 替換為你的 GitHub 用戶名)。這給你提供了一個展示數(shù)據(jù)科學作品集的渠道怨绣。

隨著文章數(shù)和讀者越來越多角溃,你可能就需要在以下方面更深入的研究一下:

  • 主題:Pelican 支持主題。在這里你可以看到很多主題篮撑,隨便選一個你喜歡的用吧减细。
  • 自定義URL:使用 username.github.io 已經(jīng)不錯了,但是有時候你可能需要自定義域名赢笨。這里是自定義 GitHub Pages 域名的指南未蝌。
  • 插件:這里有一個插件列表。插件可以幫助你設(shè)置網(wǎng)站數(shù)據(jù)分析茧妒,實現(xiàn)評論等功能萧吠。
  • 推廣:試著把你的文章推廣到 DataTau, Twitter, Quora或者其他一些網(wǎng)站,可以幫助你獲得更多的讀者桐筏。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纸型,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狰腌,老刑警劉巖除破,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異癌别,居然都是意外死亡,警方通過查閱死者的電腦和手機蹋笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門展姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剖毯,你說我怎么就攤上這事圾笨。” “怎么了逊谋?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵擂达,是天一觀的道長。 經(jīng)常有香客問我胶滋,道長板鬓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任究恤,我火速辦了婚禮俭令,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘部宿。我一直安慰自己抄腔,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布理张。 她就那樣靜靜地躺著赫蛇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雾叭。 梳的紋絲不亂的頭發(fā)上悟耘,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音织狐,去河邊找鬼作煌。 笑死,一個胖子當著我的面吹牛赚瘦,可吹牛的內(nèi)容都是我干的粟誓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼起意,長吁一口氣:“原來是場噩夢啊……” “哼鹰服!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悲酷,失蹤者是張志新(化名)和其女友劉穎套菜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體设易,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡逗柴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了顿肺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏溺。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屠尊,靈堂內(nèi)的尸體忽然破棺而出旷祸,到底是詐尸還是另有隱情,我是刑警寧澤讼昆,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布托享,位于F島的核電站,受9級特大地震影響浸赫,放射性物質(zhì)發(fā)生泄漏闰围。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一既峡、第九天 我趴在偏房一處隱蔽的房頂上張望辫诅。 院中可真熱鬧,春花似錦涧狮、人聲如沸炕矮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肤视。三九已至,卻和暖如春涉枫,著一層夾襖步出監(jiān)牢的瞬間邢滑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工愿汰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留困后,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓衬廷,卻偏偏與公主長得像摇予,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吗跋,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 寫博客是一個證明你的技能侧戴,進一步加深學習和積累受眾的一個非常好的方式宁昭。已經(jīng)有非常多的數(shù)據(jù)科學和編程博客幫助它們的作...
    liuchengxu閱讀 1,604評論 2 6
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評論 25 707
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,408評論 7 249
  • 我還是會忽然想起你 在孤身一人的城市里 大海蜕猫、陽光寂曹、沙灘 藍天、暖風回右、椰樹 陌生城市的一切美好 似乎也阻擋不了 我...
    木子wq閱讀 184評論 0 0
  • 今年的雪來得特別晚隆圆,卻又特別大。鵝毛大雪席卷了這個喧囂的城市楣黍,讓它變得安靜匾灶,不再躁動棱烂。 我不愛雪租漂,但我愛在下雪天吃...
    茶太濃閱讀 740評論 1 2