JiShun_Wang的博客

python爬虫

python3.6爬虫案例:爬取某网站所有PPT(下)。

上篇博客:python3.6爬虫案例:爬取某网站所有PPT(上)给大家介绍了爬取(http://www.1ppt.com/)网站中的ppt文件,爬下来的文件如下:


所以,我们就要考虑将其名称修改为其在网页中显示的名字,并将其批量解压到指定文件夹。

一、批量修改压缩文件名称。

细心的伙伴可以从上图发现,压缩文件的格式不同有zip、rar两种格式,所以我们需要分别处理,在后续的批量解压文件中需要不同的python模块进行处理。批量修改压缩文件名称的思路不难,主要运用os模块,依次打开每个主题中每个栏目下的压缩文件,同时打开zip_utl.txt文件,匹配压缩文件名,匹配成功将中文名称重新命名为压缩文件名称。py文件为Change_file_name.py,代码如下:

import os

#打开类目url,选中文件夹
def split_(string):
    st = string.strip().split(';')
    return st

#处理文件夹名称
def judgeName(name):
    fh = ['?','\\','/',':','*','"','<','>','|']
    for fh_ in fh:
        if fh_ in name:
            name = name.replace(fh_, '_')
    return name


#传入一个当前文件夹名称,对其子文件进行更改名称
def change_file_name(current_file_path):#变量格式:'F://ppt//中国风背景图片//'
    print("正在更改"+current_file_path+"文件夹下的内容")
    current_file_names = os.listdir(current_file_path)
    if len(current_file_names)>2:
        f = open(current_file_path+'zip_url.txt','r',encoding='utf-8')
        current_zip_url_names = f.readlines()
        f.close()
        for current_file_name in current_file_names:
            file_format = current_file_name[current_file_name.find("."):]#读取当前文件格式

        #读取文件名称
            file_name = current_file_name[:current_file_name.find(".")]
        #在zip_url文件中遍历
            for zip_url_name in current_zip_url_names:
                zip_url_name = split_(zip_url_name)
                zip_name = zip_url_name[0]
        #         print(name)
                zip_url = zip_url_name[1]
                file_real_name = zip_url.split('/')[-1][:zip_url.split('/')[-1].find(".")]#在zip_url中的链接中找到压缩文件名
                if file_name == file_real_name:
                    try:
                        if file_format == '.rar':#判断格式,精确重命名,后面文件批量解压不同的格式有不同的方法。
                            os.rename(current_file_path+file_name+'.rar',current_file_path+zip_name+'.rar')
                        else:
                            os.rename(current_file_path+file_name+'.zip',current_file_path+zip_name+'.zip')
                    except:
                        pass
                else:
                    pass

def main():

    with open('F://ppt//url.txt','r') as f_root_url:
        zhu_ti_names = f_root_url.readlines()
    for zhu_ti_item in zhu_ti_names:
        print("正在处理"+zhu_ti_item+'_文件夹下的内容')
        zhu_ti_name = split_(zhu_ti_item)[0]#提取主题名
        with open('F://ppt//'+zhu_ti_name+'//url.txt','r') as f:
            lei_bie_names = f.readlines()
        for lei_bie_item in lei_bie_names:
            lei_bie_name = judgeName(split_(lei_bie_item)[0])
            change_file_name('F://ppt//'+zhu_ti_name+'//'+lei_bie_name+'//')
if __name__ =="__main__":
    main()

运行程序后,效果如下


二、批量解压缩文件到指定文件夹

有了这些文件,如果我们采用批量下载文件的那种方法,未免太浪费时间。python的zipfile与unrar中的rarfile可以分别解压zip、rar文件。思路是遍历每个主题文件夹下的栏目文件夹,找到每个压缩文件,判断其格式,采用相应的方法将需要的压缩包中的文件解压到指定文件夹。该部分的py文件为:ExtractArchiveFile.py,代码如下:

import zipfile
import os
from unrar import rarfile

#打开类目url,选中文件夹
def split_(string):
    st = string.strip().split(';')
    return st

#处理文件夹名称
def judgeName(name):
    fh = ['?','\\','/',':','*','"','<','>','|']
    for fh_ in fh:
        if fh_ in name:
            name = name.replace(fh_, '_')
    return name

#解压缩文件
def archive_extract(zip_exit_file, one_file, two_file):#zip文件所在目录,主题文件夹,类别文件夹
    current_file_path = 'F://ppt1//'+one_file+'//'+two_file+'//' #用于创建新的主题文件夹和类别文件夹
    current_file_names = os.listdir(zip_exit_file) #压缩文件所在的类别文件夹下的所有文件
    for current_file_name in current_file_names:
        print(current_file_name)
        archive_format = current_file_name[current_file_name.find('.'):] #压缩文件格式
        archive_name =  current_file_name[:current_file_name.find('.')]#压缩文件名称
        if archive_format == '.zip':#判断压缩文件类型,不同的类型解压所用的包不同
            azip = zipfile.ZipFile(zip_exit_file+current_file_name,'r')#读取压缩包里面的文件
            try:
                zip_num = 1#如果压缩文件中有多个文件,命名以此加1
                for filename in azip.namelist():#遍历所有文件
#                     print('---'+filename)
                    filename_lenth = len(filename)
                    file_format = filename[filename.find('.',filename_lenth-5):]#提取压缩文件中子文件的格式
    #                 print(file_format)
                    if file_format in ['.pptx', '.ppt' , '.jpg', 'JPG']:#判断是否是需要的文件,如果是则解压到指定文件夹

                        try:
                            azip.extract(filename, path=current_file_path)#解压
                        except:
                            continue
                        if zip_num == 1:#首个文件命名格式
                            os.rename(current_file_path+filename,current_file_path+archive_name+file_format)
                            zip_num += 1
                        else:#如果是多个文件,命名加1
                            os.rename(current_file_path+filename,current_file_path+archive_name+str(zip_num)+file_format)
                            zip_num += 1
            finally:
                pass
            azip.close()
        if archive_format == '.rar':
            arar = rarfile.RarFile(zip_exit_file+current_file_name,'r')
            try:
                rar_num = 1
                for filename in arar.namelist():
    #                 print(filename)
                    filename_lenth = len(filename)
                    file_format = filename[filename.find('.',filename_lenth-5):]
                    if file_format in ['.pptx', '.ppt' , '.jpg', 'JPG']:
                        try:
                            arar.extract(filename, path=current_file_path)
                        except:
                            continue
                        if rar_num == 1:
                            os.rename(current_file_path+filename,current_file_path+archive_name+file_format)
                            rar_num += 1
                        else:
                            os.rename(current_file_path+filename,current_file_path+archive_name+str(rar_num)+file_format)
                            rar_num += 1
    #                 break
            finally:
                pass
    #     break
    print('结束')


def main():

    with open('F://ppt//url.txt','r') as f_root_url:
        zhu_ti_names = f_root_url.readlines()
    for zhu_ti_item in zhu_ti_names:
        print("正在处理"+zhu_ti_item.strip()+'_文件夹下的内容')
        zhu_ti_name = split_(zhu_ti_item)[0]#提取主题名
        try:
            with open('F://ppt//'+zhu_ti_name+'//url.txt','r') as f:
                lei_bie_names = f.readlines()
            for lei_bie_item in lei_bie_names:
                print("   正在解压"+lei_bie_item.strip()+"_类别下的压缩文件")
                lei_bie_name = judgeName(split_(lei_bie_item)[0])
                extract_file = 'F://ppt//'+zhu_ti_name+'//'+lei_bie_name+'//'#压缩文件所在位置
                archive_extract(extract_file, zhu_ti_name, lei_bie_name)
        except:
            with open('F://ppt//'+zhu_ti_name+'//url.txt','r',encoding='utf-8') as f:
                lei_bie_names = f.readlines()
            for lei_bie_item in lei_bie_names:
                print("   正在解压"+lei_bie_item.strip()+"_类别下的压缩文件")
                lei_bie_name = judgeName(split_(lei_bie_item)[0])
                extract_file = 'F://ppt//'+zhu_ti_name+'//'+lei_bie_name+'//'#压缩文件所在位置
                archive_extract(extract_file, zhu_ti_name, lei_bie_name)
            
if __name__ =="__main__":
    main()

这部分代码的注释较详细,大家可以看下,细节性的问题比较多,不再一一啰嗦了。我将文件批量解压到f盘下的PPT1文件下,运行程序之后效果如下:



结束语

到这里,这个网站的PPT按照这样方法基本被我们爬下来了。从这样的网站爬取内容,虽然难度上不是很大,由于网络的原因、网页本身结构的原因,在程序运行的过程中会遇到很多问题,要根据问题能够修改代码使其稳健运行。这些ppt足以满足平时的使用,演示的时候我只做了两个主题中的部分栏目,其他的以后有时间再自己爬下来。

如果有什么问题欢迎留言交流,喜欢本篇文章记得关注我哦。

阅读更多
版权声明: https://blog.csdn.net/JiShun_Wang/article/details/79947084
个人分类: python爬虫
上一篇python3.6爬虫案例:爬取某网站所有PPT(上)。
下一篇python3批量发送邮件
想对作者说点什么? 我来说一句

1.python爬虫源码与PPT

2018年04月18日 13.18MB 下载

没有更多推荐了,返回首页

关闭
关闭