上一篇文章让大家脱坑简书,这篇文章来具体说说如何脱坑。
本文将教会你如何把简书中的所有文章(包括文章内的图片)进行导出,并且将利用这些文章建立自己的博客~
首先,我们需要把自己在简书原有的文章导出,这里可以利用简书的导出文章功能,步骤如下:
登录之后选择「设置」
在设置页面先点击左侧的「账号管理」,然后在右边选择「下载所有文章」
这样就能下载所有文章了,不过仅仅是文章的文字内容而已,你上传过的那些图片在文件里面只是一个链接而已~
随便打开一篇看看,如下图:
这样肯定不行啊,只下载了文字内容,没下载图片。但是别急,下面我用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等平台搭建免费博客的操作,我会在下一篇文章中介绍,欢迎关注哦~