golang爬蟲項目幽靈蛛源碼分析(一)

項目地址: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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章