2021-02-27

写在前面  
        这次实现之前的flag:爬取第一ppt网站的所有PPT,当然网站中有其他很多的学习资料,这次只爬取PPT。不仅可以平时做模板演示用,还可以练习爬虫,岂不美滋滋。闲话不多说,进入正题。

        先来说下网站(http://www.1ppt.com/)特点,该网站的结构很清晰,但是网站中的链接如果取下来是不能直接输入浏览器访问的,即:防盗链,这带来了不少额外的工作量.首先,我们不能在程序里面进行直接访问文件进行下载(目前我没有找到其他方法,如果有其他解决方案,欢迎留言交流),所以可以将ppt链接爬下来之后批量导入迅雷进行下载,这点需要手工操作,不过还好工作量不会太大,其次,下载的文件是默认的文件名,不能直观上看到ppt的性质、使用场合,如果知道名字我们就能很容易辨别是否使用与自己想用到的场合。不过都有方法来解决。

    由于工作量大,分两篇博客进行。本篇主要介绍在目标网站中爬取所需的文件,下篇介绍批量修改文件名等。事先透漏下,最后的文件初步估计大约12G,演示的时候没有爬完,所以根据链接数量,文件大小估算了下。(#^.^#)

下面开始撸起来。思路看下面的小标题吧。

一、爬取网站首页主题名称及链接同时创建本地结构文件夹
我们来观察下网站:

打开这些主题发现,图中有七个主题:PPT模板、行业PPT……PPT下载共七个主题里面有不同类目的PPT可供我们爬取。很容易看到这些主题名称与连接元素所在的位置。这步比较简单,py文件为CrawlShouYe.py,代码如下:

#首先爬取类别链接并创建大类文件夹
import requests
import os
from bs4 import BeautifulSoup as bs
 
URL = 'http://www.1ppt.com/'
FILE = 'f:\\python program\\ppt'
#获取网页信息
def get_html(url):
    html = requests.get(url)
    html.encoding = 'gb2312'
    soup = bs(html.text, 'lxml')
    return soup
 
#创建新的文件夹
def creatFile(element):
    path = FILE
    title = element
    new_path = os.path.join(path, title)
    if not os.path.isdir(new_path):
        os.makedirs(new_path)
    return new_path
def main():
    content = get_html(URL)
    div = content.find('div',{'id':'navMenu'})#定位到链接所在位置
    li_all = div.find_all('li')
    with open('f:\\python program\\ppt\\url.txt','w') as f:
        for li in li_all:
            li_a = li.find('a')
            link = URL+li_a['href']
            name = li_a.text
            creatFile(name)
            f.write(name+';'+link+'\n')
    print('结束!')
if __name__ == "__main__":
    main()
 
这里需要额外说明的是创建主题文件夹我们可以通过代码,也可以打开某路径下的要创建的文件,如果文件夹不存在就自动创建。运行程序的效果:

二、下载每个主题下的栏目中的PPT链接,同时创建每个栏目文件夹以及栏目下所有模板链接文本文件。


这时栏目在网页中的位置,找到其标签。我们继续观察每个栏目下面的模板的特点。

上图我打开了动态栏目下的第二页,大家可以发现页码的格式,多打开几页就能很容易构造出跳转页面的链接格式,同时发现所有的模板名称与连接存在于<ul class='tplist'>中,在程序中将这两项内容抓下来存入当前栏目文件夹下的url.txt文件中。最终形成CrawlZipLink.py文件,代码如下:

#首先爬取类别链接并创建大类文件夹
import requests
import os
import time
from bs4 import BeautifulSoup as bs
 
URL = 'http://www.1ppt.com/'
FILE = 'f:\\python program\\ppt'
header = {
    'Referer':'http://www.1ppt.com/',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36'
}
#获取网页信息
def get_html(url):
    html = requests.get(url, headers=header)
    html.encoding = 'gb2312'
    soup = bs(html.text, 'lxml')
    return soup
 
#创建新的文件夹
def creatFile(element, FILE=FILE):
    path = FILE
    title = element
    new_path = os.path.join(path, title)
    if not os.path.isdir(new_path):
        os.makedirs(new_path)
    return new_path
#判断文件名
def judgeName(name):
    fh = ['?','\\','/',':','*','"','<','>','|']
    for fh_ in fh:
        if fh_ in name:
            name = name.replace(fh_, '_')
    return name
 
def CrawModel(new_path,url):
    #用于爬取每个类目下的ppt模板\
 
    f = open(new_path+'\zip_url.txt','w', encoding='utf-8')
    page_num = 1
    flag = True #控制跳出循环
    while True:
        struct_url = url.split('/')[-2]
        curl = url+'/ppt_'+struct_url+'_'+str(page_num)+'.html'
        print(time.ctime()+";爬取"+curl+"页")
        try:#构造正确地址,共三种情况
            page = get_html(curl)
            ul = page.find('ul',{'class':'tplist'})
            li = ul.find_all('li')
        except:
            try:
                curl = url+struct_url+'_'+str(page_num)+'.html'
                page = get_html(curl)
                ul = page.find('ul', {'class': 'tplist'})
                li = ul.find_all('li')
            except:#此种情况是栏目下只有一页,网址不用构造直接使用
                curl = url
                page = get_html(curl)
                flag = False
        # print(curl)
        try:
            ul = page.find('ul',{'class':'tplist'})
#             print(ul)
            li = ul.find_all('li')
            i_num = 1
            for i in li:
                print(time.ctime()+";打印"+str(page_num)+"第"+str(i_num)+"个ppt")
                h2 = i.find('h2')
                href = h2.find('a')['href']
                name = h2.text
                zip_content = get_html(URL+href)
                zip_href = zip_content.find('ul',{'class':'downurllist'}).find('a')['href']
                f.write(name+';'+zip_href+'\n')
                time.sleep(0.2)
                i_num += 1
                ErrNum = 0
            page_num += 1
        except:
            ErrNum += 1
            if ErrNum < 3:#容忍度为3,通过观察很少有连续两张链接不存在的,设置为3是合理的
                page_num += 1 #跳转到下一个链接
                continue
            else: #若是链接已经到达最后一个,超出容忍度后结束
                print('结束')
                break
        if not flag:
            break
    f.close()
def main():
    f_input_url =open('f:\\python program\\ppt\\url.txt','r')
    line = f_input_url.readline().strip()
    while line:
        line_tuple = line.split(';')
        path_leimu = line_tuple[0]
        url_leimu = line_tuple[1]
        #一行,创建每个类目下的栏目文件夹
        f_input_lanmu = open(FILE+'\\'+path_leimu+'\\url.txt', 'r')
        line_lanmu = f_input_lanmu.readline().strip()
        while line_lanmu:
            line_lanmu_tuple = line_lanmu.split(';')
            path_lanmu = line_lanmu_tuple[0]
            url_lanmu = line_lanmu_tuple[1]
            print(FILE+'\\' +path_leimu+'\\' +path_lanmu,url_lanmu)
            # print('------'+path_lanmu)
            path_lanmu = judgeName(path_lanmu)
            path_cell = creatFile(path_lanmu, FILE=FILE+'\\' +path_leimu+'\\')
            #爬取模板
            CrawModel(path_cell,url_lanmu)
    #         print(path_cell)
            line_lanmu = f_input_lanmu.readline().strip()
        f_input_lanmu.close()
        line = f_input_url.readline().strip()
if __name__ == "__main__":
    main()
好多细节性的东西,大家多看几遍程序理解下吧,如果有问题欢迎留言交流(程序个人感觉不够精炼)。运行程序之后的文件夹结构与zip_url.txt文件内容如下系列图。(≧∇≦)ノ

三、提取只含ppt模板链接的链接。
提取不含ppt名称的链接存入zip.txt文件中。这样方便批量导入迅雷进行下载。代码文件为Creat_zipLink.py,代码如下:

#打开类目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 main():
    f_input = open("F:\\python program\\ppt\\url.txt", 'r')
    leimus = f_input.readlines()
    # print(leimus)
    f_input.close()
    for leimu in leimus:
        if leimu.strip():
            leimu_= split_(leimu)
            leimu_name = leimu_[0]#提取类目文件夹
    #         print(file_name)
            f_lanmu = open("F:\\python program\\ppt\\"+leimu_name+'\\url.txt','r')
            lanmus = f_lanmu.readlines()
            for lanmu in lanmus:
                if lanmu.strip():
                    lanmu_ = split_(lanmu)
                    lanmu_name = judgeName(lanmu_[0])
                    lanmu_link = lanmu_[1]
    #                 print(lanmu_name)
                    with open("F:\\python program\\ppt\\"+leimu_name+'\\'+lanmu_name+'\\zip_url.txt','r',encoding='utf-8') as f_zip:
                        with open("F:\\python program\\ppt\\"+leimu_name+'\\'+lanmu_name+'\\zip.txt','w',encoding='utf-8') as f_output:
                            zipUrls = f_zip.readlines()
                            for zipUrl in zipUrls:
                                zipUrl = split_(zipUrl)
                                zip_link = zipUrl[1]
                                f_output.write(zip_link+'\n')
                    print("正在处理"+leimu_name+";"+lanmu_name)
    #                 print('over!')       
    print("结束")
if __name__ == "__main__":
    main()
大家在爬取网站链接后,最后备份下,如果后续代码出错,对原文件操作错误不用重新爬取网站链接,从网站上爬链接受很多因素的影响很费时间。备份后,代码中的路径做相应改变即可。运行上面的代码结果为:

至此,我们将网站中所爬主题下的栏目中的ppt模板全部爬了下来,下一步就是批量下载了。

四、批量下载ppt模板

这个步骤有点费事,需要我们手动打开每个栏目下的zip.txt文件,打开此文本文件,同时打开迅雷,复制文本文件,迅雷自动识别,提示下载,我们将其保存到该栏目文件夹下(和打开的zip.txt)文件在同一个文件夹。下载成功后的模样如下图:

我们发现,这样的文件很是让我们抓狂,所以有对其进行批量修改名称的必要。请移步下篇微博:

python3.6爬虫案例:爬取某网站所有PPT(下)。
————————————————
版权声明:本文为CSDN博主「青衫故人旧33」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jishun_wang/article/details/79919559

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值