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

news2024/11/28 12:41:22

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 logger


class FeapderSpiderDemo(feapder.AirSpider):
    def start_requests(self):
        yield feapder.Request("https://www.kuaidaili.com/free")

    def parse(self, request, response):
        # 提取网站 title
        logger.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 logger


class 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 等
        """
        # 添加 headers
        request.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 request

    def parse(self, request, response):
        # 提取网站 title
        logger.info(response.xpath("//title/text()").extract_first())
        # 提取网站描述
        logger.info(f"网站地址: {response.url}")
        # 异常重试
        if response.status_code != 200:
            raise Exception("未正常获取到有效页面")

    @staticmethod
    def spider_kdl(request, response):
        # 提取网站 title
        logger.info(response.xpath("//title/text()").extract_first())
        # 提取网站描述
        logger.info(f"网站地址: {response.url}")


if __name__ == "__main__":
    FeapderSpiderDemo().start()

运行结果:

10

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

import feapder


class 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 RedisDB

class 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 feapder


class 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_agent
    proxy=None,  # xxx.xxx.xxx.xxx:xxxx 或 无参函数,返回值为代理地址
    headless=False,  # 是否为无头浏览器
    driver_type="CHROME",  # CHROME、EDGE、PHANTOMJS、FIREFOX
    timeout=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 feapder


class 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):
        # 提取网站 title
        print(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.coloradmin.cn/o/1902980.html

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

相关文章

SIFT 3D 点云关键点

检测原理 该算法在尺度空间中寻找极值点并提取出其位置、 尺度、 旋转不变量信息&#xff0c;提取的特征对视角变化、 仿射变换、 噪声具有一定的鲁棒性&#xff0c;对尺度缩放、 旋转具有较好的不变性。 SIFT关键点检测主要包括生成尺度空间构建、 空间极值点检测、 稳定关键…

Nacos 2.x 系列【18】多网卡 IP 配置

文章目录 1. 前言2. 服务端3. 客户端 1. 前言 个人电脑或者服务器&#xff0c;存在多网卡环境时&#xff0c;Nacos 可能会存在IP不正确问题。 2. 服务端 Nacos 服务在启动的时候需要选择运行时使用的IP或者网卡&#xff0c;在启动时&#xff0c;可以看到打印了IP&#xff1a…

第二周:李宏毅机器学习笔记

第二周学习周报 摘要Abstract一、深度学习1.Backpropagation&#xff08;反向传播&#xff09;1.1 链式法则1.2 Forward pass&#xff08;前向传播&#xff09;1.3 Backward pass&#xff08;向后传播&#xff09;1.4 总结 2. Regression&#xff08;神奇宝贝案例&#xff09;2…

CountDownLatch内部原理解析

文章目录 1、CountDownLatch介绍1.1、功能介绍1.2、demo1.3、问题 2、前置知识2.1、AQS整体结构2.1.1、整体结构2.1.2、state属性2.1.3、head和tail属性 3、CountDownLatchAPI源码解析3.1、countDown方法3.1.1、Sync类3.1.2、releaseShared方法3.1.3、tryReleaseShared方法 3.2…

ICMP协议详解及尝试用ping和tracert捕抓ICMP报文

一、ICMP协议 1.1、定义 ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#xff09;是一个支持IP层数据完整性的协议&#xff0c;主要用于在IP主机、路由器之间传递控制消息。这些控制消息用于报告IP数据报在传输过程中的错误&#xff0c…

ChatGPT4深度解析:探索智能对话新境界

大模型chatgpt4分析功能初探 目录 1、探测目的 2、目标变量分析 3、特征缺失率处理 4、特征描述性分析 5、异常值分析 6、相关性分析 7、高阶特征挖掘 1、探测目的 1、分析chat4的数据分析能力&#xff0c;提高部门人效 2、给数据挖掘提供思路 3、原始数据&#xf…

保研复习 | 数据结构

目录 CH1 绪论☆ 数据项、数据元素、数据结构☆ 逻辑结构和存储结构的区别☆ 顺序存储结构和链式存储结构的比较☆ 算法的重要特性☆ 算法的复杂度 CH2 线性表☆ 单链表 CH3 栈、队列和数组☆ 栈和堆是什么&#xff1f;☆ 栈在括号匹配中的应用☆ 栈在表达式求值中的应用☆ …

14-41 剑和诗人15 - RLAIF 大模型语言强化培训

​​​​​​ 介绍 大型语言模型 (LLM) 在自然语言理解和生成方面表现出了巨大的能力。然而&#xff0c;这些模型仍然存在严重的缺陷&#xff0c;例如输出不可靠、推理能力有限以及缺乏一致的个性或价值观一致性。 为了解决这些限制&#xff0c;研究人员采用了一种名为“人工…

3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置

渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果&#xff0c;仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时&#xff0c;兼顾渲染速度和时间还需要进行一些调节设置&#xff0c;如何让渲染效果更加逼真&#xff1f; 一、全局照明与…

昇思25天学习打卡营第13天|K近邻算法实现红酒聚类

K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;是机器学习最基础的算法之一。它正是基于以上思想&#xff1a;要确定一个样本的类别&#xff0c;可以计算它与所有训练样本的距离&#xff0c;然后找出和该样本最接…

数据结构基础--------【二叉树基础】

二叉树基础 二叉树是一种常见的数据结构&#xff0c;由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;左子节点和右子节点。二叉树可以用来表示许多实际问题&#xff0c;如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念&#xff1a; 二叉树的深度&a…

win10使用小技巧二

1. 解决电脑更新后无法连接打印机问题 步骤&#xff1a;右击电脑 → 选择“管理” → 打开“服务和应用程序” → 双击“服务” → 找到“Print Spooler” → 双击打开 → 在“常规”中将“启动类型”改为“自动” → 点击“应用” → 点击“确定” → 重启电脑。 2. 提升电脑…

rocketmq-console可视化界面功能说明

rocketmq-console可视化界面功能说明 登录界面OPS(运维)Dashboard(驾驶舱)Cluster(集群)Topic(主题)Consumer(消费者)Producer(生产者)Message(消息)MessageTrace(消息轨迹) rocketmq-console是rocketmq的一款可视化工具&#xff0c;提供了mq的使用详情等功能。 本章针对于rock…

css使用伪元素after或者before的时候想要给after设置z-index无效

css使用伪元素after或者before的时候想要给after或者before设置一个层级关系&#xff0c;使该伪类写入的样式在box的下面&#xff0c;发现给box设置z-index无效&#xff0c; 需要找到父级元素&#xff0c;在父级元素上设置z-index值并且将伪类设置z-index:-1

在数字化时代,自助BI是数据价值最大化的必经之路

引言&#xff1a;在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;仅仅拥有海量数据并不足以带来竞争优势&#xff0c;关键在于如何有效地分析并利用这些数据以指导决策、优化运营、提升客户体验&#xff0c;并最终实现业务的持续增长。在一章里笔者…

实验1 主成分分析

目 录 二、实验环境... 1 三、实验内容... 1 3.1 导入数据... 2 3.2 求相关系数矩阵.. 3 3.3 数据规范化处理.. 3 3.4 主成分分析... 4 四 实验心得... 5 一、实验目的 &#xff08;1&#xff09;理解主成分分析的思想&#xff1b; &#xff08;2&#xff09;掌握主成分分析方…

昇思25天学习打卡营第19天 | CycleGAN图像风格迁移互换

内容介绍&#xff1a; CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Domain Adaptation)&#xff0c;可以通俗地理解…

常用SQL语句(基础篇)

前言 查询的sql的结构是 select...from...where...group by...having...order by...limit... 写查询sql的时候需要按照如下顺序写 from&#xff0c;where&#xff08;and&#xff0c;or&#xff0c;&#xff01;&#xff09;&#xff0c;group by&#xff0c;select&#xf…

文件系统技术架构分析

一文读懂&#xff1a;什么是文件系统 &#xff0c;有哪几类&#xff1f; ▉ 什么是文件系统&#xff1f; 技术大拿眉头皱了皱&#xff0c;忍住快要爆发的情绪。解释到&#xff1a; 数据以二进制形式存储于介质&#xff0c;但高低电平含义难解。文件系统揭秘这些二进制背后的意…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…