【Python_Scrapy学习笔记(十四)】基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)

news2024/11/20 20:39:24

基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)

前言

本文中介绍 如何基于 Scrapy 框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取),并以抓取 第一PPT 网站的 PPT 模板为例进行展示,同时抓取此网站数据的方式也是对如何使用 Scrapy 框架实现多级页面的抓取进行详解。

正文

1、Scrapy框架抓取文件原理

Scrapy框架 提供了文件管道类 FilesPipeline,来抓取文件,在使用时需要导入from scrapy.pipelines.files import FilesPipeline,并且重新 get_media_requests() 方法,如果对保存的文件名有要求,则需要重写 file_path() 方法;通过 settings.py 文件中的 FILES_STORE 属性可以设置文件保存路径。

2、Scrapy框架抓取文件实现步骤

  1. 爬虫文件:将文件链接 yield 到管道

  2. 管道文件:导入并继承 scrapy 的 FilesPipeline 类,重写get_media_requests() 方法 和 file_path() 方法;

    from scrapy.pipelines.files import FilesPipeline
    class XxxPipeline(FilesPipeline):
         def get_media_requests(self,xxx):
             # 把链接交给调度器入队列
         def file_path(self,xxx):
             # 此处生成文件名
             return filename
    
  3. settings.py:在全局配置文件中,通过 FILES_STORE=“路径” 指定文件保存的位置。

3、Scrapy框架抓取文件案例

  1. 案例需求:爬取 第一PPT 网站下栏目分类各个类别的PPT模板并保存到本地
    在这里插入图片描述

  2. 一级页面分析:
    一级页面url地址:http://www.1ppt.com/xiazai/
    提取数据:
    li_list = "//div[@class='col_nav clearfix']/ul/li" 第一个不是
    1.1>栏目分类名称: ./a/text()
    1.2>栏目分类链接: ./a/@href:访问资源的路径 需要和 https://www.1ppt.com 进行拼接
    在这里插入图片描述

  3. 二级页面分析:进入到了某个栏目分类
    提取数据:li_list = "//div/dl/dd/ul[@class='tplist']/li"
    2.1>PPT名称: ./h2/a/text()
    2.2>进入详情页链接: ./h2/a/@href:访问资源的路径 需要和 https://www.1ppt.com 进行拼接
    在这里插入图片描述

  4. 三级页面分析:三级页面:进入到了PPT详情页
    提取数据:
    3.1>进入下载页的链接 //ul[@class='downurllist']/li/a/@href :访问资源的路径 需要和 https://www.1ppt.com 进行拼接
    在这里插入图片描述

  5. 四级页面分析:进入到了PPT下载页
    提取数据://ul[@class='downloadlist']/li[@class='c1']/a/@href
    4.1>具体PPT的下载链接 --> 交给项目管道文件处理
    在这里插入图片描述

  6. 创建Scrapy项目:编写items.py文件
    这里要明确最后要保存的只有 大分类的名称 及PPT下载链接

    import scrapy
    
    
    class PptItem(scrapy.Item):
        # 定义什么? 管道文件需要什么?
        # 大分类名称、具体PPT文件名、PPT下载链接
        parent_name = scrapy.Field()
        ppt_name = scrapy.Field()
        download_url = scrapy.Field()
    
    
  7. 编写爬虫文件:

    import scrapy
    from ..items import PptItem
    import json
    
    class PptSpider(scrapy.Spider):
        name = "ppt"
        allowed_domains = ["www.1ppt.com"]
        start_urls = ["http://www.1ppt.com/xiazai/"]
    
        def parse(self, response):
            """
            一级页面的解析函数,提取数据:分类名称和链接
            :param response:
            :return:
            """
            li_list = response.xpath("//div[@class='col_nav clearfix']/ul/li")
            for li in li_list[1:]:  # 从第二个元素开始
                item = PptItem()  # 创建item对象
                item["parent_name"] = li.xpath("./a/text()").get()
                class_href = "https://www.1ppt.com" + li.xpath("./a/@href").get()
                # 将class_href交给调度器入队列
                yield scrapy.Request(url=class_href, meta={"meta1": item}, callback=self.parse_second_page)
    
        def parse_second_page(self, response):
            """
            二级页面的解析函数,提取数据:PPT名称 & 进入详情页链接
            :return:
            """
            # 接受上一个解析函数传过来的meta对象
            meta1 = response.meta["meta1"]
            # 开始解析提取数据
            li_list = response.xpath("//div/dl/dd/ul[@class='tplist']/li")
            for li in li_list:
                item = PptItem()  # 创建item对象
                item["parent_name"] = meta1["parent_name"]
                item["ppt_name"] = li.xpath("./h2/a/text()").get()
                ppt_info_url = "https://www.1ppt.com" + li.xpath("./h2/a/@href").get()
                # 将ppt_info_url交给调度器入队列
                yield scrapy.Request(url=ppt_info_url, meta={"meta2": item}, callback=self.parse_third_page)
    
        def parse_third_page(self, response):
            """
            三级页面的解析函数,提取数据:进入下载页的链接
            :param response:
            :return:
            """
            meta2 = response.meta["meta2"]
            enter_download_page = "https://www.1ppt.com" + response.xpath("//ul[@class='downurllist']/li/a/@href").get()
            # 直接交给调度器入队列
            yield scrapy.Request(url=enter_download_page, meta={"item": meta2}, callback=self.parse_fourth_page)
    
        def parse_fourth_page(self, response):
            """
            四级页面的解析函数,提取数据:具体PPT的下载链接
            :param response:
            :return:
            """
            item = response.meta["item"]
            item["download_url"] = response.xpath("//ul[@class='downloadlist']/li[@class='c1']/a/@href").get()
            # 一条完整的item数据提取完成,交给管道文件处理
            yield item
    
    

    注意:四级页面中meta参数的使用

  8. 在管道文件中导入导入并继承 scrapy 的 FilesPipeline类,重写get_media_requests() 方法 和 file_path() 方法:

    import os
    import scrapy
    from scrapy.pipelines.files import FilesPipeline
    
    
    class PptPipeline(FilesPipeline):
        def get_media_requests(self, item, info):
            """
            重写get_media_requests()方法,将文件下载链接交给调度器入队列
            :param item:
            :param info:
            :return:
            """
            yield scrapy.Request(url=item["download_url"], meta={"item": item})
    
        def file_path(self, request, response=None, info=None, *, item=None):
            """
            重写file_path(),调整文件保存路径及文件名
            :param request:
            :param response:
            :param info:
            :param item:
            :return:
            """
            item = request.meta["item"]
            # filename:工作总结PPT/xxxxxxxxxxppt.zip
            filename = '{}/{}{}'.format(
                item["parent_name"],
                item["ppt_name"],
                os.path.splitext(item["download_url"])[1]
            )
            return filename
    
    
  9. 在全局配置文件中,通过 FILES_STORE=“路径” 指定文件保存的位置

    FILES_STORE = "./pptfiles/"
    
  10. 创建run.py文件运行爬虫:

    from scrapy import cmdline
    cmdline.execute("scrapy crawl ppt".split())
    
  11. 运行效果:
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装Nexus搭建Maven私服及介绍

目录前言一、Nexus是什么?二、Docker安装方式1. 拉取镜像2. 创建挂载目录3. 运行4. 容器运行日志 (可选)三、用户登录四、仓库介绍五、创建代理仓库六、上传依赖(重点)七、下载依赖常见问题1、如何把新建的仓库添加到组…

【前端之旅】vue-router声明式导航和编程式导航

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…

科研作图-常用的图像分割指标 (Dice, Iou, Hausdorff) 及其计算

1. 简介 本节内容主要是介绍图像分割中常用指标的定义、公式和代码。常用的指标有Dice、Jaccard、Hausdorff Distance、IOU以及科研作图-Accuracy,F1,Precision,Sensitive中已经介绍的像素准确率等指标。在每个指标介绍时,会使用编写相关代码,以及使用M…

TypeScript学习记录Ts基础

安装及初步使用 1.CMD全局安装 npm install -g typescript2.检查是否安装成功 tsc -V 如报错tsc 不是内部或外部命令,也不是可运行的程序或批处理文件[可参考](https://www.cnblogs.com/sanyekui/p/13157918.html)3.在vscode中新建ts文件01_ts.ts let str:strin…

iPhone上5款视频压缩工具推荐,学会轻松压缩视频

随着技术的不断进步,现在移动端设备已经能够轻松地拍摄高清视频,然而这也带来了存储压力的增大。苹果手机更新换代频繁,但内存空间却没有跟着变大,因此如何压缩视频成为了一个重要的问题。 苹果手机怎么压缩视频?有什…

01-ASPICE体系知识

1. ASPICE是什么? ASPICE: 全称是"Automotive Software Process Improvement and Capacity Determination",汽车软件过程改进及能力评定,是汽车行业用于评价软件开发团队的研发能力水平的模型框架。最初由欧洲20多家主要汽车制造商…

上位机:创建WPF应用并使用控件完成控件交互

创建WPF应用并使用控件完成控件交互 1.XAML是WPF技术中专门用于设计UI的语言。 2.优点,XAML是一种声明型语言,只能用来声明一些UI元素、绘制UI和动画,不能在其中加入程序逻辑。实现UI与逻辑的剥离。 下面使用visual studio2019建立一个WPF项目: 进入项目,点击运行,然后…

FluxMQ—引领物联网新时代的高性能MQTT网关

FluxMQ—引领物联网新时代的高性能MQTT网关 随着物联网技术的快速发展,人们越来越意识到实时、可靠、安全的数据传输对于智能化的生产与生活的重要性。因此,市场对于高性能的物联网数据传输解决方案有着强烈的需求。FluxMQ正是为满足这一需求而诞生的一…

苹果电脑怎么用移动硬盘ntfs 苹果电脑移动硬盘怎么退出

Mac电脑默认不支持写入NTFS格式移动硬盘,这导致很多Mac用户的工作过程遇到很多不必要的麻烦。如何才能让Mac电脑“永久”拥有写入NTFS格式移动硬盘的权限呢?不少用户使用完移动硬盘后直接拔出,这可能会导致未保存的文件丢失。使用完移动硬盘后…

城市供水绩效指标解释

1.城市供水绩效评价指标体系构成 1.1.1绩效指标体系横向构成包括: 背景信息:用于计算指标的数据。 解释性因素:靠管理不易改变的数据。 绩效指标:若干个基础数据的综合运算结果,用于评价所提供服务的有效性…

Python每日一练(20230418)

目录 1. 将有序数组转换为二叉搜索树 🌟🌟 2. 四数之和 🌟🌟 3. 排序数组查找元素的首末位置 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C…

JAVA基于局域网的聊天室系统的设计与实现

本文介绍了采用JAVA编程开发视频聊天系统的一套比较常用的解决方案。文字聊天采用TCP模式;语音视频聊天采用UDP模式,在客户端之间点对点的进行。在该方案中,通过函数库VFW来实现视频捕获、影像压缩以及影像播放。微软公司提供的专门用于视频捕…

Python入门教程+项目实战-10.2节: 列表的操作符

目录 10.2.1 列表中的常用操作符 10.2.2 []操作符: 索引访问列表 10.2.3 [:]操作符:列表的切片 10.2.4 操作符:列表的加法 10.2.5 *操作符:列表的乘法 10.2.6 列表的关系运算 10.2.7 in操作符:查找元素 10.2.8 知识要点 …

香港电讯牌照申请介绍

香港对无线电发射器具的进出口实施法律管制.《电讯条例》规定进出口手提电话的人士须持有许可证或无线电商牌照。例如:手机、3C类产品、手提电脑等无线电子产品,通关时须要出示的证件之一。 一、香港电讯牌照申请需提供资料:1、有…

py逆向-NSSCTF-[NISACTF 2022]ezpython

目录 题目: 学到的点: 题目: 之前没遇到过这样的题,看了大佬的wp了解很多,记录一下 放到ida中打开,尝试分析了一下,没头绪 看了题解知道是一道py逆向的题目,需要用到这个工具pyin…

Elasticsearch+filefeat+Kibana(EFK)架构学习

一. 安装ES7集群 准备三台服,最少配置2core4G,磁盘空间最少20G,并关闭防火墙设置集群免密登录,方便scp文件等操作参考集群免密登录方法下载es7的elasticsearch-7.17.3-x86_64.rpm包安装 yum -y localinstal elasticsearch-7.17.3-x86_64.rpm修改node1配…

【SpringMVC】SpringMVC(一:第一个SpringMVC项目)

文章目录1. SSM优化的方向2.SpringMVC的优点3. SpringMVC的优化方向4.SpringMVC执行流程5.第一个SpringMVC项目5.1 创建工程5.2 添加依赖5.3 替换web.xml5.4 开发流程5.4.1完成springmvc.xml文件的配置5.4.2在web.xml文件中注册SpringMVC框架。5.4.3 编写控制器5.4.4 开发页面&…

【Spring Boot】SpringBoot参数验证以及实现原理

文章目录前言SpringBoot参数验证技巧(12个技巧)一、使用验证注解二、使用自定义验证注解三、在服务器端验证四、提供有意义的错误信息五、将 i18n 用于错误消息六、使用分组验证七、对复杂逻辑使用跨域验证八、对验证错误使用异常处理九、测试你的验证逻…

天啊!炫云的这个智能优化太给力了,渲染费竟然降了这么多!

兄弟们,你们是不是有时候一不小心把自己某一个参数设置错了,导致自己提交到云渲染平台的效果图费用突然增多,找平台理论最后发现是自己参数设置错误导致的问题,又或者对自己的参数设置把握不准的?现在这些问题你都可以…

计算机颜色学---CIE 色度图以及饱和度处理

前言 了解颜色相关理论与成像知识,对于深入了解视觉相关算法与ISP算法而言十分重要,了解颜色理论,离不开CIE色度图; CIE 1931色度图相关知识 CIE 1931 Yxy色度图。外形形似马蹄,所以也叫“马蹄图”; 在色…