当前位置: 首页 > news >正文

Python学习之路-爬虫进阶:爬虫框架

Python学习之路-爬虫进阶:爬虫框架

了解框架

什么是框架

框架是为了为解决一类问题而开发的程序,框架两个字可以分开理解,框:表示指定解决问题的边界,明确要解决的问题;架:表达的是能够提供一定的支撑性和可扩展性;从而实现解决这类问题达到快速开发的目的。

为什么要实现一个框架

现在网络上现成的开源第三方框架非常多,为什么还需要自己实现一个框架?

  1. 现成开源第三方框架的局限性:

    现成开源第三方框架是为了尽可能满足大部分的需求,不可能做到面面俱到,以及第三方框架的调试相对复杂

  2. 解决特定的工作需求:

    工作中会有很多特殊的需求,会经常使用某种套路去实现这些需求,那么为了提高效率可以专门把这种套路封装成一个框架

    比如专门针对电商网站、新闻资讯写一个爬虫框架;再比如针对断点续爬、增量抓取等需求写一个框架

  3. 提高自己的技术能力:

    不一定需要亲自造轮子,但是应该知道如何造轮子

如何完成一个框架

现在我们明确了框架是什么以及为什么要实现一个框架,那么到底应该如何实现一个框架呢,我们的idea从哪里来呢?

  1. 经验丰富的程序员:

    直接根据以往经验和业务的需求进行框架原型设计,并用语言去实现

  2. 经验一般的程序员:

    通常应该是先学习别人的框架如何实现的,先学习别人优秀的比较好的实现思路和方案

那么同样的,对于我们:
我们可以结合目前学习过的爬虫知识和爬虫框架,了解他们的设计思路,在这个基础上进行模仿和改进,从而实现一个框架

框架设计思路分析

学习Scrapy,提取它的设计思想

爬虫的流程

爬虫框架解决的问题是爬虫问题,先来看看爬虫的基本流程:

  1. 构建请求信息(url、method、headers、params、data)
  2. 发起HTTP/HTTPS请求,获取HTTP/HTTPS响应
  3. 解析响应,分析响应数据的数据结构或者页面结构
    • 提取数据
    • 提取请求的地址
  4. 对数据进行存储/对新的请求地址重复前面的步骤

无论什么爬虫框架,其核心都离不开上面几个步骤

scrapy爬虫流程分析
  1. 三个内置对象:

     请求对象(Request)响应对象(Response)数据对象(Item)
    
  2. 五个核心组件:

     爬虫组件构建请求信息(初始的),也就是生成请求对象(Request)解析响应对象,返回数据对象(Item)或者新的请求对象(Request)调度器组件缓存请求对象(Request),并为下载器提供请求对象,实现请求的调度对请求对象进行去重判断下载器组件根据请求对象(Request),发起HTTP、HTTPS网络请求,拿到HTTP、HTTPS响应,构建响应对象(Response)并返回管道组件负责处理数据对象(Item)引擎组件负责驱动各大组件,通过调用各自对外提供的API接口,实现它们之间的交互和协作提供整个框架的启动入口
    
  3. 两个中间件:

     爬虫中间件对请求对象和数据对象进行预处理下载器中间件对请求对象和响应对象进行预处理
    

那么对应的,我们也可以在自己的框架是实现这样几个模块和对象

相关文章:

  • 11.JavaScript 中如何进行隐式类型转换?
  • 2024年华为OD机试真题-计算面积-Python-OD统一考试(C卷)
  • C语言静态库深入剖析
  • Apache Kafka: 强大消息队列系统的介绍与使用
  • OpenGL-ES 学习(1)---- AlphaBlend
  • nodejs学习计划--(十)会话控制及https补充
  • mysql全国省市县三级联动创表sql(一)
  • STM32之定时器
  • BTC破5W+QAQ
  • Windows 平台下NDK/CMAKE编译自己程序命令行
  • HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置
  • 基于微信小程序的校园失物招领小程序
  • ajax函数库axios基本使用
  • Go语言从基础到高级-目录
  • 常用调试方法
  • CentOS 7 防火墙操作
  • css选择器
  • flask接收请求并推入栈
  • javascript面向对象之创建对象
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Mysql优化
  • Spring-boot 启动时碰到的错误
  • Web Storage相关
  • 给github项目添加CI badge
  • 关于Flux,Vuex,Redux的思考
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 码农张的Bug人生 - 初来乍到
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前嗅ForeSpider教程:创建模板
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 第二十章:异步和文件I/O.(二十三)
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​MySQL主从复制一致性检测
  • # include “ “ 和 # include < >两者的区别
  • $.ajax中的eval及dataType
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (九十四)函数和二维数组
  • (全注解开发)学习Spring-MVC的第三天
  • (算法二)滑动窗口
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)linux下的时间函数使用
  • *2 echo、printf、mkdir命令的应用
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net MVC4 上传大文件,并保存表单
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET中 MVC 工厂模式浅析
  • .NET中GET与SET的用法
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • []error LNK2001: unresolved external symbol _m