打造數據科學做品集:搭建一個數據科學博客

這是「打造數據科學做品集」系列文章的第二篇。若是你喜歡該系列,並且想知道下一篇文章何時發佈,你能夠訂閱咱們。讀完本文,你將學會如何使用 Pelican 靜態網站生成器,搭建一個屬於本身的博客,用來展現數據科學做品。css

全文大約 9500 字,讀完可能須要 15 分鐘左右。html

你能夠在這裏閱讀本系列第一篇文章:「打造數據科學做品集:用數據講故事」python

寫博客是證實你的實力、深刻學習和創建讀者羣的好方法。有許多數據科學編程類博客幫助他們的做者找到工做,或者認識了重要人物。按期寫博客是有抱負的程序員和數據科學家最應該作的事情之一。git

不幸的是,寫博客的一大障礙就是先搭建一個博客網站。在這篇文章中,咱們將學習如何用 Python 建立一個博客網站,怎麼用 Jupyter Notebook 寫文章和如何經過 GitHub Pages 部署博客。讀完這篇文章,你就可使用你熟悉的方式,建立本身的數據科學博客了。程序員

靜態網站

基本上,一個靜態網站就是一個全是 HTML 文件的文件夾。咱們能夠搭建一個容許別人連接到這個文件夾並獲取文件的服務器。這樣作的好處是不須要數據庫或者其餘動態部分,能夠很簡單的部署在像 GitHub 之類的網站上。把你的博客作成靜態網站是一個好主意,由於維護起來十分簡單。創建靜態網站的一種方法是手寫 HTML,而後上傳全部的 HTML 文件到服務器。這種狀況下,你至少要寫一個 index.html 文件。若是你的網站的 URL 是 thebestblog.com,當訪問者瀏覽 http://www.thebestblog.com 時,他們就會看到 index.html 的內容了。HTML 的文件夾多是下邊的這個樣子:github

thebestblog.com
│   index.html
│   first-post.html
│   how-to-use-python.html
│   how-to-do-machine-learning.html
│   styles.css

在上邊的這個網站裏,訪問 http://www.thebestblog.com/first-post.html 你就能夠看到 first-post.html 的內容。first-post.html 多是下邊這個樣子:web

<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>

你可能會立馬發現手工編輯 HTML 的一些問題:數據庫

  • 手工編輯 HTML 會很枯燥。編程

  • 若是你想寫多篇文章,你須要複製不少內容,好比樣式、Title、Footer 等。瀏覽器

  • 若是你想整合評論系統或者其餘插件,你不得不寫 Javascript。

通常來講,你寫博客的時候,想關注於博客內容,而不是在 HTML 上浪費時間。謝天謝地,你能夠用一個叫作靜態網站生成器的工具來取代手動編輯 HTML。

靜態網站生成器

靜態網站生成器可讓你用一些簡單的格式寫文章,一般是 Markdown,而後再定義一些設置。生成器能夠自動把你的文章轉換爲 HTMl。使用靜態網站生成器,你能夠把 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,能夠放在模板裏邊,這樣很容易更改。

靜態網站生成器多種多樣。最流行的是用 Ruby 開發的 Jekyll。由於咱們要搭建一個數據科學博客,因此須要網站生成器能夠處理 Jupyter Notebooks。

Pelican 是一個用 Python 開發的網站生成器,能夠接受 Jupyter Notebook 文件並轉換成 HTML 博客文章。Pelican 也能夠很容易的把文章部署到 GitHub Pages 讓別人閱讀。

安裝 Pelican

開始以前,這裏有一個倉庫(repo),它就是咱們最終成果的示例。

若是你尚未安裝 Python,在開始以前你還須要作一些前期工做。這裏有一些安裝 Python 的說明。咱們建議使用 Python3.5。當你安裝完成 Python:

  • 建立一個文件夾——咱們將把博客網站的內容和樣式(Styles)放在這個文件夾裏。該教程把這個文件夾叫作 jupyter-blog,你能夠隨便起名字。

  • cd 進入 jupyter-blog 文件夾。

  • 建立一個叫 .gitignore 的文件,而後把這個文件裏的內容加進去。咱們最後將要把倉庫提交到 git,而這將會排除一些其餘東西。

  • 建立並激活一個虛擬環境

  • jupyter-blog 文件夾裏建立一個叫 requirements.txt 的文件,內容以下:

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 裏邊全部的包。

建立數據科學博客

完成了前邊的設置以後,你就作完建立博客的準備了!在 jupyter-blog 文件夾裏運行 pelican-quickstart 命令,來爲你的博客啓動一個交互式安裝序列。你將看到一些幫助你設置博客屬性的問題。大多數問題你只須要點擊 Enter 使用默認設置就行了。你須要輸入的就是你網站的名字、網站的做者,另外就是當問到 URL prefix(URL 前綴) 和 timezone(時區) 的時候選 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 倉庫。

  • 建立一個叫 plugins 的文件夾。

  • 運行 git submodule add git://github.com/danielfrg/pelican-ipynb.git plugins/ipynb 來添加插件。

如今應該會有一個 .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 的時候激活插件。

寫第一篇文章

插件安裝完以後,就能夠寫你的第一篇文章了:

  • 建立一個 Jupyter notebook,簡單寫一些內容。這裏有一個例子。

  • 把 notebook 文件複製到 content 文件夾。

  • 建立一個和 notebook 同名的文件,可是擴展名是 .ipynb-meta這裏有一個例子。

  • 把下邊的內容添加到 ipynb-meta 文件中,可是根據你本身的文章修改相應字段:

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——你的文章在服務器上的路徑。若是 slug 是 first-post,並且你的服務器地址是 jupyter-blog.com, 你能夠在 http://www.jupyter-blog.com/first-post 這個地址找到你的文章。

  • Date——文章發佈的日期。

  • Category——文章的類別——能夠是任何東西。

  • Tags——文章的標籤。能夠隨便掛標籤。

  • Author——文章做者的名字。

  • Summary——文章的摘要。

每發佈一篇文章,就須要複製一個 notebook 文件,並建立一個 ipynb-meta 文件

建立好 notebook 和 meta 文件後,就能夠生成博客 HTML 文件了。下邊是 jupyter-blog 文件夾如今的樣子:

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 轉換爲 HTML,而後運行本地服務器來查看:

  • 切換到 jupyter-blog 文件夾。

  • 運行 pelican content 來生成 HTML。

  • 切換到 output 目錄。

  • 運行python -m pelican.server

  • 在瀏覽器裏訪問 localhost:8000 來預覽你的博客。

在瀏覽器裏就能夠看到博客裏全部文章的列表,以及具體的博客內容了。

建立 GitHub Pages

GitHub Pages 是 GitHub 的一項功能,容許你快速部署靜態網站,讓全部人均可以經過特定 URL 訪問。爲了完成它的配置,咱們須要:

  • 註冊一個 GitHub 賬號,若是你尚未的話。

  • 建立一個叫 username.github.io 的倉庫,這裏 username 是你的 GitHub 用戶名。這裏有更詳細的說明告訴你怎麼作。

  • 切換到 jupyter-blog 文件夾。

  • 運行 git remote add origin git@github.com:username/username.github.io.git 把這個倉庫做爲遠程倉庫添加到你的本地倉庫,把全部的 username 參數替換爲你的 GitHub 用戶名。

GitHub Pages 會把 username.github.io 倉庫的 master 分支下的全部 HTML 文件展現到 username.github.io 這個地址(倉庫和 URL 是同樣的)。

首先咱們須要修改 Pelican 使得 URL 指向正確的位置:

  • publishconf.py 文件裏編輯 SITEURL,把它設置爲 http://username.github.iousername 仍是你的GitHub用戶名。

  • 運行 pelican content -s publishconf.py。當你想在本地預覽你的博客的時候,運行 pelican content。在部署以前運行 pelican content -s publishconf.py。這將使用正確的配置文件進行部署。

提交文件

若是你想把 notebooks 和其餘文件做爲一個 GitHub Page 放在同一個倉庫裏,你可使用分支。

  • 運行 git checkout dev 切換到一個叫 dev 的分支。咱們不能用 master 分支來存放 notebooks,由於那個分支是用於 GitHub Pages 展現的。

  • 建立一個提交,而後和正常同樣推送到 Github(使用 git add, git commit,和 git push)。

部署到 GitHub Pages

爲了讓 Github Pages 正常工做,咱們須要把文章添加到 master 分支中。如今,HTML 內容在 output 文件夾中,可是咱們須要把它放到倉庫的根目錄,而不是子目錄。咱們可使用 ghp-import 工具來完成這項工做:

  • 運行 ghp-import output -b master,把 output 目錄下的全部東西導入 master 分支。

  • 使用 git push origin master 把你的內容推送到 GitHub。

  • 嘗試訪問 username.github.io ——你就能夠看到你的頁面了!

修改博客後,只要從新運行 pelican content -s publishconf.py, ghp-importgit push,你的 GitHub Page 就會更新了。

下一步

終於搭建好了!你如今能夠創做博客,而後推送到 GitHub Pages。全部人均可以經過 username.github.io 來訪問你的博客(記得把 username 替換爲你的 GitHub 用戶名)。這給你提供了一個展現數據科學做品集的渠道。

隨着文章數和讀者愈來愈多,你可能就須要在如下方面更深刻的研究一下:

  • 主題:Pelican 支持主題。在這裏你能夠看到不少主題,隨便選一個你喜歡的用吧。

  • 自定義URL:使用 username.github.io 已經不錯了,可是有時候你可能須要自定義域名。這裏是自定義 GitHub Pages 域名的指南。

  • 插件:這裏有一個插件列表。插件能夠幫助你設置網站數據分析,實現評論等功能。

  • 推廣:試着把你的文章推廣到 DataTau, Twitter, Quora或者其餘一些網站,能夠幫助你得到更多的讀者。

做者:Vik Paruchuri@Dataquest.io
譯者:cystone
校對:EarlGrey
出品:PythonTG 翻譯組/編程派

相關文章
相關標籤/搜索