【0基础学爬虫】爬虫框架之 feapder 的使用

0

前言

大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫。

学习爬虫的过程中,一般都会接触到一些框架,常见的比如 Scrapy、Pyspider 等等,不同的框架都有着各自的特点。不过就上述两款爬虫框架而言,Pyspider 久未维护,且安装到使用的过程较为坎坷;Scrapy 生态良好,功能丰富,但是对于初学者来说,学习成本相对较高。feapder 框架近年来较为火热,正好也有群友提到了:

1

因此,本期将讲解一款上手更为简单,功能同样强大的爬虫框架 —— feapder。

简介

feapder 是一款上手简单,功能强大的 Python 爬虫框架。内置 AirSpider、Spider、TaskSpider、BatchSpider 四种爬虫解决不同场景的需求:

  • AirSpider:轻量级爬虫,适合简单场景、数据量少的爬虫;
  • Spider:分布式爬虫,基于 Redis,适用于海量数据,并且支持断点续爬、自动数据入库等功能;
  • TaskSpider:任务型爬虫,支持对接任务表,如 mysql、redis 等;
  • BatchSpider:分布式批次爬虫,主要用于需要周期性采集的爬虫。

feapder 支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能。更有功能强大的爬虫管理系统 Feaplat 为其提供方便的部署及调度。

feapder 官方资料:

GitHub:https://github.com/Boris-code/feapder

官方文档:https://feapder.com/

官方公众号:feader爬虫教程

架构设计

官方框架流程图

2

模块说明

3

流程说明

根据上文框架流程图,按流程序号分析功能:

  1. spider 调度 start_request 生产任务;
  2. start_request 下发任务到 request_buffer 中;
  3. spider 调度 request_buffer 批量将任务存储到任务队列数据库中;
  4. spider 调度 collector 从任务队列中批量获取任务到内存队列;
  5. spider 调度 parser_control 从 collector 的内存队列中获取任务;
  6. parser_control 调度 request 请求数据;
  7. request 请求与下载数据;
  8. request 将下载后的数据给 response,进一步封装;
  9. 将封装好的 response 返回给 parser_control(图示为多个 parser_control,表示多线程);
  10. parser_control 调度对应的 parser,解析返回的 response(图示多组 parser 表示不同的网站解析器);
  11. parser_control 将 parser 解析到的数据 item 及新产生的 request 分发到 item_buffer 与 request_buffer;
  12. spider 调度 item_buffer 与 request_buffer 将数据批量入库。

feapder 的使用

环境

  • Python 3.6.0+
  • Works on Linux,Windows,macOS

安装

① 精简版

pip install feapder

不支持浏览器渲染、不支持基于内存去重、不支持入库 mongo。

② 浏览器渲染版

pip install "feapder[render]"

不支持基于内存去重、不支持入库 mongo。

③ 完整版

pip install "feapder[all]"

支持所有功能。

常见安装问题:

https://feapder.com/#/question/%E5%AE%89%E8%A3%85%E9%97%AE%E9%A2%98

安装成功,查看版本及可用命令:

4

feapder 支持 createretryshellzip 四种命令,feapder <command> -h 查看使用帮助。

详细资料:

https://feapder.com/#/command/cmdline

AirSpider

轻量爬虫,学习成本低,面对一些数据量较少,无需断点续爬,无需分布式采集的需求,可采用此爬虫。

① 创建爬虫项目

命令如下:

feapder create -p <project_name>

5

和 Scrapy 一样,创建新项目时,会自动生成一系列的文件和目录结构,有助于理解与使用框架:

6

相关文件简介:

  • items: 文件夹存放与数据库表映射的 item;
  • spiders: 存放爬虫脚本的文件夹;
  • CHECK_DATA.md:数据审核建议;
  • main.py: 运行入口(附代码样例);
  • setting.py: 详细的框架配置文件。

② 创建爬虫程序

命令如下:

feapder create -s <spider_name>

选择需要创建的爬虫模板,按上下键更换模版,这里选择 AirSpider 模板,回车即可创建成功:

7

代码样例如下:

# -*- coding: utf-8 -*-
"""
Created on xxx
---------
@summary:
---------
@author: kg_spider
"""import feapder
from loguru import loggerclass FeapderSpiderDemo(feapder.AirSpider):def start_requests(self):yield feapder.Request("https://www.kuaidaili.com/free")def parse(self, request, response):# 提取网站 titlelogger.info(response.xpath("//title/text()").extract_first())# 提取网站描述logger.info(f"网站地址: {response.url}")if __name__ == "__main__":FeapderSpiderDemo().start()
  • feapder.AirSpider:轻量爬虫基类;
  • start_requests:初始任务下发入口;
  • feapder.Request:基于 requests 库类似,表示一个请求,支持 requests 所有参数,同时也可携带些自定义的参数;
  • parser:数据解析函数;
  • response:请求响应的返回体,支持 xpath、re、css 等解析方式。

运行结果:

8

可以看到,默认会输出请求链接(url)、请求方式(method)以及请求头相关信息(args),不需要的可以跟进到 requests.py 文件中,将 log 部分注释掉即可:

9

③ AirSpider 的基本使用方法

如果需要解析的函数不止一个的话,可以自定义解析函数(默认失败重试 10 次)、下载中间件(cookies、headers 等)以及失败重试等等,囊括在下面的代码样例中:

# -*- coding: utf-8 -*-
"""
Created on xxx
---------
@summary:
---------
@author: kg_spider
"""import feapder
from loguru import loggerclass FeapderSpiderDemo(feapder.AirSpider):# 自定义配置项__custom_setting__ = dict(SPIDER_MAX_RETRY_TIMES=5,)def start_requests(self):yield feapder.Request("https://www.baidu.com", download_midware=self.download_midware)  # 不指定 callback, 任务会调度默认的 parser 上yield feapder.Request("https://www.kuaidaili.com/free", callback=self.spider_kdl)  # 指定了 callback, 任务由 callback 指定的函数解析def download_midware(self, request):"""下载中间件在请求之前, 对请求做一些处理, 如添加 cookie、header 等"""# 添加 headersrequest.headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"}return requestdef parse(self, request, response):# 提取网站 titlelogger.info(response.xpath("//title/text()").extract_first())# 提取网站描述logger.info(f"网站地址: {response.url}")# 异常重试if response.status_code != 200:raise Exception("未正常获取到有效页面")@staticmethoddef spider_kdl(request, response):# 提取网站 titlelogger.info(response.xpath("//title/text()").extract_first())# 提取网站描述logger.info(f"网站地址: {response.url}")if __name__ == "__main__":FeapderSpiderDemo().start()

运行结果:

10

feapder 框架内置了能够停止整个爬虫程序的方法:

import feapderclass AirTest(feapder.AirSpider):def start_requests(self):yield feapder.Request("https://www.kuaidaili.com/free")def parse(self, request, response):self.stop_spider()  # 停止爬虫,可以在任意地方调用该方法if __name__ == "__main__":AirTest().start()

④ 数据入库

feapder 框架内封装了 MysqlDBRedisDB,与 pymysql 不同的是,MysqlDB 使用了线程池,且对方法进行了封装,使用起来更方便:

  • 线程池:MysqlDB 使用了线程池来管理数据库连接。这意味着在执行数据库操作时,可以复用现有的数据库连接,而不是每次操作都新建一个连接,从而提高了性能和效率,特别是在高并发场景下。
  • 方法封装:MysqlDB 对常用的数据库操作进行了封装,使得开发者可以更简便地进行增删改查等操作,而不需要直接编写繁琐的 SQL 语句。

MysqlDB 具有断开自动重连特性,支持多线程下操作,内置连接池,最大连接数 100。同时,封装了增删改查等方法,使相关操做更为方便,可自行测试。

MysqlDB:https://feapder.com/#/source_code/MysqlDB

RedisDB 支持普通模式(单节点)、哨兵模式、集群模式:

  • 哨兵模式:RedisDB 支持 Redis 的哨兵模式(Sentinel),这是一种用于实现高可用性的 Redis 配置,可以自动监测主从实例的状态并在主实例发生故障时自动完成主从切换。
  • 集群模式:RedisDB 也支持 Redis 集群模式,这是一种用于分布式存储的 Redis 配置,可以将数据分布在多个 Redis 节点上,从而实现水平扩展和高可用性。

RedisDB:https://feapder.com/#/source_code/RedisDB

基本使用方法如下:

import feapder
from feapder.db.mysqldb import MysqlDB
from feapder.db.redisdb import RedisDBclass AirSpiderTest(feapder.AirSpider):__custom_setting__ = dict(MYSQL_IP="localhost",MYSQL_PORT = 3306,MYSQL_DB = "kgspider",MYSQL_USER_NAME = "spider123",MYSQL_USER_PASS = "123456")def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.db = MysqlDB()

⑤ 线程数配置

框架默认的线程数为 1,但在正常业务中,基本不可能只采用单线程的工作方式进行数据采集,feapder 的多线程配置有几种方式:

1、在启动函数中传递线程数:

if __name__ == "__main__":AirSpiderTest(thread_count=10).start()

2、在配置文件 setting.py 中更改对应的配置项:

SPIDER_THREAD_COUNT = 1  # 爬虫并发数,追求速度推荐 32

3、 在程序脚本中,使用类变量 __custom_setting__ 自定义配置项:

import feapderclass SpiderTest(feapder.AirSpider):__custom_setting__ = dict(SPIDER_THREAD_COUNT=10,)

在程序脚本中自定义配置项,优先级会大于在 setting.py 中设置。

feapder 框架还支持浏览器(Chrome、Edge、PhantomJS、Firefox)渲染采集(自动化)的方式,功能很全面:

11

# 浏览器渲染
WEBDRIVER = dict(pool_size=1,  # 浏览器的数量load_images=True,  # 是否加载图片user_agent=None,  # 字符串 或 无参函数,返回值为 user_agentproxy=None,  # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址headless=False,  # 是否为无头浏览器driver_type="CHROME",  # CHROME、EDGE、PHANTOMJS、FIREFOXtimeout=30,  # 请求超时时间window_size=(1024, 800),  # 窗口大小executable_path=None,  # 浏览器路径,默认为默认路径render_time=0, # 渲染时长,即打开网页等待指定时间后再获取源码custom_argument=["--ignore-certificate-errors"],  # 自定义浏览器渲染参数xhr_url_regexes=None,  # 拦截 xhr 接口,支持正则,数组类型auto_install_driver=False,  # 自动下载浏览器驱动 支持 chrome 和 firefox
)

相关文档:https://feapder.com/#/source_code/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%B2%E6%9F%93-Selenium

更详细的功能介绍,推荐阅读官方文档,就不在此赘述了:

AirSpider:https://feapder.com/#/usage/AirSpider

Request:https://feapder.com/#/source_code/Request

Response:https://feapder.com/#/source_code/Response

Spider

Spider 是一款基于 redis 的分布式爬虫,适用于海量数据采集,支持断点续爬、爬虫报警、数据自动入库等功能。

① 创建爬虫项目

与 AirSpider 相同,命令如下:

feapder create -p <project_name>

② 创建爬虫程序

命令如下:

feapder create -s <spider_name>

选择需要创建的爬虫模板,按上下键更换模版,这里选择 Spider 模板,回车即可创建成功:

12

代码样例如下,默认给了 redis 的配置方式,连接信息需按真实情况修改:

# -*- coding: utf-8 -*-
"""
Created on xxx
---------
@summary:
---------
@author: kg_spider
"""import feapderclass FeapderSpiderDemo(feapder.Spider):# 自定义数据库,若项目中有 setting.py 文件,此自定义可删除__custom_setting__ = dict(REDISDB_IP_PORTS="localhost:6379", REDISDB_USER_PASS="", REDISDB_DB=0)def start_requests(self):yield feapder.Request("https://www.kuaidaili.com/free")def parse(self, request, response):# 提取网站 titleprint(response.xpath("//title/text()").extract_first())if __name__ == "__main__":# 创建爬虫实例并启动爬虫# redis_key 用于在 Redis 中存储请求队列和其他任务相关信息FeapderSpiderDemo(redis_key="xxx:xxx").start()

配置信息:

  • REDISDB_IP_PORTS: Redis 服务器的连接地址。若为集群或哨兵模式,多个连接地址用逗号分开,若为哨兵模式,需要加个 REDISDB_SERVICE_NAME 参数;
  • REDISDB_USER_PASS: Redis 服务器的连接密码;
  • REDISDB_DB:使用 Redis 的默认数据库,通常是 0。Redis 支持多数据库索引(从 0 到 15),可以通过更改此值来选择不同的数据库。

Spider 支持断点续爬,其利用了 redis 有序集合来存储任务,有序集合有个分数,爬虫取任务时,只取小于当前时间戳分数的任务,同时将任务分数修改为当前时间戳 +10 分钟(可自行配置),(这个取任务与改分数是原子性的操作)。当任务做完时,且数据已入库后,再主动将任务删除。

Spider 任务请求失败或解析函数抛出异常时,会自动重试,默认重试次数为 100 次(可自行配置)。当任务超过最大重试次数时,默认会将失败的任务存储到 redis 的 {redis_key}😒_failed_requsets 里,以供排查。

更详细的功能介绍,建议阅读官方文档:

Spider:https://feapder.com/#/usage/Spider

Spider 进阶:https://feapder.com/#/source_code/Spider%E8%BF%9B%E9%98%B6

TaskSpider、BatchSpider

TaskSpider:一款分布式爬虫,内部封装了取种子任务的逻辑,内置支持从 redis 或者 mysql 获取任务,也可通过自定义实现从其他来源获取任务。

BatchSpider:一款分布式批次爬虫,对于需要周期性采集的数据,优先考虑使用本爬虫。会自动维护个批次信息表,详细的记录了每个批次时间、任务完成情况、批次周期等信息。会维护个批次时间信息,本批次未完成下一批次不会开始。

  • 批次的含义:例如 2024.07.05 开始采集,2024.07.08 才采集完成,此间数据的批次都为 2024.07.05。方便业务做时序数据展示。

四种爬虫模板:AirSpider -> Spider -> TaskSpider -> BatchSpider,后一种都是基于前一种的优化,具体的使用说明,官方文档都写的很清楚了:

TaskSpider:https://feapder.com/#/usage/TaskSpider

BatchSpider:https://feapder.com/#/usage/BatchSpider

数据监控

feapder 还有配套的爬虫管理系统 ------ feaplat(暂时不支持 Apple 芯片),可以通过 docker 安装部署:

https://feapder.com/#/feapder_platform/feaplat

feapder 内置监控打点(feapder 版本大于等于 1.6.6),部署到 feaplat 爬虫管理系统即可实现对请求和数据监控:

13

监控打点:https://feapder.com/#/source_code/%E7%9B%91%E6%8E%A7%E6%89%93%E7%82%B9

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

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

相关文章

Python遥感开发之时序数据的线性插值

Python遥感开发之时序数据的线性插值 0 历史博客1 实现思路2 代码实现3 效果展示 前言&#xff1a;在遇到空间数据的时候&#xff0c;尤其是哨兵、Landsat或者MODIS数据会出现局部值的空缺&#xff0c;为了解决这些值的空缺&#xff0c;通常采用插值的方法&#xff0c;本博客使…

Python编程学习笔记(1)--- 变量和简单数据类型

1、变量 在学习编程语言之前&#xff0c;所接触的第一个程序&#xff0c;绝大多数都是&#xff1a; print("Hello world!") 接下来尝试使用一个变量。在代码中的开头添加一行代码&#xff0c;并对第二行代码进行修改&#xff0c;如下&#xff1a; message "…

中国星坤X1224系列线对板连接器:小巧稳定,助力物联网终端高效运行

在物联网、电器和消防等领域&#xff0c;终端设备的安全稳定运行至关重要。为了满足这些领域对连接器高可靠性、小巧轻便和耐高温的需求&#xff0c;X1224系列线对板连接器应运而生。这款连接器以其独特的设计和卓越的性能&#xff0c;成为了终端设备中不可或缺的一部分。 一、…

Ubantu22.04 通过FlatPak安装微信

Ubuntu22.04 下使用Flatpak稳定安装微信&#xff01; 国际惯例&#xff0c;废话不多说&#xff0c;先上效果图。为啥使用Flatpak,因为Wechat官方只在FlatPak发布了最新的版本。之前使用了Wine以及Dock安装Wechat,效果都不是很理想&#xff0c;bug很多。所以使用了FlatPak。 Fl…

免费的鼠标连点器电脑版教程!官方正版!专业鼠标连点器用户分享教程!2024最新

电脑技术的不断发展&#xff0c;许多用户在日常工作和娱乐中&#xff0c;需要用到各种辅助工具来提升效率或简化操作&#xff0c;而电脑办公中&#xff0c;鼠标连点器作为一种能够模拟鼠标点击的软件&#xff0c;受到了广大用户的青睐。本文将为大家介绍一款官方正版的免费鼠标…

一.2.(3)放大电路的图解分析方法和微变等效电路分析方法;

放大电路的主要分析方法:图解法、微变等效电路法 这里以共射放大电路为例 (1) 图解法: 1.静态分析 首先确定静态工作点Q,然后根据电路的特点,做出直流负载线,进而画出交流负载线,最后,画出各极电流电压的波形。求出最大不失真输出电压。 估算IBQ&#xff0c;然后根据数据手册里…

09.QT控件:按钮类控件

1. QPushButton 在QT中使⽤ QPushButton 表⽰⼀个按钮。QPushButton 继承⾃ QAbstractButton&#xff0c;这个类是⼀个抽象类&#xff0c;是其他按钮的⽗类。 &#xff08;1&#xff09;QAbstractButton 中&#xff0c;和 QPushButton 相关性较⼤的属性&#xff1a; &#xf…

STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. Unix时间戳1.1 Unix时间戳简介1.2 UTC/GMT1.3 时间戳转换 2. BKP备份寄存器2.1 BKP简介2.2 BKP基本结构2.3 BKP库函数 3. RTC实时时钟3.1 RTC简介3.2 RTC框图3.3 RTC基本结构3.4 硬件电路3.5 RTC操作注意事项3.6 R…

vue事件处理v-on或@

事件处理v-on或 我们可以使用v-on指令&#xff08;简写&#xff09;来监听DOM事件&#xff0c;并在事件触发时执行对应的Javascript。用法&#xff1a;v-on:click"methodName"或click"hander" 事件处理器的值可以是&#xff1a; 内敛事件处理器&#xff1…

Golang | Leetcode Golang题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; func _rob(nums []int) int {first, second : nums[0], max(nums[0], nums[1])for _, v : range nums[2:] {first, second second, max(firstv, second)}return second }func rob(nums []int) int {n : len(nums)if n 1 {return nums[0]}…

SSRF靶场通关合集

目录 前言 SSRF总结 1.pikachu 1.1SSRF(curl) 1.1.1http协议 1.1.2 file协议查看本地文件 1.1.3 dict协议扫描内网主机开放端口 1.2 SSRF&#xff08;file_get_content&#xff09; 1.2.1 file读取本地文件 1.2.2 php://filter/读php源代码 2.DoraBox靶场 前言 最近…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…

Linux服务器使用总结-不定时更新

# 查看升级日志 cat /var/log/dpkg.log |grep nvidia|grep libnvidia-common

如何在多个服务器上安装WordPress分布式部署

许多网络主机现在保证其服务的正常运行时间为 99.9%&#xff0c;但这仍然每年最多有 8.7 小时的停机时间。 许多公司不能够承担这种风险。例如。在超级碗比赛中失败的体育新闻网站可能会失去忠实的追随者。 我们通过设置维护高可用性 WordPress分布式部署配置来帮助 WordPres…

unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化

基本结构 Shader "MyShaderName" {Properties {// 属性}SubShader {// 针对显卡A的SubShaderPass {// 设置渲染状态和标签Tags { "LightMode""ForwardBase" }// 开始Cg代码片段CGPROGRAM// 该代码片段的编译指令&#xff0c;例如&#xff1a;#p…

【笔记】在window上连接虚拟机中的redis

愚昧啊 困扰了我近两天的问题居然是因为是java代码写错地方了 在虚拟机中进入redis.conf文件 vim redis.conf /bind --斜杠搜索关键词 将值设置为 bind 0.0.0.0 保存 退出:wq 回到java中 添加redis依赖 刷新maven 就是在这一步出问题……………………………………自己在蓝…

LeetCode 189.轮转数组 三段逆置 C写法

LeetCode 189.轮转数组 C写法 三段逆置 思路: 三段逆置方法:先逆置前n-k个 再逆置后k个 最后整体逆置 由示例1得&#xff0c;需要先逆置1,2,3,4 再逆置5,6,7&#xff0c;最后前n-k个与后k个逆置 代码 void reverse(int*num, int left, int right) //逆置函数 { while(left …

react-类组件1

类组件&#xff1a; import { Component } from "react";class App extends Component {constructor() {super();this.state {message: "xxxxx",};}render() {return (<div><div>{this.state.message}</div></div>);} }export d…

算法的空间复杂度(C语言)

1.空间复杂度的定义 算法在临时占用储存空间大小的量度&#xff08;就是完成这个算法所额外开辟的空间&#xff09;&#xff0c;空间复杂度也使用大O渐进表示法来表示 注&#xff1a; 函数在运行时所需要的栈空间(储存参数&#xff0c;局部变量&#xff0c;一些寄存器信息等)…

Python | Leetcode Python题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsDuplicate(self, nums):if len(set(nums)) ! len(nums):return Trueelse:return False