网上的免费ppt模板很多,但是当需要使用的时候,一个个去搜寻下载实在是很麻烦,那么为什么不直接寻找一个免费的ppt模板网站,把其免费的PPT模板都爬取下载,需要使用的时候直接挑选即可
网页层次分析
我选取的免费的ppt模板网址是http://www.ypppt.com/moban/
从以上截图可以看出,这是个典型的三层结构
第一层是全部的ppt的列表
第二层是ppt的详情页,在详情页内有下载链接的入口
第三层是我们最终的目标层,存在下载链接
由第一层的链接可以看出翻页非常简单,只要定位到最后一页,循环遍历即可
流程图
代码展示
我用的是scrapy,以下给主体部分的代码。用scrapy十分高效,总共2000+的PPT下载链接在一分钟内就全部爬好了。当然这也跟这个网站没有反爬是分不开的,当然如果不是很着急最后设置一下延时,攻击到网站就不好了
# -*- coding: utf-8 -*-
import scrapy
import re
from ppt_get.items import pptdownload_url
class PptSpider(scrapy.Spider):
name = 'ppt'
allowed_domains = ['ypppt.com']
start_urls = ['http://www.ypppt.com/moban/']
page_num = 0
base_url = 'http://www.ypppt.com'
def parse(self, response):
self.page_num = response.xpath('//div[@class="page-navi"]/a[11]/@href').re_first('\d+')
yield scrapy.Request(url='http://www.ypppt.com/moban/',callback=self.first_deep)
for i in range(2,int(self.page_num)+1):
yield scrapy.Request(url = 'http://www.ypppt.com/moban/list-{}.html'.format(i),callback=self.first_deep)
def first_deep(self, response):
url_list = response.xpath('//ul[@class="posts clear"]/li/a[2]/@href').extract()
for i in url_list:
yield scrapy.Request(url=self.base_url+i,callback=self.second_deep)
def second_deep(self, response):
url = response.xpath('//div[@class="button"]/a/@href').extract_first()
yield scrapy.Request(url=self.base_url+url,callback=self.third_deep)
def third_deep(self, response):
item = pptdownload_url()
download_url = response.xpath('//ul[@class="down clear"]/li/a/@href').extract()
for i in range(len(download_url)):
if 'http://' not in download_url[i]:
download_url[i] = self.base_url + download_url[i]
item['download_url'] = download_url
title = response.xpath('//div[@class="de"]/h1/text()').extract_first().strip(' - 下载页')
item['title'] = title
yield item