go?colly?爬蟲實(shí)現(xiàn)示例
正文
貢獻(xiàn)某CC,go源碼爬蟲一個(gè),基于colly,效果是根據(jù)輸入的瀏覽器cookie及excel必要行列號(hào),從excel中讀取公司名稱,查詢公司法人及電話號(hào)碼。并寫回到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
//開始行號(hào)
var startNum int
//結(jié)束行號(hào)
var endNum int
var personLie string
var phoneLie string
fmt.Println("請(qǐng)輸入瀏覽器cookies 在瀏覽器 開發(fā)者模式F12,情況下找到控制臺(tái)(consol) 輸入(注意,Cookie中如果有 HttpOnly的需要在開發(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要查詢公司名稱列的字母(字母大寫):")
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)系人的所在列的字母(字母大寫):")
fmt.Scan(&personLie)
fmt.Println("請(qǐng)輸入Excel聯(lián)系電話所在列的字母(字母大寫):")
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)
//上面打開的工作簿記得關(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("開始抓取:"+cell+" 數(shù)據(jù)")
tempGongSiName = cell
tempI = i
visitUrl(c)
time.Sleep(1*time.Second)
}
}
fmt.Println("-------------親愛的,程序成功執(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+") 寫入 "+personLie+strconv.Itoa(tempI))
f.SetCellValue("Sheet1", phoneLie+strconv.Itoa(tempI), phone)
fmt.Println("將"+tempGongSiName+"電話 ("+phone+") 寫入 "+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 爬蟲實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于go colly 爬蟲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言服務(wù)器開發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法
這篇文章主要介紹了Go語(yǔ)言服務(wù)器開發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法,實(shí)例分析了基于Go語(yǔ)言實(shí)現(xiàn)的簡(jiǎn)易服務(wù)器的TCP客戶端與服務(wù)器端實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-02-02
Go語(yǔ)言操作Excel利器之excelize類庫(kù)詳解
Excelize是Go語(yǔ)言編寫的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),可以使用它來(lái)讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作Excel利器之excelize類庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-10-10
golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類型
這篇文章主要介紹了golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Go語(yǔ)言的結(jié)構(gòu)體還能這么用?看這篇就夠了
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言結(jié)構(gòu)體的各個(gè)知識(shí)點(diǎn),最后還介紹了空結(jié)構(gòu)體的3種妙用。文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助2023-02-02
Go中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-07
Windows下在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-12
golang 實(shí)用庫(kù)gotable的具體使用
使用gotable框架以實(shí)現(xiàn)在CLI命令行界面中打印表格。本文就介紹一下golang 實(shí)用庫(kù)gotable的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

