这两天抽空把简书的文章都迁移到了自己的博客中,这里小记一下。首先说明我这里的配置环境:
本地安装好 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 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脚本:
到这里,如果你的操作都正确,这个时候去访问你的服务器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 60 from bs4 import BeautifulSoupimport requestsarticlePath = "/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" ) 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' )
这里因为自己用啥的,所以变量啥的命名都比较随意