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

您所在的位置:网站首页 如何从网页上下载文件 python3.6爬虫案例:爬取某网站所有PPT(上)。

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

2023-11-12 21:29| 来源: 网络整理| 查看: 265

写在前面  

        这次实现之前的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链接,同时创建每个栏目文件夹以及栏目下所有模板链接文本文件。

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

上图我打开了动态栏目下的第二页,大家可以发现页码的格式,多打开几页就能很容易构造出跳转页面的链接格式,同时发现所有的模板名称与连接存在于中,在程序中将这两项内容抓下来存入当前栏目文件夹下的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(下)。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3