看著曾經自己寫的文檔,一絲笑意湧過心頭。一分是為當時稚嫩的設計,一分是為當時入神入微,矜矜業業的態度。
這個設計是一個系統的資料抓取部分的設計,如果現在讓我設計,肯定完全是另一個樣。此系統早已不再運行,所以可以放心的拿出來,僅博一笑。
XXXX網站監控——詳細資料爬蟲設計
版本:V0.1
作者:XX
時間:2010-9-13
需求
根據視頻title及頁面URL,到具體網頁中抓取視頻各項屬性及資訊。
功能需求點 |
概述 |
輸入 |
提供webservice介面供主控調用,非同步啟動爬蟲任務。 |
輸出 |
1. 在正常接收、啟動任務後立即給主控返回接收成功。 2. 在完成任務/任務失敗後調用主控提供的回調介面。 3. 抓取成功後,將抓取資料儲存至資料庫。 |
錯誤處理 |
抓取異常情況下,應該將錯誤原因彙報給主控,並記錄日誌。 |
並發性需求 |
模組支援多線程並發調用。 |
|
|
實際情況調研
根據各XXXX網站HTML源碼分析,在介面/結構上基本相同,但在不同網站、或者同一網站部同視頻間存在若干細微的“版本”差異,所以需要在開發過程中,制定良好的爬取方案以適應各網站視頻頁面上的變化。
介面設計
使用WebService介面,SOAP協議。
l 版本
http://xxxxx/netvideo/bokecc/vinfoant/version?wsdl
INTPUT:NULL
OUTPUT:目前的版本
如 0.1
l 爬取
http://xxxxx/netvideo/bokecc/vinfoant/run?wsdl
INPUT:
參數 |
描述 |
類型 |
備忘 |
dbip |
串連資料庫IP |
String |
|
dbport |
串連資料庫連接埠 |
Integer |
|
dbname |
資料庫名 |
String |
|
dbuser |
資料庫使用者名稱 |
String |
|
dbpw |
資料庫密碼 |
String |
|
videoId |
需爬取的視頻id |
Integer |
|
sessionId |
任務id |
Integer |
|
timeout |
逾時時間 |
Integer |
|
callbackAddr |
回調地址 |
String |
任務完成之後調用的地址 |
OUTPUT:
Responese(WebService調用同步返回):
Id |
描述 |
0 |
接受成功 |
-1 |
主控身份錯誤,禁止進入 |
-2 |
資料庫連接失敗 |
Callback(WebService調用非同步返回):
參數 |
描述 |
類型 |
備忘 |
sessionId |
任務id |
Integer |
|
status |
任務完成狀態 |
Integer |
0 成功 -1 網路情況異常 -2 Regex匹配錯誤 |
|
|
|
|
|
|
|
|
流程設計
1. 爬取任務整體流程
【無法貼圖】
2. 內容匹配流程
【無法貼圖】
日誌設計
日誌條目 |
層級 |
記錄資訊 |
WebService介面被調用 |
Info |
調用方IP及各介面參數 |
主控身份校正失敗 |
Warn |
調用方IP |
開始建立/更新資料庫連接池 |
Info |
資料庫參數 |
資料庫連接失敗 |
Error,Notify |
失敗原因 |
資料庫連接成功 |
Info |
|
開始啟動爬蟲任務 |
Debug |
|
開始抓取網頁 |
Info |
URL |
一次網頁抓取逾時 |
Warn |
當前重試次數 |
一次網頁抓取異常 |
Warn |
異常原因 |
重試範圍內網頁抓取失敗 |
Error,Notify |
|
網頁抓取成功 |
Debug |
|
開始內容匹配 |
Info |
|
Regex匹配失敗 |
Error,Notify |
失敗欄位、失敗原因 |
Regex匹配成功 |
Debug |
|
開始更新資料庫 |
Info |
|
SQL操作 |
Debug |
SQL語句 |
更新資料庫完成 |
Debug |
|
寫資料庫異常 |
Error,Notify |
當前執行的SQL語句,異常原因 |
任務成功 |
Info |
|
技術選型
開發平台: windowsXP
部署平台: 跨平台
程式設計語言:python2.5
IDE+plug-in:MyEclipse 7.0 + pydev
具體使用的python技術:
功能 |
技術選型 |
網頁抓取 |
urllib2 |
內容解析,正則表達 |
re |
WebService |
ZSI2.0 |
SOAP協議 |
SOAPpy(ZSI依賴) |
XML |
pyXML(ZSI依賴) |
Web伺服器 |
ZSI內建SOAP SERVER 或Apache |
發布、部署 |
Windows平台:py2exe |