如何导出简书中的全部文章(包括图片)?

1,882 阅读3分钟

上一篇文章让大家脱坑简书,这篇文章来具体说说如何脱坑。

本文将教会你如何把简书中的所有文章(包括文章内的图片)进行导出,并且将利用这些文章建立自己的博客~

首先,我们需要把自己在简书原有的文章导出,这里可以利用简书的导出文章功能,步骤如下:

登录之后选择「设置」

在设置页面先点击左侧的「账号管理」,然后在右边选择「下载所有文章」

这样就能下载所有文章了,不过仅仅是文章的文字内容而已,你上传过的那些图片在文件里面只是一个链接而已~

随便打开一篇看看,如下图:

这样肯定不行啊,只下载了文字内容,没下载图片。但是别急,下面我用Python做了一个小工具,可以把文章中的所有图片下载下来,并且把文章中的所有图片链接替换为本地的链接~

简单实现原理

markdown里的图片处理我之前已经写过博客了,看这里:python实现解析markdown文档中的图片,并且保存到本地~

不过我这次换了一种方式来处理markdown,之前的做法有点绕,而且只是单纯的下载图片,没有把图片链接替换成本地的相对地址。

这次我用了mistletoe这个库,可以实现将markdown解析为一个xml树,这样比起我之前的做法少了一步哈哈,可以直接读取markdown里的所有图片,然后一一下载,之后通过正则匹配的方式,对图片进行一一替换。下载的文件夹用了Typora的方案:markdown文件名.assets

实现的代码

下载和替换图片的方法:

def download_and_replace_image(filepath: str):
    print(f'正在处理文件:{filepath}')
    print(filepath)
    with open(filepath, 'r', encoding='utf-8') as f:
        file_content = f.read()
        html = mistletoe.markdown(file_content)
        soup = BeautifulSoup(html, features='html.parser')
        for img in soup.find_all('img'):
            img_url: str = img.get('src')
            if not img_url.startswith('http://') and not img_url.startswith('https://'):
                print(f'不是有效的网络图片链接,跳过')
                return
            img_name = os.path.basename(img_url.replace(url_suffix, ''))
            print(f'下载图片:{img_name}')
            download_pics(img_url, filepath)
            if '.' in img_name:
                img_base_name = img_name[0:img_name.index('.')]
            else:
                # 没有图片后缀的话就加上jpg
                img_base_name = img_name + '.jpg'
                img_name += '.jpg'

            img_relative_path = os.path.join(os.path.basename(filepath).replace('.md', '.assets'), img_name)
            print(f'替换图片链接:{img_url} with {img_relative_path}')

            file_content = re.sub(f"!\\[.*?\\]\\((.*?){img_base_name}(.*?)\\)", f'{{% assets {img_base_name} %}}', file_content)
            file_content = file_content.replace(f'{{% assets {img_base_name} %}}', f'![]({img_relative_path})')

        updated_file_content = file_content

    with open(filepath, 'w+', encoding='utf-8') as f:
        print(f'改动写入文件:{filepath}')
        f.write(updated_file_content)

搭配线程池加快处理速度:

def run():
    print('正在处理。')

    work_path = os.path.join('.', 'docs')

    pool = threadpool.ThreadPool(4)
    args = []

    for root, dirs, files in os.walk(work_path):
        for filename in files:
            if filename.endswith('md'):
                filepath = os.path.abspath(os.path.join(root, filename))
                args.append(filepath)
                # download_and_replace_image(filepath)

    tasks = threadpool.makeRequests(download_and_replace_image, args)
    [pool.putRequest(task) for task in tasks]

    print('=> 线程池开始运行')
    pool.wait()
    print('任务完成。')

完整代码我稍后上传到github,感兴趣的同学可以去下载 (我觉得应该没有)

小工具下载

上面发了代码可能对大部分同学来说不实用,别担心,我早就把这个功能做成了小工具供大家下载~

下载下来放在和你的文章同个文件夹,双击打开即可自动处理​文章,​举个例子,图片中每个文件夹就是一个文章分类,每个文件夹下面有若干个markdown文件,把程序放在这里运行即可,(有不懂的可以后台留言)

在公众号「画星星高手」后台回复「简书」即可获得下载链接

扫描二维码关注

后续

只是下载了文章和图片并不是我们的最终目的,有了这些文章和图片,我们可以搭建新的博客,而不用依靠某个平台,不用受无良平台的制约~

关于使用Github、Gitee等平台搭建免费博客的操作,我会在下一篇文章中介绍,欢迎关注哦~