# spiderman
![](https://img.shields.io/badge/python-3.6-brightgreen)
![](https://img.shields.io/badge/Scrapy-1.6%2B-orange)
![](https://img.shields.io/badge/scrapy--redis-0.6%2B-yellowgreen)
![](https://img.shields.io/badge/SQLAlchemy-1.3%2B-green)
基于 scrapy-redis 的通用分布式爬虫框架
****
## 目录
* [效果图](#demo采集效果)
* [采集效果](#demo采集效果)
* [爬虫元数据](#爬虫元数据)
* [分布式爬虫运行](#cluster模式)
* [单机爬虫运行](#standalone模式)
* [附件下载](#附件下载)
* [kafka实时采集监控示例](#kafka实时采集监控)
* [介绍](#功能)
* [功能](#功能)
* [原理说明](#原理说明)
* [快速开始](#下载安装)
* [下载安装](#下载安装)
* [如何开发一个新爬虫](#如何开发一个新爬虫)
* [如何进行补爬](#如何进行补爬)
* [如何下载附件](#如何下载附件)
* [如何扩展分布式爬虫](#如何扩展分布式爬虫)
* [如何管理爬虫元数据](#如何管理爬虫元数据)
* [如何配合kafka做实时采集监控](#如何配合kafka做实时采集监控)
* [如何使用爬虫api](#如何使用爬虫api)
* [其它](#注意事项)
* [注意事项](#注意事项)
* [hive环境问题](#hive环境问题)
* [更新日志](#更新日志)
* [TODO](#TODO)
### demo采集效果
![image](https://gitee.com/TurboWay/blogimg/raw/master/img/file.jpg)
![image](https://gitee.com/TurboWay/blogimg/raw/master/img/image-20210317145454296.png)
![image](https://gitee.com/TurboWay/blogimg/raw/master/img/image-20210317145413391.png)
### 爬虫元数据
![meta](https://gitee.com/TurboWay/blogimg/raw/master/img/meta.jpg)
### cluster模式
![cluster](https://gitee.com/TurboWay/blogimg/raw/master/img/cluster.jpg)
### standalone模式
![image-20210323141940525](https://gitee.com/TurboWay/blogimg/raw/master/img/image-20210323141940525.png)
### 附件下载
![image-20210318161618307](https://gitee.com/TurboWay/blogimg/raw/master/img/image-20210318161618307.png)
### kafka实时采集监控
![mon](https://gitee.com/TurboWay/blogimg/raw/master/img/mon.jpg)
### 功能
- 自动建表
- 自动生成爬虫代码,只需编写少量代码即可完成分布式爬虫
- 自动存储元数据,分析统计和补爬都很方便
- 适合多站点开发,每个爬虫独立定制,互不影响
- 调用方便,可以根据传参自定义采集的页数以及启用的爬虫数量
- 扩展简易,可以根据需要选择采集模式,单机 standalone (默认) 或者 分布式cluster
- 采集数据落地方便,支持多种数据库,只需在 spider 中启用相关的管道
关系型
- [x] mysql
- [x] sqlserver
- [x] oracle
- [x] postgresql
- [x] sqlite3
非关系型
- [x] hbase
- [x] mongodb
- [x] elasticsearch
- [x] hdfs
- [x] hive
- [x] doris
- [x] datafile, 比如 csv
- 反爬处理简易,已封装各种反爬中间件
- [x] 随机 UserAgent
- [x] 定制请求头 Headers
- [x] 定制 Cookies 池
- [x] 定制代理 ip
- [x] 在 scrapy 中使用 requests
- [x] Payload 请求
- [x] 使用 Splash 渲染 js
### 原理说明
1. 消息队列使用 redis,采集策略使用广度优先,先进先出
2. 每个爬虫都有一个 job 文件,使用 job 来生成初始请求类 ScheduledRequest,并将其推送到 redis;
初始请求全部推到 redis 后,运行 spider 解析生成数据 并迭代新的请求到redis, 直到 redis 中的全部请求被消耗完
```python
# 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, 携带元数据,比如 pagenum
```
3. item 类定义表名、字段名、排序号(自定义字段顺序)、注释说明(便于管理元数据)、字段类型(仅关系型数据库管道有效)
```python
class zhifang_list_Item(scrapy.Item):
# define table
tablename = 'zhifang_list'
tabledesc = '列表'
# 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': '页码'}) # 通用字段
```
4. 去重策略,默认不去重,每次采集独立,即每次启动 job 都会清空上一次未完成的 url,并且不保留 redis 中上一次已采集的 url 指纹。
如需调整可以修改以下配置
- job 文件(单个爬虫)
```python
class zhifang_job(SPJob):
def __init__(self):
super().__init__(spider_name=zhifang_Spider.name)
# self.delete() # 如需去重、增量采集,请注释该行
```
- spider 文件(单个爬虫)
```python
custom_settings = {
...,
'DUPEFILTER_CLASS': 'scrapy_redis.dupefilter.RFPDupeFilter',
'SCHEDULER_PERSIST': True, # 开启持久化
}
def get_callback(self, callback):
# url去重设置:True 不去重 False 去重
callback_dt = {
'list': (self.list_parse, False),
'detail': (self.detail_parse, False),
}
return callback_dt.get(callback)
```
- 布隆过滤器。
> 当采集的数据量很大时,可以使用布隆过滤器,该算法占用空间小且可控,适合海量数据去重。
> 但是该算法会有漏失率,对爬虫而言就是漏爬。可以通过调整过滤器负载个数、内存配置、哈希次数以降低漏失率。
> 默认 1 个过滤器,256 M 内存,使用 7 个 seeds,这个配置表示漏失概率为 8.56e-05 时,可满足 0.93 亿条字符串的去重。当漏失率为 0.000112 时,可满足 0.98 亿条字符串的去重。[调参与漏失率参考](https://blog.csdn.net/Bone_ACE/article/details/53107018)
```python
custom_settings = {
...,
'DUPEFILTER_CLASS': 'SP.bloom_dupefilter.BloomRFDupeFilter', # 使用布隆过滤器
'SCHEDULER_PERSIST': True, # 开启持久化
'BLOOM_NUM': 1, # 布隆过滤器负载个数,当内存达到限制时,可以增加负载个数
'BLOOM_MEM': 256, # 布隆过滤器内存大小(单位 M),内存最大 512 M (因为 redis string 最大只能 512 M)
'BLOOM_K': 7, # 布隆过滤器哈希次数,次数越少,去重越快,但是漏失率越高
}
def get_callback(self, callback):
# url去重设置:True 不去重 False 去重
callback_dt = {
'list': (self.list_parse, False),
'detail': (self.detail_parse, False),
}
return callback_dt.get(callback)
```
### 下载安装
1. git clone https://github.com/TurboWay/spiderman.git; cd spiderman;
2. 【不使用虚拟环境的话,可以跳过步骤23】virtualenv -p /usr/bin/python3 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.
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于 scrapy-redis 的通用分布式爬虫框架.zip (49个子文件)
spiderman-master
easy_meta.py 4KB
kafka_mon.py 1KB
execute_download.py 5KB
LICENSE 1KB
scrapy.cfg 247B
download.py 7KB
SP_JOBS
__init__.py 111B
zhifang_job.py 2KB
job.py 5KB
zhifang_job_patch.py 3KB
SP
__init__.py 0B
bloom_dupefilter.py 3KB
pipelines
__init__.py 113B
pipelines_clean.py 717B
pipelines_hbase.py 5KB
pipelines_hdfs.py 6KB
pipelines_mongodb.py 4KB
pipelines_elasticsearch.py 4KB
pipelines_kafka.py 2KB
pipelines_datafile.py 5KB
pipelines_doris.py 5KB
pipelines_file.py 2KB
pipelines_rdbm.py 4KB
scrapy_redis_extensions.py 3KB
utils
__init__.py 0B
ctrl_ssh.py 930B
tool.py 4KB
aes.py 5KB
cookies_tool.py 3KB
base.py 994B
ctrl_redis.py 5KB
ctrl_hive.py 921B
items
__init__.py 113B
items.py 936B
zhifang_items.py 2KB
spiders
__init__.py 161B
zhifang.py 6KB
SPRedisSpider.py 2KB
middlewares
SPMiddleWare.py 6KB
__init__.py 113B
middlewares.py 4KB
settings.py 7KB
easy_scrapy.py 17KB
api.py 4KB
test_html.py 2KB
requirements.txt 1KB
.gitignore 67B
README.md 17KB
项目授权码.txt 268B
共 49 条
- 1
资源评论
不走小道
- 粉丝: 3205
- 资源: 5122
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功