Go语言如何实现并发爬虫
导读:本文共1689.5字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 1. 单线程爬虫定义一个用户varClienthttp.Client主函数funcmain(){ url:="http://localhost:3000/api/v1/products" start:=time.Now() fori:=0;i<10;i++{ Spider(url,i) }... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。1. 单线程爬虫
定义一个用户
varClienthttp.Client
主函数
funcmain(){ url:="http://localhost:3000/api/v1/products" start:=time.Now() fori:=0;i<10;i++{ Spider(url,i) } elapsed:=time.Since(start) fmt.Printf("Time%s",elapsed)}
爬取函数
funcSpider(urlstring,iint){ reqSpider,err:=http.NewRequest("GET",url,nil) iferr!=nil{ log.Fatal(err) } reqSpider.Header.Set("content-length","0") reqSpider.Header.Set("accept","*/*") reqSpider.Header.Set("x-requested-with","XMLHttpRequest") respSpider,err:=Client.Do(reqSpider) iferr!=nil{ log.Fatal(err) } bodyText,_:=ioutil.ReadAll(respSpider.Body) varresultResult _=json.Unmarshal(bodyText,&result) fmt.Println(i,result.Data)}
运行时间为:651.8207ms
2. 多线程爬虫
2.1 channel main函数
我们构造一个无缓冲的通道,来阻塞主进程,等待子进程的执行。
funcmain(){ url:="http://localhost:3000/api/v1/products" ch:=make(chanbool) start:=time.Now() fori:=0;i<10;i++{ goSpider(url,ch,i) } fori:=0;i<10;i++{ <-ch } elapsed:=time.Since(start) fmt.Printf("Time%s",elapsed)}
最后记得在爬虫的结束的时候,把值写入到通道中,不然会一直阻塞主进程
运行时间:187.7921ms
比之前快了非常多。
2.2 sync.WaitGroup
定义一个进程组并加10个进程
varwgsync.WaitGroup wg.Add(10)
开辟十个goruntime
fori:=0;i<10;i++{ gofunc(iint){ deferwg.Done() SpiderWaitGroup(url,i) }(i) }
阻塞主进程
wg.Wait()
结果:64.5246ms
3. 源码地址
GitHub地址:https://github.com/CocaineCong/Go-Spider-Demo
NormalStart(url)//单线程爬虫 ChannelStart(url)//Channel多线程爬虫 WaitGroupStart(url)//Wait多线程爬虫
其实多线程的两种都差不多的,只是有时候会因为机器的原因而导致一些误差。
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
Go语言如何实现并发爬虫的详细内容,希望对您有所帮助,信息来源于网络。