python3.6爬⾍案例:爬取某⽹站所有PPT(上)。
写在前⾯
这次实现之前的flag:爬取第⼀ppt⽹站的所有PPT,当然⽹站中有其他很多的学习资料,这次只爬取PPT。不仅可以平时做模板演⽰⽤,还可以练习爬⾍,岂不美滋滋。闲话不多说,进⼊正题。
由于⼯作量⼤,分两篇博客进⾏。本篇主要介绍在⽬标⽹站中爬取所需的⽂件,下篇介绍批量修改⽂件名等。事先透漏下,最后的⽂件初步估计⼤约12G,演⽰的时候没有爬完,所以根据链接数量,⽂件⼤⼩估算了下。(#^.^#)
下⾯开始撸起来。思路看下⾯的⼩标题吧。
⼀、爬取⽹站⾸页主题名称及链接同时创建本地结构⽂件夹
我们来观察下⽹站:
打开这些主题发现,图中有七个主题:PPT模板、⾏业PPT……PPT下载共七个主题⾥⾯有不同类⽬的PPT可供我们爬取。很容易看到这些主题名称与连接元素所在的位置。这步⽐较简单,py⽂件为CrawlShouYe.py,代码如下:
#⾸先爬取类别链接并创建⼤类⽂件夹
import requests
import os
from bs4 import BeautifulSoup as bs
URL = 'www.1ppt/'
FILE = 'f:\\python program\\ppt'
#获取⽹页信息
def get_html(url):
html = (url)
soup = , '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\\','w') as f:
for li in li_all:
li_a = li.find('a')
link = URL+li_a['href']
name =
creatFile(name)
f.write(name+';'+link+'\n')
print('结束!')
if __name__ == "__main__":
main()
这⾥需要额外说明的是创建主题⽂件夹我们可以通过代码,也可以打开某路径下的要创建的⽂件,如果⽂件夹不存在就⾃动创建。运⾏程序的效果:
⼆、下载每个主题下的栏⽬中的PPT链接,同时创建每个栏⽬⽂件夹以及栏⽬下所有模板链接⽂本⽂件。
这时栏⽬在⽹页中的位置,到其标签。我们继续观察每个栏⽬下⾯的模板的特点。
上图我打开了动态栏⽬下的第⼆页,⼤家可以发现页码的格式,多打开⼏页就能很容易构造出跳转页⾯的链接格式,同时发现所有的模板名称与连接存在于<ul class='tplist'>中,在程序中将这两项内容抓下来存⼊当前栏⽬⽂件夹下的⽂件中。最终形成CrawlZipLink.py⽂件,代码如下:
#⾸先爬取类别链接并创建⼤类⽂件夹
import requests
import os
import time
from bs4 import BeautifulSoup as bs
URL = 'www.1ppt/'
FILE = 'f:\\python program\\ppt'
FILE = 'f:\\python program\\ppt'
header = {
'Referer':'www.1ppt/',
'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 = (url, headers=header)
soup = , '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 = place(fh_, '_')
return name
def CrawModel(new_path,url):
#⽤于爬取每个类⽬下的ppt模板\
f = open(new_path+'\','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'
ime()+";爬取"+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:
ime()+";打印"+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')
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\\','r')
line = f_adline().strip()
while line:
line_tuple = line.split(';')
path_leimu = line_tuple[0]
url_leimu = line_tuple[1]
#⼀⾏,创建每个类⽬下的栏⽬⽂件夹
f_input_lanmu = open(FILE+'\\'+path_leimu+'\\', 'r')
line_lanmu = f_adline().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_adline().strip()
f_input_lanmu.close()
line = f_adline().strip()
if __name__ == "__main__":
main()
好多细节性的东西,⼤家多看⼏遍程序理解下吧,如果有问题欢迎留⾔交流(程序个⼈感觉不够精炼)。运⾏程序之后的⽂件夹结构与⽂件内容如下系列图。(≧∇≦)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。