首頁 > 軟體

go colly 爬蟲實現範例

2022-10-02 14:00:38

正文

貢獻某CC,go原始碼爬蟲一個,基於colly,效果是根據輸入的瀏覽器cookie及excel必要行列號,從excel中讀取公司名稱,查詢公司法人及電話號碼。並寫回到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
   //開始行號
   var startNum int
   //結束行號
   var endNum int
   var personLie string
   var phoneLie string
   fmt.Println("請輸入瀏覽器cookies 在瀏覽器 開發者模式F12,情況下找到控制檯(consol) 輸入(注意,Cookie中如果有 HttpOnly的需要在開發工具中將HttpOnly取消掉,然後再執行後面命令):document.cookie  即可,然後複製出來! 右擊,複製字串內容")
   //fmt.Scan(&cookies)  //此行遇到空格會 預設輸入完畢了,所以不能用它
   reader := bufio.NewReader(os.Stdin)
   res, _, err := reader.ReadLine()
   if nil == err {
      cookies=string(res)
   }else{
      fmt.Println("讀取cookie錯誤 error:", err)
      return
   }
   //fmt.Println("輸入的cookie是:"+cookies)
   fmt.Println("請輸入檔案全路徑:(字串型別)")
   fmt.Scan(&fileName)
   fmt.Println("請輸入Excel要查詢公司名稱列的字母(字母大寫):")
   fmt.Scan(&namelie)
   fmt.Println("請輸入Excel指定列的第一個行號(數位型別):")
   fmt.Scan(&startNum)
   fmt.Println("請輸入Excel指定列的最後一個行號(數位型別):")
   fmt.Scan(&endNum)
   fmt.Println("請輸入Excel聯絡人的所在列的字母(字母大寫):")
   fmt.Scan(&personLie)
   fmt.Println("請輸入Excel聯絡電話所在列的字母(字母大寫):")
   fmt.Scan(&phoneLie)
   //輸出所有輸入的資訊,驗證正確
   //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)
   //上面開啟的工作簿記得關閉吆。
   defer func() {
      // 關閉工作簿
      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)+"行出錯!")
         return
      }else{
         fmt.Println("開始抓取:"+cell+"  資料")
         tempGongSiName = cell
         tempI = i
         visitUrl(c)
         time.Sleep(1*time.Second)
      }
   }
   fmt.Println("-------------親愛的,程式成功執行完畢。--------我要喝咖啡,我要吃肉肉------!")
}
///初始化收集器
func initCollector(f *excelize.File,personLie string,phoneLie string,) *colly.Collector {
   c := colly.NewCollector(colly.MaxDepth(1), colly.Debugger(&debug.LogDebugger{}))
   extensions.RandomUserAgent(c)                              // 使用隨機的UserAgent,最好能使用代理。這樣就不容易被ban
   c.SetProxy("socks5://127.0.0.1:7890")
   c.OnError(func(response *colly.Response, err error) {
      fmt.Println("---->onError  --------爬取出錯了"+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) {//拿到查詢的第一條資料。
      fmt.Println("---->onHtml---獲取成功!")
      //拿到第一條的公司主要資訊。
      //fmt.Println("---->"+e.DOM.Find(".relate-info").Text())
      sellectEle := e.DOM.Find(".relate-info")
      //最終查詢出來的人
      name:=sellectEle.Find("div:nth-child(1)").Find("div>span").First().Find("a").Text()
      //最終查詢出來的電話
      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
}
//存取給定名稱
func visitUrl(c *colly.Collector){
   tempUrl:="https://www.xxx.com/web/search?key="+url.QueryEscape(tempGongSiName)
   c.Visit(tempUrl)
}

以上就是go colly 爬蟲實現範例的詳細內容,更多關於go colly 爬蟲的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com