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)
}
|