用request和xpath库,爬取PPT素材,(背景、图标、模板)

文章目录


写在前面,源代码仅供学习交流,请各位尊重网络秩序,合理、合法使用爬虫。

这次是用我自己写的requests 功能库 和lxml函数库 制作的爬虫,分为两个PY文件
一个是库的支持文件如下:在另外一个主运行文件中,需要加载这个文件
功能库的注释,已经尽可能写得比较完整,可以拿来直接用,制作其他的爬虫。

import requests
import os
from lxml import etree
from requests.exceptions import RequestException


def get_page(url):
    """
    该函数负责requests.get动作
    获取url的HTML信息
    :param url:传入一个url
    :return: 返回一个二进制的字符串,用于XPATH解析
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3)'
                      ' AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/65.0.3325.162 Safari/537.36'
    }
    try:
        html = requests.get(url, headers=headers)
        print('正在获取当前%s页面的信息……' % url)
        if html.status_code == 200:
            return html.content
        return None

    except RequestException:
        return None


def parse_by_xpah(content, xpath, keyword='', start_n=None, end_n=None):
    """
    该函数解析网页并返回选取结果的列表
    :param content: 二进制的HTML信息
    :param xpath:提取信息的XPath语句
    :param keyword: 用于保证结果有效性的关键词
    :param start_n:结果切片的开始位置
    :param end_n:结果切片的结束位置
    :return: 提取的结果列表
    """
    result_list = []
    html = etree.HTML(content)
    result = html.xpath(xpath)
    for i in result:
        if keyword in i and not i in result_list:
            result_list.append(i[start_n:end_n])
        else:
            continue
    return result_list


def make_dir(file_path):
    """
    如果文件夹不存在,就创造一个文件夹
    :param file_path: 传入一个文件夹的路径
    """
    if not os.path.exists(file_path):
        os.makedirs(file_path)
        print("【%s】文件夹不存在,正在创建!" % file_path)


def get_down(down_url):
    """
    该函数只负责下载对象,返回二进制信息
    :param down_url: 下载目标的URL
    :return: 下载目标的二进制结果
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3)'
                      ' AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/65.0.3325.162 Safari/537.36'
    }
    try:
        down = requests.get(down_url, headers=headers)
        if down.status_code == 200:
            print("正在下载" + down_url)
            return down.content
    except RequestException:
        return None


def save_file(content, name_path, mode='wb'):
    """
    保存文件
    :param content:写入的数据
    :param name_path:文件的完整路径
    :param mode:读写的方式
    """
    with open(name_path, mode) as f:
        f.write(content)
        print('将文件保存在' + name_path)

下面是运行的主文件:

# -*- coding: utf-8 -*-
# 这是加载的上面的功能库
from requestandxpath import *

import time
import os

# 被爬网站的主URL,构成其他URL的基础
base_url = 'http://www.ypppt.com/'

# 在引号内选择类型的拼音,可选类型有 moban beijing tubiao sucai
class_url = 'sucai'

# 爬取的起始页数
start_page = 1

# 爬取的最大页数
max_page = 20

# 爬取间隔时间
sleep_time = 1

# 最终目标的扩展名,用于验证结果有消息
purpose = ['.zip', '.rar', '.ppt', '.pptx', '.jpg', '.ico', '.png']
# 默认存在当前文件夹下的PPT文件夹下
file_path = "./ppt/"

download_index = 1
for index in range(start_page, max_page + 1):
    if index == 1:
        url = base_url + '/' + class_url + '/'
    else:
        url = base_url + '/' + class_url + '/list-' + str(index) + '.html'

    main_url = get_page(url)
    main_parse = parse_by_xpah(main_url, xpath='//a[@class="p-title"]/@href')
    if main_parse is None:
        continue
    # 遍历返回的列表,继续解析
    for part_list in main_parse:
        # 进入单个项目的页面
        part_url = get_page(base_url + part_list)
        # 解析提取下载页的URL
        part_parse = parse_by_xpah(part_url, xpath='//a[@rel="nofollow" and @class="down-button"]/@href')
        # 解析提取该项目的名称
        file_name = parse_by_xpah(part_url, xpath='//div[@class ="infoss" ]/h1/text()')
        # 进入下载页
        click_downlond = get_page(base_url + part_parse[0])
        click_parse = parse_by_xpah(click_downlond, xpath='//a[contains(text(), "下载地址1")]/@href')
        print('解析出的最终下载地址为:', click_parse[0])
        if click_parse is None:
            continue

        # 获取下载文件的扩展名
        ext = os.path.splitext(click_parse[0])[-1]
        if ext not in purpose:
            continue
        # 开始下载
        down_result = get_down(click_parse[0])
        # 创建文件夹
        make_dir(file_path + '/')
        # 保存文件
        try:
            save_file(down_result, file_path + file_name[0] + ext)
        except:
            break
        download_index += 1
        time.sleep(sleep_time)
print('已下载%s个文件' % download_index)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值