spiderman
基于scrapy-redis的通用分布式爬虫框架
目录
demo采集效果
爬虫元数据
cluster模式
standalone模式
kafka实时采集监控
功能
自动建表
自动生成爬虫代码,只需编写少量代码即可完成分布式爬虫
自动存储元数据,分析统计和补爬都很方便
适合多站点开发,每个爬虫独立定制,互不影响
调用方便,可以根据传参自定义采集的页数以及启用的爬虫数量
扩展简易,可以根据需要选择采集模式,单机 standalone (默认) 或者 分布式cluster
采集数据落地方便,支持多种数据库,只需在 spider 中启用相关的管道
关系型
mysql
sqlserver
oracle
postgresql
sqlite3
非关系型
hbase
mongodb
elasticsearch
hdfs
hive
datafile, 比如 csv
反爬处理简易,已封装各种反爬中间件
随机 UserAgent
定制请求头 Headers
定制 Cookies
定制代理 ip
在 scrapy 中使用 requests
Payload 请求
使用 Splash 渲染 js
原理说明
消息队列使用 redis,采集策略使用先进先出
每个爬虫都有一个 job 文件,使用 job 来生成初始请求类 ScheduledRequest,并将其推送到 redis; 初始请求全部推到 redis 后,运行 spider 解析生成数据 并迭代新的请求到redis, 直到 redis 中的全部请求被消耗完
# scrapy_redis请求类
class ScheduledRequest:
def __init__(self, **kwargs):
self.url = kwargs.get('url') # 请求url
self.method = kwargs.get('method', 'GET') # 请求方式 默认get
self.callback = kwargs.get('callback') # 回调函数,指定spider的解析函数
self.body = kwargs.get('body') # body, method为post时, 作为 post表单
self.meta = kwargs.get('meta') # meta, 携带反爬信息比如cookies,headers; 以及一些元数据,比如 pagenum
item 类定义表名、字段名、排序号(自定义字段顺序)、注释说明(便于管理元数据)、字段类型(仅关系型数据库管道有效)
class zhifang_list_Item(scrapy.Item): # 列表页
# define the tablename
tablename = 'zhifang_list'
# define the fields for your item here like:
# 关系型数据库,可以自定义字段的类型、长度,默认 VARCHAR(length=255)
# colname = scrapy.Field({'idx': 1, 'comment': '名称', type: VARCHAR(255)})
tit = scrapy.Field({'idx': 1, 'comment': '房屋标题'})
txt = scrapy.Field({'idx': 2, 'comment': '房屋描述'})
tit2 = scrapy.Field({'idx': 3, 'comment': '房屋楼层'})
price = scrapy.Field({'idx': 4, 'comment': '房屋价格'})
agent = scrapy.Field({'idx': 5, 'comment': '房屋中介'})
# default column
detail_full_url = scrapy.Field({'idx': 100, 'comment': '详情链接'}) # 通用字段
pkey = scrapy.Field({'idx': 101, 'comment': 'md5(detail_full_url)'}) # 通用字段
pagenum = scrapy.Field({'idx': 102, 'comment': '页码'}) # 通用字段
下载安装
【不使用虚拟环境的话,可以跳过步骤23】virtualenv -p /usr/bin/python3 --no-site-packages venv
【不使用虚拟环境的话,可以跳过步骤23】source venv/bin/activate
修改配置 vi SP/settings.py
运行demo示例 python SP_JOBS/zhifang_job.py
如何开发一个新爬虫
运行 easy_scrapy.py 会根据模板自动生成以下代码文件,并自动在 pycharm 打开 spidername_job.py 文件;
类别
路径
说明
job
SP_JOBS/spidername_job.py
编写初始请求
spider
SP/spiders/spidername.py
编写解析规则,产生新的请求
items
SP/items/spidername_items.py
定义表名字段
直接执行 python SP_JOBS/spidername_job.py
或者动态传参(参数说明 -p 采集页数, -n 启用爬虫数量) python SP_JOBS/spidername_job.py -p 10 -n 1
如何进行补爬
运行 easy_scrapy.py 会根据模板自动生成以下代码文件,并自动在 pycharm 打开 spidername_job_patch.py 文件;
类别
路径
说明
job
SP_JOBS/spidername_job_patch.py
编写补爬请求
直接执行 python SP_JOBS/spidername_job_patch.py
如何扩展分布式爬虫
采集模式有两种(在 settings 控制): 单机 standalone(默认) 和 分布式 cluster
如果想切换成分布式爬虫,需要在 spiderman/SP/settings.py 中启用以下配置
注意:前提是 所有SLAVE机器的爬虫代码一致、python环境一致,都可以运行爬虫demo
# 采集模式 standalone 单机 (默认); cluster 分布式 需要配置下方的 slaves
CRAWL_MODEL = 'cluster'
配置名称
意义
示例
SLAVES
【二选一】爬虫机器配置列表
[{'host': '172.16.122.12', 'port': 22, 'user': 'spider', 'pwd': 'spider'},
{'host': '172.16.122.13', 'port': 22, 'user': 'spider', 'pwd': 'spider'} ]
SLAVES_BALANCE
【二选一】爬虫机器配置(ssh负载均衡)
{'host': '172.16.122.11', 'port': 2202, 'user': 'spider', 'pwd': 'spider'}
SLAVES_ENV
【可选】爬虫机器虚拟环境路径
/home/spider/workspace/spiderman/venv
SLAVES_WORKSPACE
【必填】爬虫机器代码工程路径
/home/spider/workspace/spiderman
如何管理爬虫元数据
运行 easy_meta.py 自动生成当前项目所有爬虫的元数据, 默认记录到sqlite meta.db, 可以在 setting 中自行配置;
# 爬虫 meta
META_ENGION = 'sqlite:///meta.db'
元数据表meta字典如下:
字段名
类型
注释
spider
varchar(50)
爬虫名
spider_comment
varchar(100)
爬虫描述
tb
varchar(50)
表名
tb_comment
varchar(100)
表描述
col_px
int
字段序号
col
varchar(50)
字段名
col_comment
varchar(100)
字段描述
author
varchar(20)
开发人员
addtime
varchar(20)
开发时间
insertime
varchar(20)
元数据更新时间
如何配合kafka做实时采集监控
配置 kafka(修改 setting 的 KAFKA_SERVERS)
自定义监控规则(修改编写 kafka_mon.py , 并运行该脚本程序, 开始监控)
在 spider 中启用 kafka 管道(运行爬虫 job , 开始采集)
注意事项
字段名称不能使用 tablename、isload、ctime、bizdate、spider 等字段,因为这些字段被作为通用字段,避免冲突
items 文件每个字段建议添加注释,生成元数据时,会将注释导入到元数据表,便于管理爬虫
hive环境问题
在 windows 环境下,使用 python3 连接 hive 会有很多坑,所以使用 hdfs 管道时,hive 自动建表功能默认关闭,便于部署。 假如需要启用 hive 自动建表功能,请进行如下操作:
pip install --no-deps thrift-sasl==0.2.1
验证环境,执行 SP.utils.ctrl_hive
如果执行成功,说明 hive 环境准备完毕,可以直接启用 hive 自动建表功能;如果遇到问题,可以参考 【大数据】windows 下python3连接hive