文章目录
前言
笔者也是习惯用scrapy,但是在实际工作中发现有些网站请求会有scrapy检测,这样我们需要的数据通scrapy自带的请求库是请求不了的,反而requests请求却可以,但如果不用框架编写整个请求的流程还有后续性能,采集的效率问题都要自己来写所以很麻烦,所以这里笔者也是第一次使用新的爬虫框架,目前也很火,那么我就来试试吧!
一、feapder简介?
官方文档链接:https://feapder.com/#/README[点击直达](https://feapder.com/#/README)
- feapder是一款上手简单,功能强大的Python爬虫框架,内置AirSpider、Spider、TaskSpider、BatchSpider四种爬虫解决不同场景的需求。
- 支持断点续爬、监控报警、浏览器渲染、海量数据去重等功能。
- 更有功能强大的爬虫管理系统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爬虫管理平台更是一绝,有兴趣的小伙伴可以自己试试!