Press "Enter" to skip to content

将wordpress博客中的yupoo图片片下载至本地

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相册了!

2 Comments

  1. 追梦 2014-09-08

    我用的是渣浪微薄当图床,也想把图片全部保存在本地,不知道有什么好的解决方案没

Leave a Reply

Your email address will not be published. Required fields are marked *