正文
贡献某CC,go源码爬虫一个,基于colly,效果是根据输入的浏览器cookie及excel必要行列号,从excel中读取公司名称,查询公司法人及电话号码。并写回到excel中指定行。
package main import ( "bufio" "fmt" "github.com/gocolly/colly/debug" "github.com/gocolly/colly/extensijavascriptons" "github.com/xuri/excelize/v2" "net/url" "os" "runtime" "strconv" "time" ) import "github.com/gocoll编程客栈y/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("请输入浏开发者_Python览器cookies 在浏览器 开发者模式F12,情况下找到控制台(consol) 输入(注意,Cookie中如果有 HttpOnly的需要在开发工具中将HttpOnly取消掉,然后再执行后面命令):document.cookie 即可,然后复制出来! 右击,复制字符串内容") //fmt.Scan(&cookies) //此行遇到空格会 默认输入完毕了www.devze.com,所以不能用它 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 errojavascriptr) { 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-ecmascr编程客栈ipt, */*; 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 爬虫的资料请关注我们其它相关文章!
精彩评论