简书是一个简洁、高效的文字创作、分享和阅读平台.简书的编辑器支持Markdown,让你可以专心进行文字创作而不用考虑太多排版工作.当年作者也是因为很喜欢Markdown,而简书的Markdown很漂亮,就加入了简书.
优秀的创作者,可能经常修改自己作品,简书也考虑到了这些,为我们提供了文章离线包,但对于文章的图片只保留了外链,如果电脑无法连网,我们就只能看到纯文本的作品... 对于一个文章含有大量图的创作者,没有图片的作品,观看效果会大打折扣.
为了解决图片离线无法观看的问题,作者用脚本将图片缓存到了本地,很简单!只需四步...
1.登录到简书后台获得自己所有的文章
登录到后台
2.解压获得的压缩包
解压
3.将下面提供的脚本放到.md文件的同级目录
脚本放到.md文件的同级目录
4. 运行脚本
运行脚本
完成后效果
自动创建文件夹为图片分类
自动创建文件夹为图片分类
自动将网络图片链接改为本地图片链接
网络图片链接改为本地图片链接
小结
简书是一个优秀的创作社区,这里不仅有文艺青年,也有程序员,作者也是最近才发现,程序类的创作者是没有签约作者这个选项的... 所以,如果开发者们要往其它平台迁移自己的编程类作品的话,这个脚本可以帮你省很多时间;
热衷于收藏的创作者,可以把自己的简书包留个完整的备份,多年后,看看自己当年的文章,也是一份不错的回忆!
脚本源码(python3环境)
import reimport urllib.requestimport urllib.parseimport osimport sysimport time# 获取当前目录下的文件名列表def get_files(): files = os.listdir() new_files = list() for file in files: try: new_file = re.match(r".*\.md$", file).group() if new_file: new_files.append(new_file) except Exception as e: pass return new_files# 将原文件中的网络图片地址改为本地地址def inter_to_local(file_name, inter_addr, local_addr): with open(file_name+".md", "r") as f: content = f.read() content = content.replace(inter_addr, local_addr, 1) with open (file_name+".md", "w") as f: f.write(content)# 根据提取的url和图片名,下载图片def core_download(dir_name, image_name,image_addr): try: time.sleep(2) url = image_addr user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent':user_agent} req = urllib.request.Request(url, None, headers) image_data = urllib.request.urlopen(req) image_data = image_data.read() # 打开文件 with open("./images/"+dir_name+"/"+image_name, "wb+") as f: f.write(image_data) print("图片%s下载完毕......"%image_name) # 将网络图片替换为本地图片 inter_to_local(dir_name, image_addr, "./images/"+dir_name+"/"+image_name); except Exception as erro: pass# 获取文章中图片的url,并下载到本地def get_urls(): task_files = get_files() try: for task_file in task_files: # 为单个文件创建单独的文件夹 task_file_pure = re.match(r"(.*)\.md",task_file).group(1) try: try: os.mkdir("./images") except: pass os.mkdir("./images/%s"%task_file_pure) except: pass with open(task_file, "r") as f: content = f.read() one_file_image_names_urls = re.findall(r"!\[(.*?)\]\((.*?)\)", content) try: for image_name_url in one_file_image_names_urls: # 如果图片没有名字,则按照时间产生的随机字符串取名 if image_name_url[0] is None: image_name_url[0] = str(int(time.time())) #获取图片格式 image_format = re.match(r".*(\..*?)\?.*", image_name_url[1]).group(1) image_name = image_name_url[0]+image_format image_url = image_name_url[1] try: task_file = re.match(r"(.*)\.md",task_file).group(1) except: pass core_download(task_file,image_name,image_url) except Exception as e: pass except Exception as e: passdef main(): get_urls() passif __name__ == "__main__": main()