Golang 是一门很合适撰写互联网爬虫的语言,它有着高效的并发处置能力和丰富的互联网编程库。下面是一个简单的 Golang 互联网爬虫示例:
packagemainimport(fmtnet/httpio/ioutilregexp)funcmain(){resp,err:=http.Get(https://www.example.com)iferr!=nil{fmt.Println(Error:,err)return}deferresp.Body.Close()body,err:=ioutil.ReadAll(resp.Body)iferr!=nil{fmt.Println(Error:,err)return}re:=regexp.MustCompile(title(.*)/title)title:=re.FindStringSubmatch(string(body))[1]fmt.Println(Title:,title)}
这个爬虫的功能是获得指定网站的标题。代码中用了 Go 的规范库 net/http 和 regexp 来进行互联网请求和正则表达式匹配。当然,这只不过一个简单的示例,事实上爬虫需要考虑更多的问题,譬如反爬虫、数据存储、并发控制等等。
gocolly是用go达成的互联网爬虫框架,我这里用来测试的版本是:colly github.com/gocolly/colly/v2
gocolly的互联网爬虫还是非常强大,下面大家通过代码来看一下这个功能的用法
packagemainimport(fmtcollygithub.com/gocolly/colly/v2github.com/gocolly/colly/v2/debug)funcmain(){mUrl:=http://www.ifeng.com///colly的主体是Collector对象,管理互联网通信和负责在作业运行时实行附加的回掉函数c:=colly.NewCollector(//开启本机debugcolly.Debugger(debug.LogDebugger{}),)//发送请求之前的实行函数c.onRequest(func(r*colly.Request){fmt.Println(这里是发送之前实行的函数)})//发送请求错误被回调c.onError(func(_*colly.Response,errerror){fmt.Print(err)})//响应请求之后被回调c.onResponse(func(r*colly.Response){fmt.Println(Responsebodylength:,len(r.Body))})//response之后会调用该函数,剖析页面数据c.onHTML(div#newsListh2a,func(e*colly.HTMLElement){fmt.Println(e.Text)})//在OnHTML之后被调用c.onScraped(func(r*colly.Response){fmt.Println(Finished,r.Request.URL)})//这里是实行访问urlc.Visit(mUrl)}
运行结果如下:
这里是发送之前实行的函数
[000001] 1 [ 1 - request] map[url:http://www.ifeng.com/] (0s)
[000002] 1 [ 1 - responseHeaders] map[status:OK url:http://www.ifeng.com/] (64.9485ms)
Response body length:250326
Finished http://www.ifeng.com/
[000003] 1 [ 1 - response] map[status:OK url:http://www.ifeng.com/] (114.9949ms)
[000004] 1 [ 1 - html] map[selector:div#newsList h2 a url:http://www.ifeng.com/] (118.9926ms)
[000005] 1 [ 1 - html] map[selector:div#newsList h2 a url:http://www.ifeng.com/] (118.9926ms)
[000006] 1 [ 1 - scraped] map[url:http://www.ifeng.com/] (118.9926ms)
总结一下:
回调函数的调用顺序如下:
OnRequest在发起请求前被调用
OnError请求过程中假如发生错误被调用
OnResponse收到回复后被调用
OnHTML在OnResponse之后被调用,假如收到的内容是HTML
OnScraped在OnHTML之后被调用






