一个通用分布式爬虫框架 spiderman

spiderman是一个基于scrapy-redis的通用分布式爬虫框架,提供自动建表、爬虫元数据管理等功能。支持集群和单机模式,可扩展分布式爬虫,内置多种反爬策略。通过配置kafka实现实时采集监控。

spiderman

基于 scrapy-redis 的通用分布式爬虫框架
github 项目地址 spiderman


目录

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

原理说明

  1. 消息队列使用 redis,采集策略使用先进先出
  2. 每个爬虫都有一个 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
  1. 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': '页码'})  # 通用字段

下载安装

  1. git clone https://github.com/TurboWay/spiderman.git; cd spiderman;
  2. 【不使用虚拟环境的话,可以跳过步骤23】virtualenv -p /usr/bin/python3 --no-site-packages venv
  3. 【不使用虚拟环境的话,可以跳过步骤23】source venv/bin/activate
  4. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
  5. 修改配置 vi SP/settings.py
  6. 运行demo示例 python SP_JOBS/zhifang_job.py

如何开发一个新爬虫

运行 easy_scrapy.py 会根据模板自动生成以下代码文件,并自动在 pycharm 打开 spidername_job.py 文件;

类别路径说明
jobSP_JOBS/spidername_job.py编写初始请求
spiderSP/spiders/spidername.py编写解析规则,产生新的请求
itemsSP/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 文件;

类别路径说明
jobSP_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字典如下:

字段名类型注释
spidervarchar(50)爬虫名
spider_commentvarchar(100)爬虫描述
tbvarchar(50)表名
tb_commentvarchar(100)表描述
col_pxint字段序号
colvarchar(50)字段名
col_commentvarchar(100)字段描述
authorvarchar(20)开发人员
addtimevarchar(20)开发时间
insertimevarchar(20)元数据更新时间

如何配合kafka做实时采集监控

  1. 配置 kafka(修改 setting 的 KAFKA_SERVERS)
  2. 自定义监控规则(修改编写 kafka_mon.py , 并运行该脚本程序, 开始监控)
  3. 在 spider 中启用 kafka 管道(运行爬虫 job , 开始采集)

注意事项

  1. 字段名称不能使用 tablename、isload、ctime、bizdate、spider 等字段,因为这些字段被作为通用字段,避免冲突
  2. items 文件每个字段建议添加注释,生成元数据时,会将注释导入到元数据表,便于管理爬虫

hive环境问题

在 windows 环境下,使用 python3 连接 hive 会有很多坑,所以使用 hdfs 管道时,hive 自动建表功能默认关闭,便于部署。
假如需要启用 hive 自动建表功能,请进行如下操作:

  1. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
  2. pip install --no-deps thrift-sasl==0.2.1
  3. 验证环境,执行 SP.utils.ctrl_hive

如果执行成功,说明 hive 环境准备完毕,可以直接启用 hive 自动建表功能;如果遇到问题,可以参考 【大数据】windows 下python3连接hive

YayCrawler是一个基于WebMagic开发的分布式通用爬虫框架,开发语言是Java。我们知道目前爬虫框架很多,有简单的,也有复杂的,有轻 量型的,也有重量型的。您也许会问:你这个爬虫框架的优势在哪里呢?额,这个是一个很重要的问题!在这个开篇中,我先简单的介绍一下我这个爬虫框架的特 点,后面的章幅会详细介绍并讲解它的实现,一图胜千言:1、分布式:YayCrawler就是一个大哥(Master)多个小弟(Worker)的架构(这种结构才是宇宙的真理),当然大哥还有一个小秘(Admin)和外界交往。2、通用性:我们很多时候需要爬取不同网站的数据,各个网站的结构和内容都有很大的差别,基本上大部分人都是遇到一个网站写一份代码,没法做到工具 的复用。YayCrawler就是想改变这种情况,把不同的部分抽象出来,用规则来指导爬虫做事。也就是说用户可以在界面上配置如何抓取某个页面的数据的 规则,等爬虫在爬取这个页面的时候就会用这个事先配置好的规则来解析数据,然后把数据持久化。3、可扩展的任务队列:任务队列由Redis实现,根据任务的状态有四种不同的任务队列:初始、执行中、成功、失败。您也可以扩展不同的任务调度算法,默认是公平调度。4、可定义持久化方式:爬取结果中,属性数据默认持久化到MongoDB,图片会被下载到文件服务器,当然您可以扩展更多的存储方式。5、稳定和容错:任何一个失败的爬虫任务都会重试和记录,只有任务真正成功了才会被移到成功队列,失败会有失败的原因描述。6、反监控组件:网站为了防止爬虫也是煞费苦心,想了一系列的监控手段来反爬虫。作为对立面,我们自然也要有反监控的手段来保障我们的爬虫任务,目前主要考虑的因素有:cookie失效(需要登陆)、刷验证码、封IP(自动换代理)。7、可以对任务设置定时刷新,比如隔一天更新某个网站的数据。作者博客地址:http://www.cnblogs.com/yuananyun 标签:爬虫
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值