欢迎光临
我们一直在努力

go语言学习例子No.19-多页面单任务爬虫2

继上一个例子改成简单的并发,使用WaitGroup,开了100个协程但是感觉不够快,不知道为什么。。。

只要改engine.go里的就好了

package engine

import (
	"fmt"
	"log"
	"runtime"
	"sync"
	"time"

	"crawler0.7/fetcher"
	"crawler0.7/parser"
)

func Run(seed parser.Request) { //参数是一个种子
	var requests []parser.Request     //新建一个队列接收种子
	requests = append(requests, seed) //接收参数传来的第一个种子
	runtime.GOMAXPROCS(runtime.NumCPU())
	start := time.Now()
	wg := sync.WaitGroup{}
	count := 0
	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func() {
			for len(requests) > 0 { //如果种子不位0
				r := requests[0]                      //取第一个种子
				requests = requests[1:]               //截掉第一个种子
				contents, err := fetcher.Fetch(r.Url) //开始爬取对应种子的页面
				if err != nil {
					log.Printf("Fetching %s error!", r.Url)
					continue //如果获取失败就继续下一个种子
				}
				parserResult := r.ParserFunc(contents)                //队列结构的函数提取结果
				requests = append(requests, parserResult.Requests...) //这里可以获取到很多url加到队列中
				for _, item := range parserResult.Items {
					fmt.Printf("%s \n", item) //打印队列里的项目
				}
				count = count + 1
				fmt.Printf("第%d个页面, 获取到%d条信息, time:%.2fs\n", count, len(parserResult.Items), time.Since(start).Seconds())

			}
			wg.Done()
		}()

	}
	wg.Wait()

}
 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:家里蹲的狐狸 » go语言学习例子No.19-多页面单任务爬虫2

分享到: 生成海报
avatar

热门文章

评论 抢沙发

  • QQ号
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活