項目地址:https://github.com/henrylee2cn/pholcus
操作界面的顯示
如圖,example_main.go是一個例子,用於指引用戶寫自己的main函數。
main函數中執行了一行命令用於指定本次運行的操作界面,通過這行命令可知去找exec包中的DefaultRun函數。
如圖,exec包中有五個文件,均屬於package exec。DefaultRun函數位於exec.go中,其他四個文件是根據操作系統來區分執行哪一個。
在執行DefaultRun函數之前,首先聲明瞭13個指針類型的flag參數,然後執行了init函數,作用是開啓最大核心數運行和打開手動gc。手動gc的介紹:https://blog.csdn.net/bolun365/article/details/65683615
DefaultRun函數中使用了flag包,該包用於解析命令行參數,flag包的介紹:https://studygolang.com/articles/3365
func DefaultRun(uiDefault string) {
fmt.Printf("%v\n\n", config.FULL_NAME)
flag.String("a *********************************************** common *********************************************** -a", "", "")
// 操作界面
uiflag = flag.String("_ui", uiDefault, " <選擇操作界面> [web] [gui] [cmd]")
flagCommon()
web.Flag()
cmd.Flag()
flag.String("z", "", "README: 參數設置參考 [xxx] 提示,參數中包含多個值時以 \",\" 間隔。\r\n")
flag.Parse()
writeFlag()
run(*uiflag)
}
DefaultRun函數作用是輸出選擇界面並解析通過界面輸入的參數,執行函數:
1.flagCommon
func flagCommon() {
//運行模式
modeflag = flag.Int(
"a_mode",
cache.Task.Mode,
" <運行模式: ["+strconv.Itoa(status.OFFLINE)+"] 單機 ["+strconv.Itoa(status.SERVER)+"] 服務端 ["+strconv.Itoa(status.CLIENT)+"] 客戶端>")
//端口號,非單機模式填寫
portflag = flag.Int(
"a_port",
cache.Task.Port,
" <端口號: 只填寫數字即可,不含冒號,單機模式不填>")
//主節點ip,客戶端模式填寫
masterflag = flag.String(
"a_master",
cache.Task.Master,
" <服務端IP: 不含端口,客戶端模式下使用>")
// 自定義配置
keyinsflag = flag.String(
"a_keyins",
cache.Task.Keyins,
" <自定義配置: 多任務請分別多包一層“<>”>")
// 採集上限
limitflag = flag.Int64(
"a_limit",
cache.Task.Limit,
" <採集上限(默認限制URL數)> [>=0]")
// 輸出方式
outputflag = flag.String(
"a_outtype",
cache.Task.OutType,
func() string {
var outputlib string
for _, v := range app.LogicApp.GetOutputLib() {
outputlib += "[" + v + "] "
}
return " <輸出方式: > " + strings.TrimRight(outputlib, " ")
}())
// 併發協程數
threadflag = flag.Int(
"a_thread",
cache.Task.ThreadNum,
" <併發協程> [1~99999]")
// 平均暫停時間
pauseflag = flag.Int64(
"a_pause",
cache.Task.Pausetime,
" <平均暫停時間/ms> [>=100]")
// 代理IP更換頻率
proxyflag = flag.Int64(
"a_proxyminute",
cache.Task.ProxyMinute,
" <代理IP更換頻率: /m,爲0時不使用代理> [>=0]")
// 分批輸出
dockerflag = flag.Int(
"a_dockercap",
cache.Task.DockerCap,
" <分批輸出> [1~5000000]")
// 繼承歷史成功記錄
successInheritflag = flag.Bool(
"a_success",
cache.Task.SuccessInherit,
" <繼承並保存成功記錄> [true] [false]")
// 繼承歷史失敗記錄
failureInheritflag = flag.Bool(
"a_failure",
cache.Task.FailureInherit,
" <繼承並保存失敗記錄> [true] [false]")
}
flagCommon函數也在exec.go文件中,初始化了12個flag指針,每個flag指針有不同的作用。
2.web.Flag()、cmd.Flag()
如圖,這兩個函數來自導入的web和cmd包。
cmd裏該函數的作用是初始化spiderflag這個flag指針。
web裏該函數的作用是初始化ip、port啓動web服務器的參數。
3.flag.Parse()
定義完所有flag指針後,通過調用flag.Parse()來解析命令行參數到定義的flag,之後可以使用flag指針本身。
4.writeFlag()
func writeFlag() {
cache.Task.Mode = *modeflag
cache.Task.Port = *portflag
cache.Task.Master = *masterflag
cache.Task.Keyins = *keyinsflag
cache.Task.Limit = *limitflag
cache.Task.OutType = *outputflag
cache.Task.ThreadNum = *threadflag
cache.Task.Pausetime = *pauseflag
cache.Task.ProxyMinute = *proxyflag
cache.Task.DockerCap = *dockerflag
cache.Task.SuccessInherit = *successInheritflag
cache.Task.FailureInherit = *failureInheritflag
}
如圖,在解析完參數後,調用writeFlag()函數把flag指針傳給cache.task中的參數。
5.run(*uiflag)
最後調用run(*uiflag)函數,*uiflag中保存的是選擇的模式,web、cmd還是gui。
如圖,同一個package下的其他四個文件中都有一個run函數,用的是windows所以調用的是windows文件下的run函數,參數爲web、gui或cmd。