写在前面
这次实现之前的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