---
# System prepended metadata

title: 分散式爬蟲 Use Document

---

# 分散式爬蟲 Use Document
## Project overview
[TOC]

## 需求
1. 如何快速在同時間爬取大量網站
2. 防ban - 怎麼不被網站發現我是爬蟲
3. 隱藏身分 – 讓被抓取的網站無法追蹤IP(我是誰)
4. 爬蟲管理介面(+狀態存取)
5. 去除重複網站爬取 & 存入

## 介紹 & 名詞定義
![圖片1](https://i.imgur.com/efgZ3cN.png)

### 運作流程
1. 統一蒐集URL，暫存於Redis
2. UrlCollector: 取得一定量於Redis列隊的URL，同時發布到AWS Lambda進行網頁HTML下載
3. LambdaProcessor: 回傳Lambda下載的HTML，存入Redis\(另一個Queue\)等待處理
4. HtmlConsumer: 
    - 取得下載回存於Redis的Html\(一次只處理一個網頁\)，並根據取得的資料\(Html、ParserName、該網頁的URL\)，使用Parser模組丟入HTML進行解析，並回傳資訊
    - 使用Generator取得Return的物件，根據物件的class，
        - Scrapy.Request: 新的請求網頁，callback為Parser，加入Redis等待請求
        - Scrapy.items: 解析出的資料，發布到Kafka等待Consumer處理
5. DataConsumer: crawl item的Consumer，依收到的DataType決定如何儲存\(DB\)

### UrlCollector
```
向Redis取得欲爬取的網址，並於定量後發送request
```
> 類似於原爬蟲階段的指定request

### HtmlConsumer
```
向Redis取得由AWS lambda下載回來的Html，並進行剖析
```
### StatesConsumer
```
處理Module中所記錄的state，並存入資料庫
```
### DataConsumer
```
用於蒐集HtmlConsumer解析後的資料，處理後存入資料庫
```
### ModuleLauncher
初始時須更新最新parser程式碼，且定期更新

## ModuleLauncher
Flask框架的WEB API
- 根據settings的launch_IP，紀錄此Server的服務IP，用於UI介面控制
- 運行另一個thread，負責定時向UI介面服務告知此服務仍在運行

### API
- /output: Dump此服務上各模組運行狀況
- /start_module: 運行一個新的thread，運行模組
- /stop_module: 呼叫模組的stop()方法，模組收到stop指令後跳出無限迴圈，結束此thread
- /reset: 記錄正在運行的模組，停止此服務上所有正在運行的模組，並根據先前紀錄有在運行的模組，重新分配thread給模組並開始重新運行

## UI介面
- /index
- /crawl_states
- /run_routine
- /job_list
- /get_states_list

#### index
- 觀看各模組狀況: 5秒ajax更新資料

#### crawl_states
- 觀看各模組狀況: 5秒ajax更新資料
- 錯誤排名列表\(網站\): 5秒ajax更新資料

#### run_routine
- 控制是否啟動固定時間發布任務功能
- 觀看目前有哪些爬蟲服務啟動
- 控制爬蟲服務的模組啟動或停止

#### job_list
- 觀看目前有抓哪些網站
- 控制下一次網站是否要加入任務列表
- 點選parser可進入爬蟲過程紀錄

#### get_states_list
- 給parser: 列出此parser的crawlid\(曾經發布過的任務\)
- 給crawlid: 列出此crawlid下的任務爬蟲過程

## 主機部屬

- UI Server
- Crawler Server

### UI Server

module
- ui_service.py
- add_request.py
- settings.py
folder
- js
- static
- templates

### Crawler Server
- crawl_launcher.py
- url_collector.py
- crawler.py
- lambda_processor.py
- settings.py
- data_consumer.py
- state_consumer.py

folder
- parsers


