【python】一個通用分布式爬蟲框架 spiderman


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

原理說明

  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 文件;

類別 路徑 說明
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做實時采集監控

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM