重新整理博客

April 10, 2017

这么长时间过去了,好像很久不管这个博客了,差不多10个月过去了。是时候 把这些零散的东西整理一下了。争取把之前在别的地方写的东西都整理到这里 来。这样以后查看会方便很多吧!

主要是2014年的「博客园」上面的东西。找了一下现有的工具hexo-migrator-cnblogs发现早已经不维护了,现在也不能用了。所以写了一个简单的脚本来爬取我的博客:

# 2017/04/11 00:45:15 AM
# Author: liuxueyang

from bs4 import BeautifulSoup
import requests
import re
import os.path

url = 'http://www.cnblogs.com/liuxueyang/default.html?page='
page_nums = range(1, 11)
cnt = 0
already_urls = []

if os.path.exists('already.txt'):
    with open('already.txt', 'r') as already_f:
        already_urls = already_urls + already_f.readlines()

for page_num in page_nums:
    url1 = url + str(page_num)
    r = requests.get(url1)
    soup = BeautifulSoup(r.content, 'html5lib')

    titles = soup.find_all('a', class_='posttitle')
    for title in titles:
        print '==' * 20, '\n\n'
        cnt += 1
        blog_url = title.get('href')
        blog_name = title.string
        blog_r = requests.get(blog_url)

        if blog_url + '\n' in already_urls:
            print cnt, blog_name
            continue

        blog_soup = BeautifulSoup(blog_r.content, 'html5lib')
        blog_body = blog_soup.find(id='cnblogs_post_body')
        blog_date = blog_soup.find(id='post-date').text

        print cnt, blog_url
        tags = 'tags: \n'

        body = [
            '---\n', 'title: "%s"\n' % blog_name, 'date: %s\n' % blog_date,
            tags, '---\n\n'
        ]

        for child in blog_body.children:
            if child.name == 'p':
                body.append(child.text + '\n')
            elif child.name == 'div' and child.has_attr('class') and child.get(
                    'class')[0] == 'cnblogs_code':
                lines = child.text.split('\n')
                body.append('\n```cpp\n')
                for line in lines:
                    line = re.sub(r'^ *', '', line)
                    line = re.sub(r'^\d* ', '', line)
                    body.append(line + '\n')
                body.append('```\n\n')

        for line in body:
            print line,
        file_name = re.sub(r' |/', '-', blog_name) + '.md'
        print file_name

        action = raw_input()

        if action == 'S':
            process_later_file = 'later.txt'
            f = open(process_later_file, 'a')
            f.write(blog_url + '\n')
            print '-' * 30
            print 'process by hand later!'
            print '-' * 30
            f.close()
            continue

        if action:
            action = action.split(',')
            tags = 'tags: [' + ', '.join(action) + ']' + '\n'
            body[3] = tags

        ff = open(file_name, 'w')
        for b in body:
            ff.write(b.encode('utf-8'))
        ff.close()

        with open('already.txt', 'a') as already_f:
            already_f.write(blog_url + '\n')

没有加处理图片的功能。因为以前的博客用的图片并不多,手动处理。它会抓取博客正文和嵌入的代码,处理嵌入代码的时候花了比较多的时间,比如如果从xml中获取到嵌入的代码,然后去掉行号之类的。这个程序抓取到一篇博客就显示出博客正文和代码块来,等待用户输入,如果正常,之间按回车处理下一篇,如果原来的博客有图片或者抓取的内容不完整,按下S会把当前博客的地址保存到一个later.txt这个文本文件里,随后手动处理。已经处理好的博客地址放到already.txt文件里,这样避免了重复处理。结果还可以。

总共有455篇日志了。可能是我的电脑太老的原因,hexo生成的时候竟然用了好几分钟。所以之后想试一试Hakyll了。

comments powered by Disqus