2007年建立这个博客的时候,使用的还是虚拟主机,出于容量不够及备份等因素的考虑,当时我使用了Yupoo相册来保存及外链博客里的图片,6年过去了,博客里的这些图片仍然可以显示,外链的地址没有失效,说明Yupoo还是一个靠谱的网络相册的。
但国内的互联网形势风云变幻,谁也说不准将来会发生什么事儿,曾经风极一时的拍拍乐(886.cn)到现在已经不能访问了,巴巴变也经历了数次改版,在2008年中旬,Yupoo进行了一次大的改变,限制了用户的外链,强行将外链的图片加上了广告,当时我还在博客上极其强烈的吐嘈了Yupoo一顿。从那时起,我就一直在思考,如何更好的保存博客中的图片.
到2010年,VPS兴起了,这个博客用上了Burst.net家的VPS,20G的空间,再也不用担心容量不够了。从那时起,基本也开始用博客自身的空间来保存图片了,在VPS上部署了备份脚本,这下再也不用担心空间跑路或者其它的因素了。但有个显著的问题,博客里以前Yupoo外链的图片太多,要如何转移过来?一直到今天,写了这个Python脚本,解决了这个问题。
脚本会把数据库中的所有yupoo图片下载至本地的yupoo目录,图片的文件名不变,把yupoo目录上传至博客的/wp-content/uploads/目录,然后,博客就彻底脱离了Yupoo!
yupoo相册的图片地址类似于以下这几种:
http://pic.yupoo.com/用户名/xxxxxx/xxxxxxxxx.jpg
http://photo14.yupoo.com/年月日/xxxx_xxxxxxx_xxxxxxx.jpg
http://photo15.yupoo.com/年月日/xxxx_xxxxxxx_xxxxxxx.jpg
经过脚本替换以后,数据库里的如上地址会被替换成:
/wp-content/uploads/yupoo/xxx/xxxxx.jpg
脚本内容:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import os
import socket
import urllib
class yupoo:
"""
批量下载博客中引用的yupoo图片,并将数据库中的图片地址替换
"""
def __init__(self,file,user):
self.file = file
self.user = user
def down(self):
print('下载数据库中的yupoo图片...')
pat1 = r'http://pic\.yupoo\.com/' + self.user + r'/[a-zA-Z0-9]+/[a-zA-Z0-9]+\.jpg'
pat2 = r'http://photo[0-9]{1,2}\.yupoo\.com/[0-9]+/.{6,30}.jpg'
try:
f = open(self.file)
ori = f.read()
socket.setdefaulttimeout(60)
f1 = open(os.getcwd() + '/download.txt','a')
try:
if re.search(pat1,ori):
allimg = re.findall(pat1,ori) #筛选出图片的网址
for i in range(0,len(allimg)):
img = allimg[i]
print('downloading ' + img)
sect = img.split('/') #将网址分片
if not os.path.isdir(os.getcwd() + '/yupoo/' + sect[4]):
os.mkdir(os.getcwd() + '/yupoo/' + sect[4])
urllib.urlretrieve(img,os.getcwd() + '/yupoo/' + sect[4] + '/' + sect[5])
f1.write(img + '\n')
except IOError, e:
print e
try:
if re.search(pat2,ori):
allimg = re.findall(pat2,ori) #筛选出图片的网址
for i in range(0,len(allimg)):
img = allimg[i]
print('downloading ' + img)
sect = img.split('/') #将网址分片
if not os.path.isdir(os.getcwd() + '/yupoo/' + sect[3]):
os.mkdir(os.getcwd() + '/yupoo/' + sect[3])
urllib.urlretrieve(img,os.getcwd() + '/yupoo/' + sect[3]+ '/' + sect[4])
f1.write(img + '\n')
except (URLError, HTTPError, IOError), e:
print e
finally:
f.close()
f1.close()
def repl(self):
print('替换数据库中的图片地址...')
pat1 = r'http://pic\.yupoo\.com/' + self.user + '/'
pat2 = r'http://photo[0-9]{1,2}\.yupoo\.com' + '/'
try:
f = open(self.file)
ori = f.read()
if re.search(pat1,ori):
des = re.sub(pat1,'/wp-content/uploads/yupoo/',ori)
if re.search(pat2,ori):
des1 = re.sub(pat2,'/wp-content/uploads/yupoo/',des)
f1 = open(os.getcwd() + '/a1.sql','w')
f1.write(des1)
finally:
f.close()
f1.close()
if __name__ == '__main__':
yp = yupoo('a.sql','你的Yupoo用户名')
yp.down()
yp.repl()
将如上脚本保存一个yupoo.py文件,用phpmyadmin等工具,将数据库导出为一个a.sql文件,跟yupoo.py放在同一目录,然后执行
python yupoo.py
然后,本地会多出如下内容
一个yupoo目录,需要上传至/wp-content/uploads/目录
一个download.txt文件,记录了所有yupoo图片链接
然后,就可以彻底脱离yupoo相册了!
不错不错,可以一次性都下载下来! 补充下解决方案,不懂程序的,可以下插件来解决 http://www.brunoxu.com/save-post-yupoo-imgs.html
我用的是渣浪微薄当图床,也想把图片全部保存在本地,不知道有什么好的解决方案没