文章目录
- 一、前言
- 二、爬取思路
- 三、数据爬取
- 1、导入响应的库
- 2、完整代码
- 3、结果展示
- 四、Blogger’s speech
- 五、补充(乱码问题已解决)
一、前言
到了大学,经常会因为课外活动,学校活动,团课活动,等一系列活动做一些PPT。经常要找PPT模板来应急(不会还有人自己做PPT模板吧,哈哈哈 ),为了省事,于是,我想到了爬虫,把目标网页全部爬下来,供自己使用。
二、爬取思路
首先,选取目标网页:优品PPT
接下来,是数据获取的思路
1、解析初始界面数据
2、获取到每个每个PPT对应的li节点
3、获取对应PPT模板的链接和名字
4、进入每个PPT模板的详情界面
5、解析界面
6、获取PPT模板下载页面的链接
7、进入下载页面
8、解析界面获取下载链接
9、完成PPT模板的下载
图中的xpath分别为:
xpath_1 = '/html/body/div[2]/ul/li'
xpath_2 = '/html/body/div[2]/div[2]/div/div[1]/div[2]/a/@href'
xpath_3 = '/html/body/div[1]/div/ul/li[1]/a/@href'
获取xapth的方法,如图以获取xpath_2为例:
三、数据爬取
1、导入响应的库
import os
import chardet
import requests
from lxml import etree
from tqdm import tqdm
2、完整代码
# -*- coding: UTF-8 -*-
"""
@Author :远方的星
@Time : 2021/5/4 21:17
@CSDN :https://blog.csdn.net/qq_44921056
@腾讯云 : https://cloud.tencent.com/developer/column/91164
"""
import os
import chardet
import requests
import logging
from lxml import etree
from tqdm import tqdm
from fake_useragent import UserAgent# 日志输出的基本配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')path = 'D:/PPT模板'
if not os.path.exists(path):os.mkdir(path)# 随机切换请求头
def random_ua():headers = {"accept-encoding": "gzip", # gzip压缩编码 能提高传输文件速率"user-agent": ua.random}return headers# 得到xpath对应的结果
def get_link(url, xpath):response = requests.get(url=url, headers=random_ua())response.encoding = chardet.detect(response.content)['encoding'] # 自动转换编码格式,与网页一致response = response.texthtml = etree.HTML(response)link = html.xpath(xpath)return link# 获取下载链接并下载
def get_zip_url(url):xpath_1 = '/html/body/div[2]/ul/li'xpath_2 = '/html/body/div[2]/div[2]/div/div[1]/div[2]/a/@href'xpath_3 = '/html/body/div[1]/div/ul/li[1]/a/@href'a = get_link(url, xpath_1) # 获取所有的li节点for i in tqdm(range(len(a))): # 对li节点进行遍历webpage_url = 'https://www.ypppt.com' + a[i].xpath('./a[1]/@href')[0] # 获取到第一个链接zip_name = a[i].xpath('./a[2]/text()')[0] + '.zip' # 获取文本,组成待下载文件的文件名download_link = 'https://www.ypppt.com' + get_link(webpage_url, xpath_2)[0] # 获取下载页面download_url = get_link(download_link, xpath_3)[0] # 获取下载链接save_path = path + '/' + zip_name # 图片的保存地址res = requests.get(url=download_url, headers=random_ua()).contentwith open(save_path, 'wb') as f: # 写入文件,即下载f.write(res)def main():page = int(input('请输入你想要爬取的页数:'))# 网页第一页和之后的地址不是同一个规律,使用条件判断for num in range(1, page+1):if num == 1:url = 'https://www.ypppt.com/moban/'logging.info('正在下载第1页模板,请稍等片刻嗷')get_zip_url(url)else:url = 'https://www.ypppt.com/moban/list-{}.html'.format(num)logging.info('正在下载第{}页模板,请稍等片刻嗷'.format(num))get_zip_url(url)logging.info('你所要求的任务,全部都完成喽~')if __name__ == "__main__":main()
3、结果展示
四、Blogger’s speech
其实,我是想用python顺便把zip文件解压了,更方便一点,但是我用zipfile
成功解压之后,解压文件名出现乱码情况,我在网上找了一些解决方案,没整明白,就不多做解压,以免“画蛇添足”。
如有不足,或者有乱码的解决方法,还请大佬评论区留言或私信我,我会进行补充。
感谢您的支持,希望可以点赞,关注,收藏,一键三连哟。
五、补充(乱码问题已解决)
解包乱码问题解决方案
作者:远方的星
CSDN:https://blog.csdn.net/qq_44921056
腾讯云:https://cloud.tencent.com/developer/column/91164
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。