保存CSDN 中的博客文章为本地文件

保存CSDN 中的博客文章为本地文件


2019年3月31日21:49:39 【原创】
python 学习博客目录

1. 运行环境

最近发现我CSDN里的博客中,外链的图片全部无法加载,博客总使用的图片论坛是 https://i.imgur.com/,图片链接形如 https://i.imgur.com/WxbYfSu.png,图片是使用 markdown 软件写博客时上传的。

目前在国内的 IP 无法访问 i.imgur.com 网站,不知道啥情况。

现在的问题是国内的IP无法访博客里的图片,所以决定挂个国外的代理将图片保存至本地,以后有时间再写个脚本再批量替换,毕竟博客数量还是很多的。

有几点不足:

  1. 未下载 css 和 js 文件,其实实现起来很简单,可以复制代码中的正则自己扩展。
  2. 下载后的HTML文件中的js和css都是需要联网,不联网只能看到文章内容,不能看到美化布局。

废话不多说,环境是 python3 的,没有多余的库需要安装,忘记是不是需要 pillow 库了。

pip install Pillow

2. 流程分解

  1. URL保存在文件中

    保存CSDN 中的博客文章为本地文件_第1张图片

  2. getHtml() 函数,作用是挂代理访问 URL;

     def getHtml(url):
         proxies = {"https": "127.0.0.1:1080"}
         response = requests.get(url, proxies = proxies)
         return response.text
    
  3. getImg() 函数,作用是格式化过滤保存文章内容为图片;

     # 过滤自动跳转
         pattern1 = re.compile(r'
    (.*?)
    ',flags=re.S) match1 = pattern1.sub('',body) #print(match1)
  4. 页面中的title作为文件名,同时也是路径名;

     # 获取title作为文件名使用
     title = ''
     title_list = re.findall('(.*?) - kevinhanser - CSDN博客',match4)
     #print(title_list)
     title = str(title_list[0])
     print(title)
    
  5. 将body中的关于图片的路径链接都替换为本地的图片路径,使在本地查看文章时也可以加载图片;

     # 定位body中的图片位置
         #match5 = pattern5.findall(match4)
         pattern5 = re.compile(r'

    (.*)i.imgur.com') # 替换body中的图片文件名为本地的(./image/+title) match5 = pattern5.sub('(.*?)

',flags=re.S) match1 = pattern1.sub('',body) #print(match1) # 过滤推荐及广告 pattern2 = re.compile(r'(.*)',flags=re.S) match2 = pattern2.sub('
',match1) #print(match2) # 过滤CSDN的最上头的横幅 pattern2_tmp = re.compile(r'b site By baidu end\n \n (.*?) ',flags=re.S) match2_tmp = pattern2_tmp.sub('',match2) #print(match2_tmp) # 过滤css,使页面全屏 pattern3 = re.compile(r'https://csdnimg.cn/release/phoenix/themes/skin-yellow/skin-yellow-2eefd34acf.min.css',flags=re.S) match3 = pattern3.sub('',match2_tmp) #print(match3) # 过滤使页面最大,而不是居中固定宽度 pattern4 = re.compile(r'container',flags=re.S) match4 = pattern4.sub('container_bak',match3) #print(match4) #container # 获取title作为文件名使用 title = '' title_list = re.findall('(.*?) - kevinhanser - CSDN博客',match4) #print(title_list) title = str(title_list[0]) print(title) # python2中使用.decode('string_escape')编码为中文 #title = str(title_list[0]).decode('string_escape') # 获取图片名 picture_list = re.findall('https://i.imgur.com/(.*?).png',match4) picture = picture_list #print picture # 定位body中的图片位置 #match5 = pattern5.findall(match4) pattern5 = re.compile(r'

(.*)i.imgur.com') # 替换body中的图片文件名为本地的(./image/+title) match5 = pattern5.sub('

你可能感兴趣的:(python编程)