Fork me on GitHub

将博客从简书迁移到到 Hexo

这两天抽空把简书的文章都迁移到了自己的博客中,这里小记一下。首先说明我这里的配置环境:

  • 本地安装好 hexo 配套环境
  • 阿里云服 Ubuntu 服务器中安装 git 和 nginx

简单配置

原来是利用 github + hexo 来搭建自己的博客的,后来折腾了一下 wordpress,恩,感觉的确是够折腾的,还是改回 hexo 好了。在准备改回来的时候,我转念一想,github 也就是作为一个 git 仓库,那么我能否利用自己的服务器来作为静态页面的容器呢?说干就干,试了一下果然可以。首先在服务器建立一个 git 仓库(这里省略本地和服务器环境配置的过程):

1
2
# mkdir ~/blog
# git init --bare ~/blog/hexo.git

之后配置钩子,在每次收到 post 后将文件更新到 nginx 的资源目录下,钩子在 git 目录的 hooks 目录下:

1
2
# cd ~/blog/hexo.git/hooks
# vim post-receive

之后输入以下内容:

1
2
3
#!/bin/bash

git --work-tree=/var/www/hexo --git-dir=/home/xiasuhuei321/blog/hexo.git checkout -f

这里 var/www/hexo 是我服务器中创建的资源存放位置,这里根据各位自己的实际情况来操作。之后wq退出vim保存,到这里,服务器的配置就基本完成了,还是比较简单的。

本地配置也比较简单,利用 hexo 命令创建一个本地目录:

1
2
3
4
$ mkdir ~/Desktop/blog
$ cd ~/Desktop/blog
$ hexo init
$ npm install

由于每次生成静态界面和发布都需要输入hexo g,hexo d这两个命令,可以写一个 shell 脚本。

1
$ vim post.sh

输入以下命令:

1
2
3
#!/bin/bash
hexo g
hexo d

这里需要修改一下 hexo 的配置文件,找到目录下的_config.yml,找到以下内容并填入自己的配置:

1
2
3
4
deploy:
type: git
repo: xiasuhuei321@你的服务器ip:/home/xiasuhuei321/blog/hexo.git
branch: master

这里要注意yml对格式的要求比较严格,缩进和冒号后的空格不能有错,保存修改后执行之前编写的post.sh脚本:

1
$ ./post.sh

到这里,如果你的操作都正确,这个时候去访问你的服务器ip,是会看到hexo生成的那篇默认文章的。接下来就是迁移简书的文章了。

迁移简书文章

迁移简书文章还是比较简单的,进入设置里面,可以打包下载自己所有的文章,包括草稿,不过那个创作时间可不包括在文章里面,是简书自己记录的,hexo 在头部是可以加上创作时间的。我个人对于这个也是比较在乎的,所以写了个小脚本来自动为文章的md文件加上这段头。hexo这段头的格式是这样的:

1
2
3
4
5
---
title: Python入手(二)
date: 2017-10-31 00:52:20

---

这里想要拿到时间,进主页观察一下布局:
时间
利用 chrome 自带的工具分析起来很方便,这里用 python 的requests 和 BeatifulSoup 库来请求和解析 html。当然,我这里并没有选择用主页的 url 来解析,而是选择了自己当初创建的分类,而自己打包下载文章实际上也是根据这种分类来的。需要注意的是,如果你的文章标题里有空格,文件名里会自动转成 - ,我在这里小小的吃了个亏。还有一点要注意的就是请求访问请求文章的时候一次只会返回九篇,如果超过九篇,则需要额外的请求
需要额外请求

类似于图上的这种,我这里只有两个分类超过了九篇,而且我写的脚本也不是全自动的,需要自己手填 url ,所以明白了这一点之后就很简单了,脚本如下,各位可以根据自己的需要改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# -*- coding: UTF-8 -*-
from bs4 import BeautifulSoup
import requests

articlePath = "/Users/luojun/Desktop/笔记/user-1976147-1527572719/Android学习笔记"
url = "https://www.jianshu.com/nb/4067642?order_by=added_at&page=4"
mdStr = '---\n' \
'title:\n' \
'date:\n' \
'---\n'

headers = {"Accept": "text/html,application/xhtml+xml,application/xml;",
"Accept-Encoding": "gzip",
"Accept-Language": "zh-CN,zh;q=0.8",
"Referer": "http://www.example.com/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36"}

resp = requests.get(url, headers=headers)
bs = BeautifulSoup(resp.text, "html.parser")


# print(resp.text)

def handleArticle(str, title):
with open(articlePath + '/' + title + '.md', 'r+') as f:
i = 0
s = ''
specStart = False
while i < 9:
t = f.readline()
if t.startswith('```'):
s += '<!--more-->\n' + t
specStart = True
break
s += t
i += 1
leftS = f.read()
f.seek(0)
f.write(str)
f.write(s)
if not specStart:
f.write('<!--more-->\n')
f.write(leftS)


# 获取文章列表模块
container = bs.find('div', {'id': 'list-container'})
# 获取标题和时间
for item in container.find_all('li'):
title = item.find('a', {'class': 'title'}).get_text()
print(title)
time = item.find('span', {'class': 'time'})['data-shared-at']
time2 = time.replace('T', ' ')
time3 = time2.split('+')[0].lstrip(' ')
mdStr2 = mdStr.replace('title:', 'title: ' + title)
mdStr3 = mdStr2.replace('date:', 'date: ' + time3)
handleArticle(mdStr3, title)
print(mdStr3)
print('finish\n')

这里因为自己用啥的,所以变量啥的命名都比较随意~