go colly 爬虫实现示例

 更新时间:2022年09月30日 15:30:03   作者:如此风景  
这篇文章主要为大家介绍了go colly 爬虫实现示例,效果是根据输入的浏览器cookie及excel必要行列号,从excel中读取公司名称,查询公司法人及电话号码。并写回到excel中指定行

正文

贡献某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 爬虫的资料请关注脚本之家其它相关文章!

相关文章

  • go语言分布式id生成器及分布式锁介绍

    go语言分布式id生成器及分布式锁介绍

    这篇文章主要为大家介绍了go语言分布式id生成器及分布式锁介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • GoLang strings.Builder底层实现方法详解

    GoLang strings.Builder底层实现方法详解

    自从学习go一个月以来,我多少使用了一下strings.Builder,略有心得。你也许知道它,特别是你了解bytes.Buffer的话。所以我在此分享一下我的心得,并希望能对你有所帮助
    2022-10-10
  • Go 语言中 20 个占位符的整理

    Go 语言中 20 个占位符的整理

    这篇文章主要介绍了Go 语言中 20 个占位符的整理,看完本篇文章讲学会什么是占位符?哪些函数支持?如何使用占位符?不同的占位符的作用?配合占位符的几个标记符号用法?
    2021-10-10
  • golang使用viper加载配置文件实现自动反序列化到结构

    golang使用viper加载配置文件实现自动反序列化到结构

    这篇文章主要为大家介绍了golang使用viper加载配置文件实现自动反序列化到结构示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Go递归修改文件名的实例代码

    Go递归修改文件名的实例代码

    这篇文章主要介绍了Go递归修改文件名的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的饿参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Golang 利用反射对结构体优雅排序的操作方法

    Golang 利用反射对结构体优雅排序的操作方法

    这篇文章主要介绍了Golang 利用反射对结构体优雅排序的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 深入理解Golang channel的应用

    深入理解Golang channel的应用

    channel是用于 goroutine 之间的同步、通信的数据结构。它为程序员提供了更高一层次的抽象,封装了更多的功能,这样并发编程变得更加容易和安全。本文通过示例为大家详细介绍了channel的应用,需要的可以参考一下
    2022-10-10
  • 详解golang defer 闭包 匿名函数

    详解golang defer 闭包 匿名函数

    这篇文章主要介绍了golang defer 闭包 匿名函数的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Goland 生成可执行文件的操作

    Goland 生成可执行文件的操作

    这篇文章主要介绍了Goland 生成可执行文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang json.Marshal 特殊html字符被转义的解决方法

    golang json.Marshal 特殊html字符被转义的解决方法

    今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论