爬虫框架:Feapder使用心得

文章目录


前言

笔者也是习惯用scrapy,但是在实际工作中发现有些网站请求会有scrapy检测,这样我们需要的数据通scrapy自带的请求库是请求不了的,反而requests请求却可以,但如果不用框架编写整个请求的流程还有后续性能,采集的效率问题都要自己来写所以很麻烦,所以这里笔者也是第一次使用新的爬虫框架,目前也很火,那么我就来试试吧!


一、feapder简介?

官方文档链接:https://feapder.com/#/README[点击直达](https://feapder.com/#/README)

  1. feapder是一款上手简单,功能强大的Python爬虫框架,内置AirSpider、Spider、TaskSpider、BatchSpider四种爬虫解决不同场景的需求。
  2. 支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能。
  3. 更有功能强大的爬虫管理系统feaplat为其提供方便的部署及调度

二、使用步骤

1.环境安装

python 复制代码
pip install feapder

2.创建爬虫项目

这里比较推荐命令行生成项目

c 复制代码
feapder create -p first-project

更多功能

python 复制代码
optional arguments:
  -h, --help        show this help message and exit
  -p , --project    创建项目 如 feapder create -p <project_name>
  -s , --spider     创建爬虫 如 feapder create -s <spider_name>
  -i , --item       创建item 如 feapder create -i <table_name> 支持模糊匹配 如 feapder create -i %table_name%
  -t , --table      根据json创建表 如 feapder create -t <table_name>
  -init             创建__init__.py 如 feapder create -init
  -j, --json        创建json
  -sj, --sort_json  创建有序json
  -c, --cookies     创建cookie
  --params          解析地址中的参数
  --setting         创建全局配置文件feapder create --setting
  --host            mysql 连接地址
  --port            mysql 端口
  --username        mysql 用户名
  --password        mysql 密码
  --db              mysql 数据库名

生成爬虫文件

python 复制代码
feapder create -s <spider_name>

值得注意的是如果你想创建 item table的时候,你的爬虫项目必须配置好数据库,并且表名要跟你创建的名称一致

3.配置

(1)数据库

在setting文件中

python 复制代码
# MYSQL
# MYSQL_IP = "localhost"
# MYSQL_PORT = 3306
# MYSQL_DB = "test"
# MYSQL_USER_NAME = "root"
# MYSQL_USER_PASS = "1234"
# MONGODB 两种方式都可以
# MONGO_IP = "127.0.0.1"
# MONGO_PORT = 27017
# MONGO_DB = "cytiva"
# MONGO_USER_NAME = "spider"
# MONGO_USER_PASS = "spider"
# MONGO_URL = "mongodb://admin:admin@127.0.0.1:27017/cytiva"
# 数据入库的pipeline,可自定义,默认MysqlPipeline 数字越小最先执行 两种方式都是可以的
ITEM_PIPELINES = [
    # "feapder.pipelines.mysql_pipeline.MysqlPipeline",
    "feapder.pipelines.mongo_pipeline.MongoPipeline",
    # "feapder.pipelines.console_pipeline.ConsolePipeline",
]
# ITEM_PIPELINES = {
#     # "my_pipelines.Pipeline":200,
#     "feapder.pipelines.mongo_pipeline.MongoPipeline": 300
# }

(2.log日志

python 复制代码
LOG_PATH = "E:/myFeapder/logs/log_{}_{}_{}_{}.log".format(
            datetime.datetime.today().year,
            datetime.datetime.today().month,
            datetime.datetime.today().day,
            datetime.datetime.today().hour)
# log存储路径
LOG_LEVEL = "DEBUG"
LOG_COLOR = False  # 是否带有颜色
LOG_IS_WRITE_TO_CONSOLE = False  # 是否打印到控制台
LOG_IS_WRITE_TO_FILE = True  # 是否写文件
LOG_MODE = "w"  # 写文件的模式
OTHERS_LOG_LEVAL = "ERROR"  # 第三方库的log等级
LOG_MAX_BYTES = 1024 * 1024 * 1024  # 每个日志文件的最大字节数

(3)ip代理

python 复制代码
# 在爬虫类添加方法 使得全部请求都生效
def download_midware(self, request):
     request.proxies = {"https": "https://ip:port", "http": "http://ip:port"}
     return request

4.编写爬虫

(1)参数传递

笔者之前用scrapy,meta 喜欢用深拷贝比如

python 复制代码
meta = copy.deepcopy(response.meta)

但是在feapder上,我使用时列表数据遍历数据会被覆盖,这里还是推荐官网的操作来

python 复制代码
def start_requests(self):
    yield feapder.Request("https://www.baidu.com",  xxx="我是携带的数据")

def parse(self, request, response):
    xxx = request.xxx
    print(xxx)

(2)Item

python 复制代码
from feapder import Item


class SpiderDataItem(Item):

    __unique_key__ = ["title", "url"] # 指定去重的key为 title、url,最后的指纹为title与url值联合计算的md5

    def __init__(self, *args, **kwargs):
        # self.id = None
        self.title = None
        self.url = None
        self.crawl_time = None
 
 # 爬虫文件赋值
 item = SpiderDataItem()
 item.title = title
 yield item

基本都是跟scrapy类似的,就是赋值这一块需要注意下

(3)文件下载

feapder好像没有下载组件,需要我们自己写下载请求

python 复制代码
file_meta = {
'file_path':file_path,
'file_name':file_name,
'info':info
}
yield feapder.Request(file_url, method="GET", callback=self.download_file, file_meta=file_meta,timeout=60, headers=file_headers)

def download_file(self, request, response):
    """下载文件"""
    if response.status_code == 200:
		    file_meta = request.file_meta
		    file_path = file_meta['file_path']
		    file_name= file_meta['file_name']
        with open('{}/{}'.format(file_path, file_name), 'wb') as f:
            f.write(response.content)
    else:
    # 报错内部会重新请求  默认重试10次
        log.error("info: {} 文件下载失败".format(file_meta.get('info')) )
        raise Exception("info: {} 文件下载失败".format(file_meta.get('info')) )

总结

这里只是简单使用了feapder框架,他的其他强大功能笔者暂时的业务还没设计到,还有它配合crawlab爬虫管理平台更是一绝,有兴趣的小伙伴可以自己试试!

相关推荐
皇族崛起2 小时前
【3D标注】- Unreal Engine 5.7 与 Python 交互基础
python·3d·ue5
你想知道什么?2 小时前
Python基础篇(上) 学习笔记
笔记·python·学习
Swizard3 小时前
速度与激情:Android Python + CameraX 零拷贝实时推理指南
android·python·ai·移动开发
一直跑3 小时前
Liunx服务器centos7离线升级内核(Liunx服务器centos7.9离线/升级系统内核)
python
leocoder3 小时前
大模型基础概念入门 + 代码实战(实现一个多轮会话机器人)
前端·人工智能·python
Buxxxxxx3 小时前
DAY 37 深入理解SHAP图
python
ada7_3 小时前
LeetCode(python)108.将有序数组转换为二叉搜索树
数据结构·python·算法·leetcode
请一直在路上3 小时前
python文件打包成exe(虚拟环境打包,减少体积)
开发语言·python
浩瀚地学3 小时前
【Arcpy】入门学习笔记(五)-矢量数据
经验分享·笔记·python·arcgis·arcpy