基于python的分布式爬虫框架_基于scrapy-redis的通用分布式爬虫框架

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

你可能感兴趣的:(基于python的分布式爬虫框架_基于scrapy-redis的通用分布式爬虫框架)