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

news/2024/10/5 8:42:05/文章来源:https://www.cnblogs.com/ikdl/p/18286951

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/安装问题

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

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/浏览器渲染-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进阶

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/监控打点

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

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

相关文章

PTA题目集7-8的总结

PTA题目集7-8的总结 1.前言: 2.设计与分析: 3.踩坑心得: 4.改进意见: 5.总结 1.前言:PTA题目集7新增了互斥开关,窗帘,多并联电路和多串联电路。由于之前的输入信息中设备的引脚没有作用,所以我的正则表达式只用来提取设备的名字。而互斥开关有三个引脚,不同引脚的电压…

pycharm 动态绘图

_tkinter.TclError: Cant find a usable init.tcl in the following directories:解决办法: 1 打开报错地址所在文件 D:/Program Files/METACOMP/mlib/tcltk8/lib/tcl8.4/init.tcl: version conflict for package "Tcl": have 8.6.9, need exactly 8.4 2 修改init.t…

从零开始教你写一个MLIR Pass

笔者在去年写了一篇LLVM Pass的教程,现在从事MLIR的开发近1年了,写点教程回馈下社区。 MLIR(Multi-Level Intermediate Representation,多层中间表示)是LLVM之父(博士期间开发的LLVM)的Chris Lattner带领团队开发的编译器基础设施,其增强了 LLVM IR表达能力,而且其是关注P…

idm下载

获得百度网盘直链下载链接调用idm谷歌插件获得城盘直链下载链接调用idm谷歌插件 https://ctfile.qinlili.bid/当你的才华配不上你的野心,努力的时候到了!

Arthas进阶-笔记

《Arthas进阶》 学习目标类和类加载器相关的命令 monitor/watch/trace/stack等核心命令的使用 火焰图的生成 Arthas实战案例dump 作用 将已加载类的字节码文件保存到特定目录:logs/arthas/classdump/ 参数数名称 参数说明class-pattern 类名表达式匹配[c:] 类所属 ClassLoader…

域名、备案和HTTPS

有了域名后,可以方便其他人记住并访问12.域名、备案和HTTPS 有了域名后,可以方便其他人记住并访问,历史上不乏大企业花大价钱购买域名的:京东域名换成 JD.com,并且说是为了防止百度吸引流量,为什么? 唯品会买下域名 VIP.COM 或花费千万‍ 域名提供商 如果想要域名,得去…

陪玩app源码,加密算法中密钥生成和读取一览

陪玩app源码,加密算法中密钥生成和读取一览密钥生成与读取密码学随机数密码学随机数算法在安全场景中使用广泛,如:生成对称密钥、盐、iv等,因此相比普通的随机数算法(如线性同余),它需要更高强度的不可预测性,在Java中,使用SecureRandom来生成更安全的随机数,如下:pub…

陪玩小程序源码,不容错过的加密算法整理清单

陪玩小程序源码,不容错过的加密算法整理清单在开发陪玩小程序源码时,可采用的加密算法类型包含:对称加密对称加密算法,使用Cipher类即可,以广泛使用的AES为例,如下:public byte[] encrypt(byte[] data, Key key) {try {Cipher cipher = Cipher.getInstance("AES/CB…

【QT】工程库引用

创建多工程项目创建子项目UI窗体项目创建库工程项目引用库工程添加日志输出类5.1 需要添加特殊配置,否则编译会报错5.2 正确添加配置5.3 日志正常输出5.4 如果缺少5.1步骤,则报如下错误5.5 如果添加了5.1步骤,还是报The process was ended forcefully 找到项目文件,把debug…

陪玩系统源码,为守护系统安全增添更多助力

陪玩系统源码,为守护系统安全增添更多助力在开发陪玩系统源码时,可以通过加密、解密算法来提升系统的安全性,比较常见的加密、解密算法类型有:1、对称加密:速度快,可逆,常见DES,AES等2、非对称加密:速度慢,可逆,常见RSA等3、签名算法:唯一,不可逆,常见MD5,SHA,…

pycharm创建临时文件scatch file

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 有时您可能需要创建临时注释或在项目上下文之外起草一些代码。为此,您可以使用临时文件和临时缓冲…

P5441

P5441 神仙题目。 tips:后面把 \(4\) 个点说成一个组。我们先考虑一个组怎么连才不是强联通的。一个点 A 向另外三个点 BCD 连一条有向边。在不满足第一种的情况下,BCD 向另一个点 A 连一条有向边。AB 之间连有向边,CD 之间连无向边,然后 AC 和 AD 连一条有向边,BC 和 BD …