MENU

markdown 图片批量下载小工具

November 7, 2017 • Code

前言:针对 markdown 文件的批量上传及批量迁移,对应已经有很好的图形化工具 ipic 及 ipic mover,但是没有将图片批量下载备份到本地的小工具,于是自己动手写了一个。

主要环境及工具

  • 平台:mac 10.12.6
  • 工具:pycharm 2017.2.4
  • 语言:python 3.6.2

主要思路

假设给出的参数是一个md文件

  1. 写成一个方法 def save_img(file_allname)

  2. os.path.splitext 获得对应的文件路径和文件后缀

  3. 生成对应的文件夹

  4. 拼接对应的图片本地路径

  5. 用正则表达式 r'!\[.*\]\((.+)\)' 将文件中的图片链接找出来

  6. urllib.request 将图片下载下来并保存到指定位置

假设给出的参数是一个md文件目录

os.listdir 遍历

  • 如果是文件夹,递归调用
  • 如果是 md 文件,调用 save_img
  • 如果不是 md 文件,pass

具体源码查看

遇到的问题

主要记录在编码过程中遇到的问题

编码问题

在打开 md 文件的时候,报错,提示

经查询后知晓这个问题一般出现 python2.X 上,解决方法如下:

import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
   reload(sys)
   sys.setdefaultencoding(default_encoding)

但是尝试后发现问题依旧存在,最后在 stackoverflow 上找到解决方法:

f = codecs.open('out_file','w',encoding='utf8')

SSL问题

在下载 https 链接的图片的时候,会出现以下问题:

Google 后得知,Python 2.7.9 之后引入了一个新特性当你调用 urllib.urlopen一个 https 的时候会验证一次 SSL 证书 当目标使用的是自签名的证书时就会爆出一个 urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>的错误消息

具体解决方法有两种:

  • 导入 ssl 时关闭证书验证(我用这种解决了问题)
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
  • 使用 ssl 创建未经验证的上下文,在 urlopen 中传入上下文参数(没有尝试过,作记录用)
import ssl
import urllib2
    
context = ssl._create_unverified_context()
print urllib2.urlopen("https://www.111cn.net/", context=context).read()

其它问题

主要有 os.listdir 的及正则表达式的使用问题。

使用 os.listdir 的问题

用 os.listdir 获得文件夹下所有文件包括子文件夹的名称时,仅包括文件、子文件夹的名称,不是整个文件路径(即不包括父文件夹的路径),故需要进行名称的拼接操作

正则表达式的问题

两个中括号需要转义才能正常工作

参考

Last Modified: July 5, 2018
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment