spiderman
基於scrapy-redis的通用分布式爬蟲框架
github 項目地址 spiderman
目錄
demo采集效果
爬蟲元數據
cluster模式
standalone模式
kafka實時采集監控
功能
-
自動建表
-
自動生成爬蟲代碼,只需編寫少量代碼即可完成分布式爬蟲
-
自動存儲元數據,分析統計和補爬都很方便
-
適合多站點開發,每個爬蟲獨立定制,互不影響
-
調用方便,可以根據傳參自定義采集的頁數以及啟用的爬蟲數量
-
擴展簡易,可以根據需要選擇采集模式,單機 standalone (默認) 或者 分布式cluster
-
采集數據落地方便,支持多種數據庫,只需在 spider 中啟用相關的管道
關系型
- [x] mysql
- [x] sqlserver
- [x] oracle
- [x] postgresql
- [x] sqlite3
非關系型
- [x] hbase
- [x] mongodb
- [x] elasticsearch
- [x] hdfs
- [x] hive
- [x] datafile, 比如 csv
-
反爬處理簡易,已封裝各種反爬中間件
- [x] 隨機 UserAgent
- [x] 定制請求頭 Headers
- [x] 定制 Cookies
- [x] 定制代理 ip
- [x] 在 scrapy 中使用 requests
- [x] Payload 請求
- [x] 使用 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': '頁碼'}) # 通用字段
下載安裝
- git clone https://github.com/TurboWay/spiderman.git; cd spiderman;
- 【不使用虛擬環境的話,可以跳過步驟23】virtualenv -p /usr/bin/python3 --no-site-packages venv
- 【不使用虛擬環境的話,可以跳過步驟23】source venv/bin/activate
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
- 修改配置 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 -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
- pip install --no-deps thrift-sasl==0.2.1
- 驗證環境,執行 SP.utils.ctrl_hive
如果執行成功,說明 hive 環境准備完畢,可以直接啟用 hive 自動建表功能;如果遇到問題,可以參考 【大數據】windows 下python3連接hive