// 提交用户输入并开始运行 func Start() { // 初始化蜘蛛列表,返回长度 count := InitSpiders() // 初始化config参数 config.InitDockerParam(Input.DockerCap) if Input.ThreadNum == 0 { // 纠正协程数 Input.ThreadNum = 1 } config.ThreadNum = Input.ThreadNum config.OutType = Input.OutType config.StartTime = time.Now() config.ReqSum = 0 // 初始化资源队列 scheduler.Init(Input.ThreadNum) // 初始化爬虫队列 CrawlerNum := config.CRAWLER_CAP if count < config.CRAWLER_CAP { CrawlerNum = count } crawler.CQ.Init(uint(CrawlerNum)) // 开启报告 reporter.Log.Run() reporter.Log.Printf("\n执行任务总数(任务数[*关键词数])为 %v 个...\n", count) reporter.Log.Printf("\n爬虫队列可容纳蜘蛛 %v 只...\n", CrawlerNum) reporter.Log.Printf("\n并发协程最多 %v 个……\n", Input.ThreadNum) reporter.Log.Printf("\n随机停顿时间为 %v~%v ms ……\n", Input.BaseSleeptime, Input.BaseSleeptime+Input.RandomSleepPeriod) reporter.Log.Printf("*********************************************开始抓取,请耐心等候*********************************************") // 任务执行 status = RUN go GoRun(count) }
// 提交用户输入并开始运行 func SubmitAndRun() { // 纠正协程数 if Input.ThreadNum == 0 { Input.ThreadNum = 1 } // 初始化config参数 config.InitDockerParam(Input.DockerCap) config.ThreadNum = Input.ThreadNum config.OutType = Input.OutType config.StartTime = time.Now() config.ReqSum = 0 // 清空下载页面计数 count := InitSpiders() // 初始化资源队列 scheduler.Init(Input.ThreadNum) // 初始化爬行队列 CrawlerNum := config.CRAWLER_CAP if count < config.CRAWLER_CAP { CrawlerNum = count } config.CrawlerQueue.Init(CrawlerNum) reporter.Log.Printf("\n执行任务总数(任务数[*关键词数])为 %v 个...\n", count) reporter.Log.Printf("\n爬行队列可容纳蜘蛛 %v 只...\n", CrawlerNum) reporter.Log.Printf("\n并发协程最多 %v 个……\n", Input.ThreadNum) reporter.Log.Printf("\n随机停顿时间为 %v~%v ms ……\n", Input.BaseSleeptime, Input.BaseSleeptime+Input.RandomSleepPeriod) reporter.Log.Printf("*********************************************开始抓取,请耐心等候*********************************************") // 任务执行 go func(count int) { // 由现有爬行队列转换目标所需爬行队列,注意爬行队列实例还是原来的 for s, add := 0, config.CrawlerQueue.Exchange(CrawlerNum); s < add; s++ { config.CrawlerQueue.Push(crawler.New()) } for i := 0; i < count; i++ { // 等待从爬行队列取出空闲蜘蛛 oneCrawler := config.CrawlerQueue.Pull().(crawler.Crawler) // 并发执行爬行任务 go func(i int, c crawler.Crawler) { // 执行并返回结果消息 c.Init(spider.SpiderList[i]).Start() // 任务结束后回收该蜘蛛 config.CrawlerQueue.Push(c) }(i, oneCrawler) } // 监控结束任务 sum := 0 //数据总数 for i := 0; i < count; i++ { s := <-config.ReportChan reporter.Log.Printf("[结束报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条,用时 %v 分钟!!!\n", s.SpiderName, s.Keyword, s.Num, s.Time) if slen, err := strconv.Atoi(s.Num); err == nil { sum += slen } } reporter.Log.Printf("*****************************!!本次抓取合计 %v 条数据,下载页面 %v 个,耗时:%.5f 分钟!!***************************", sum, config.ReqSum, time.Since(config.StartTime).Minutes()) // 按钮状态控制 toggleSpecialModePB.SetText("开始抓取") toggleSpecialModePB.SetEnabled(true) }(count) }