go?colly?爬蟲(chóng)實(shí)現(xiàn)示例
正文
貢獻(xiàn)某CC,go源碼爬蟲(chóng)一個(gè),基于colly,效果是根據(jù)輸入的瀏覽器cookie及excel必要行列號(hào),從excel中讀取公司名稱,查詢公司法人及電話號(hào)碼。并寫(xiě)回到excel中指定行。
package main import ( "bufio" "fmt" "github.com/gocolly/colly/debug" "github.com/gocolly/colly/extensions" "github.com/xuri/excelize/v2" "net/url" "os" "runtime" "strconv" "time" ) import "github.com/gocolly/colly" var ( cookies string tempUrl string tempGongSiName string tempI int ) func main() { //要處理的文件全名 var fileName string //列的名稱 var namelie string //開(kāi)始行號(hào) var startNum int //結(jié)束行號(hào) var endNum int var personLie string var phoneLie string fmt.Println("請(qǐng)輸入瀏覽器cookies 在瀏覽器 開(kāi)發(fā)者模式F12,情況下找到控制臺(tái)(consol) 輸入(注意,Cookie中如果有 HttpOnly的需要在開(kāi)發(fā)工具中將HttpOnly取消掉,然后再執(zhí)行后面命令):document.cookie 即可,然后復(fù)制出來(lái)! 右擊,復(fù)制字符串內(nèi)容") //fmt.Scan(&cookies) //此行遇到空格會(huì) 默認(rèn)輸入完畢了,所以不能用它 reader := bufio.NewReader(os.Stdin) res, _, err := reader.ReadLine() if nil == err { cookies=string(res) }else{ fmt.Println("讀取cookie錯(cuò)誤 error:", err) return } //fmt.Println("輸入的cookie是:"+cookies) fmt.Println("請(qǐng)輸入文件全路徑:(字符串類型)") fmt.Scan(&fileName) fmt.Println("請(qǐng)輸入Excel要查詢公司名稱列的字母(字母大寫(xiě)):") fmt.Scan(&namelie) fmt.Println("請(qǐng)輸入Excel指定列的第一個(gè)行號(hào)(數(shù)字類型):") fmt.Scan(&startNum) fmt.Println("請(qǐng)輸入Excel指定列的最后一個(gè)行號(hào)(數(shù)字類型):") fmt.Scan(&endNum) fmt.Println("請(qǐng)輸入Excel聯(lián)系人的所在列的字母(字母大寫(xiě)):") fmt.Scan(&personLie) fmt.Println("請(qǐng)輸入Excel聯(lián)系電話所在列的字母(字母大寫(xiě)):") fmt.Scan(&phoneLie) //輸出所有輸入的信息,驗(yàn)證正確 //fmt.Println(fileName,namelie,startNum,endNum,personLie,phoneLie) f, err := excelize.OpenFile(fileName) if err!=nil { fmt.Println(err) return } c:=initCollector(f,personLie,phoneLie) //上面打開(kāi)的工作簿記得關(guān)閉吆。 defer func() { // 關(guān)閉工作簿 if err := f.Close(); err != nil { fmt.Println(err) } }() for i:=startNum;i<=endNum;i++{ // 獲取工作表中指定單元格的值 cell, err := f.GetCellValue("Sheet1", namelie+strconv.Itoa(i)) if err != nil { fmt.Println("讀取第"+strconv.Itoa(i)+"行出錯(cuò)!") return }else{ fmt.Println("開(kāi)始抓取:"+cell+" 數(shù)據(jù)") tempGongSiName = cell tempI = i visitUrl(c) time.Sleep(1*time.Second) } } fmt.Println("-------------親愛(ài)的,程序成功執(zhí)行完畢。--------我要喝咖啡,我要吃肉肉------!") } ///初始化收集器 func initCollector(f *excelize.File,personLie string,phoneLie string,) *colly.Collector { c := colly.NewCollector(colly.MaxDepth(1), colly.Debugger(&debug.LogDebugger{})) extensions.RandomUserAgent(c) // 使用隨機(jī)的UserAgent,最好能使用代理。這樣就不容易被ban c.SetProxy("socks5://127.0.0.1:7890") c.OnError(func(response *colly.Response, err error) { fmt.Println("---->onError --------爬取出錯(cuò)了"+err.Error()) runtime.Goexit() }) c.OnResponse(func(response *colly.Response) { fmt.Println("---->onResponse") }) c.OnXML("table", func(element *colly.XMLElement) { fmt.Println("---->onXML") }) c.OnRequest(func(r *colly.Request) { r.Headers.Set("Cookie",cookies) r.Headers.Add("referer", tempUrl) r.Headers.Add("sec-fetch-mode", "cors") r.Headers.Add("sec-fetch-site", "same-origin") r.Headers.Add("accept", "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01") r.Headers.Add("accept-encoding", "gzip, deflate, br") r.Headers.Add("accept-language", "en,zh-CN;q=0.9,zh;q=0.8") r.Headers.Add("X-Requested-With", "XMLHttpRequest") }) c.OnHTML("tr:first-child", func(e *colly.HTMLElement) {//拿到查詢的第一條數(shù)據(jù)。 fmt.Println("---->onHtml---獲取成功!") //拿到第一條的公司主要信息。 //fmt.Println("---->"+e.DOM.Find(".relate-info").Text()) sellectEle := e.DOM.Find(".relate-info") //最終查詢出來(lái)的人 name:=sellectEle.Find("div:nth-child(1)").Find("div>span").First().Find("a").Text() //最終查詢出來(lái)的電話 phone:=sellectEle.Find("div:nth-child(2)").Find("div>span").First().Find("span>span").Find(":nth-child(2)").Text() //fmt.Println("--->>>"+name) //fmt.Println("--->>>"+phone) f.SetCellValue("Sheet1", personLie+strconv.Itoa(tempI), name) fmt.Println("將"+tempGongSiName+"人名 ("+name+") 寫(xiě)入 "+personLie+strconv.Itoa(tempI)) f.SetCellValue("Sheet1", phoneLie+strconv.Itoa(tempI), phone) fmt.Println("將"+tempGongSiName+"電話 ("+phone+") 寫(xiě)入 "+phoneLie+strconv.Itoa(tempI)) f.Save() }) c.OnScraped(func(response *colly.Response) { fmt.Println("onScraped") }) return c } //訪問(wèn)給定名稱 func visitUrl(c *colly.Collector){ tempUrl:="https://www.xxx.com/web/search?key="+url.QueryEscape(tempGongSiName) c.Visit(tempUrl) }
以上就是go colly 爬蟲(chóng)實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于go colly 爬蟲(chóng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法
這篇文章主要介紹了Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法,實(shí)例分析了基于Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)易服務(wù)器的TCP客戶端與服務(wù)器端實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-02-02Go語(yǔ)言操作Excel利器之excelize類庫(kù)詳解
Excelize是Go語(yǔ)言編寫(xiě)的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),可以使用它來(lái)讀取、寫(xiě)入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作Excel利器之excelize類庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-10-10golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類型
這篇文章主要介紹了golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Go語(yǔ)言的結(jié)構(gòu)體還能這么用?看這篇就夠了
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言結(jié)構(gòu)體的各個(gè)知識(shí)點(diǎn),最后還介紹了空結(jié)構(gòu)體的3種妙用。文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助2023-02-02Go中RPC遠(yuǎn)程過(guò)程調(diào)用的實(shí)現(xiàn)
本文主要介紹了Go中RPC遠(yuǎn)程過(guò)程調(diào)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Windows下在CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法
在cmd下運(yùn)行g(shù)o程序或者是GOLAND的Terminal下運(yùn)行g(shù)o程序會(huì)出現(xiàn)中文亂碼的情況。本文就詳細(xì)的介紹下解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12golang 實(shí)用庫(kù)gotable的具體使用
使用gotable框架以實(shí)現(xiàn)在CLI命令行界面中打印表格。本文就介紹一下golang 實(shí)用庫(kù)gotable的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07