// Offline 模式下中途终止任务 func (self *Logic) Stop() { status.Crawl = status.STOP Pholcus.Crawls.Stop() scheduler.Sdl.Stop() reporter.Log.Stop() // 总耗时 takeTime := time.Since(cache.StartTime).Minutes() // 打印总结报告 log.Println(` *********************************************************************************************************************************** `) log.Printf(" * ") log.Printf(" * !!任务取消:下载页面 %v 个,耗时:%.5f 分钟!!", cache.GetPageCount(0), takeTime) log.Printf(" * ") log.Println(` *********************************************************************************************************************************** `) // 标记结束 self.finish <- true }
// Offline 模式下中途终止任务 func (self *Logic) Stop() { self.status = status.STOP self.CrawlPool.Stop() self.Scheduler.Stop() // 总耗时 takeTime := time.Since(cache.StartTime).Minutes() // 打印总结报告 logs.Log.Informational(` *********************************************************************************************************************************** `) logs.Log.Informational(" * ") logs.Log.Notice(" * !!任务取消:下载页面 %v 个,耗时:%.5f 分钟!!", cache.GetPageCount(0), takeTime) logs.Log.Informational(" * ") logs.Log.Informational(` *********************************************************************************************************************************** `) self.LogRest() // 标记结束 self.finishOnce.Do(func() { close(self.finish) }) }
// Offline 模式下中途终止任务 func (self *Logic) Stop() { self.status = status.STOP self.Node.Crawls.Stop() scheduler.Sdl.Stop() // 总耗时 takeTime := time.Since(cache.StartTime).Minutes() // 打印总结报告 log.Println(` *********************************************************************************************************************************** `) log.Printf(" * ") log.Printf(" * !!任务取消:下载页面 %v 个,耗时:%.5f 分钟!!", cache.GetPageCount(0), takeTime) log.Printf(" * ") log.Println(` *********************************************************************************************************************************** `) reporter.Log.Stop() // 标记结束 self.finishOnce.Do(func() { close(self.finish) }) }
// 任务执行 func (self *Logic) goRun(count int) { // 执行任务 var i int for i = 0; i < count && self.Status() != status.STOP; i++ { pause: if self.IsPause() { time.Sleep(1e9) goto pause } // 从爬行队列取出空闲蜘蛛,并发执行 c := self.CrawlPool.Use() if c != nil { go func(i int, c crawl.Crawler) { // 执行并返回结果消息 c.Init(self.SpiderQueue.GetByIndex(i)).Start() // 任务结束后回收该蜘蛛 self.CrawlPool.Free(c) }(i, c) } } // 监控结束任务 for ii := 0; ii < i; ii++ { s := <-cache.ReportChan if (s.DataNum == 0) && (s.FileNum == 0) { continue } logs.Log.Informational(" * ") switch { case s.DataNum > 0 && s.FileNum == 0: logs.Log.App(" * [任务小计:%s | KEYIN:%s] 共采集数据 %v 条,用时 %v!\n", s.SpiderName, s.Keyin, s.DataNum, s.Time) case s.DataNum == 0 && s.FileNum > 0: logs.Log.App(" * [任务小计:%s | KEYIN:%s] 共下载文件 %v 个,用时 %v!\n", s.SpiderName, s.Keyin, s.FileNum, s.Time) default: logs.Log.App(" * [任务小计:%s | KEYIN:%s] 共采集数据 %v 条 + 下载文件 %v 个,用时 %v!\n", s.SpiderName, s.Keyin, s.DataNum, s.FileNum, s.Time) } self.sum[0] += s.DataNum self.sum[1] += s.FileNum } // 总耗时 self.takeTime = time.Since(cache.StartTime) var prefix = func() string { if self.Status() == status.STOP { return "任务中途取消:" } return "本次" }() // 打印总结报告 logs.Log.Informational(" * ") logs.Log.Informational(` *********************************************************************************************************************************** `) logs.Log.Informational(" * ") switch { case self.sum[0] > 0 && self.sum[1] == 0: logs.Log.App(" * —— %s合计采集【数据 %v 条】, 实爬URL【成功 %v 页 + 失败 %v 页 = 合计 %v 页】,耗时【%v】 ——", prefix, self.sum[0], cache.GetPageCount(1), cache.GetPageCount(-1), cache.GetPageCount(0), self.takeTime) case self.sum[0] == 0 && self.sum[1] > 0: logs.Log.App(" * —— %s合计采集【文件 %v 个】, 实爬URL【成功 %v 页 + 失败 %v 页 = 合计 %v 页】,耗时【%v】 ——", prefix, self.sum[1], cache.GetPageCount(1), cache.GetPageCount(-1), cache.GetPageCount(0), self.takeTime) case self.sum[0] == 0 && self.sum[1] == 0: logs.Log.App(" * —— %s无采集结果,实爬URL【成功 %v 页 + 失败 %v 页 = 合计 %v 页】,耗时【%v】 ——", prefix, cache.GetPageCount(1), cache.GetPageCount(-1), cache.GetPageCount(0), self.takeTime) default: logs.Log.App(" * —— %s合计采集【数据 %v 条 + 文件 %v 个】,实爬URL【成功 %v 页 + 失败 %v 页 = 合计 %v 页】,耗时【%v】 ——", prefix, self.sum[0], self.sum[1], cache.GetPageCount(1), cache.GetPageCount(-1), cache.GetPageCount(0), self.takeTime) } logs.Log.Informational(" * ") logs.Log.Informational(` *********************************************************************************************************************************** `) // 单机模式并发运行,需要标记任务结束 if self.AppConf.Mode == status.OFFLINE { self.LogRest() self.finishOnce.Do(func() { close(self.finish) }) } }
// 任务执行 func (self *Logic) goRun(count int) { for i := 0; i < count && self.status != status.STOP; i++ { if self.status == status.PAUSE { time.Sleep(1e9) continue } // 从爬行队列取出空闲蜘蛛,并发执行 c := self.CrawlPool.Use() if c != nil { go func(i int, c crawl.Crawler) { // 执行并返回结果消息 c.Init(self.SpiderQueue.GetByIndex(i)).Start() // 任务结束后回收该蜘蛛 self.CrawlPool.Free(c) }(i, c) } } // 监控结束任务 sum := [2]uint{} //数据总数 for i := 0; i < count; i++ { s := <-cache.ReportChan if (s.DataNum == 0) && (s.FileNum == 0) { continue } logs.Log.Informational(" * ") switch { case s.DataNum > 0 && s.FileNum == 0: logs.Log.Notice(" * [输出报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.DataNum, s.Time) case s.DataNum == 0 && s.FileNum > 0: logs.Log.Notice(" * [输出报告 -> 任务:%v | 关键词:%v] 共下载文件 %v 个,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.FileNum, s.Time) default: logs.Log.Notice(" * [输出报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条 + 下载文件 %v 个,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.DataNum, s.FileNum, s.Time) } logs.Log.Informational(" * ") sum[0] += s.DataNum sum[1] += s.FileNum } // 总耗时 takeTime := time.Since(cache.StartTime).Minutes() // 打印总结报告 logs.Log.Informational(` *********************************************************************************************************************************** `) logs.Log.Informational(" * ") switch { case sum[0] > 0 && sum[1] == 0: logs.Log.Notice(" * —— 本次合计抓取 %v 条数据,下载页面 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum[0], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) case sum[0] == 0 && sum[1] > 0: logs.Log.Notice(" * —— 本次合计抓取 %v 个文件,下载页面 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum[1], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) default: logs.Log.Notice(" * —— 本次合计抓取 %v 条数据 + %v 个文件,下载网页 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum[0], sum[1], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) } logs.Log.Informational(" * ") logs.Log.Informational(` *********************************************************************************************************************************** `) // 单机模式并发运行,需要标记任务结束 if self.AppConf.Mode == status.OFFLINE { self.status = status.STOP self.finishOnce.Do(func() { close(self.finish) }) } }
// 任务执行 func (self *Logic) goRun(count int) { for i := 0; i < count && self.Status() != status.STOP; i++ { wait: if self.Status() == status.PAUSE { time.Sleep(1e9) goto wait } // 从爬行队列取出空闲蜘蛛,并发执行 c := self.CrawlPool.Use() if c != nil { go func(i int, c crawl.Crawler) { // 执行并返回结果消息 c.Init(self.SpiderQueue.GetByIndex(i)).Start() // 任务结束后回收该蜘蛛 self.CrawlPool.Free(c) }(i, c) } } // 监控结束任务 for i := 0; i < count && self.Status() != status.STOP; i++ { s := <-cache.ReportChan if (s.DataNum == 0) && (s.FileNum == 0) { continue } logs.Log.Informational(" * ") switch { case s.DataNum > 0 && s.FileNum == 0: logs.Log.Notice(" * [输出报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.DataNum, s.Time) case s.DataNum == 0 && s.FileNum > 0: logs.Log.Notice(" * [输出报告 -> 任务:%v | 关键词:%v] 共下载文件 %v 个,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.FileNum, s.Time) default: logs.Log.Notice(" * [输出报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条 + 下载文件 %v 个,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.DataNum, s.FileNum, s.Time) } logs.Log.Informational(" * ") self.sum[0] += s.DataNum self.sum[1] += s.FileNum } // 总耗时 self.takeTime = time.Since(cache.StartTime).Minutes() var prefix = func() string { if self.Status() == status.STOP { return "任务中途取消:" } return "本次" }() // 打印总结报告 logs.Log.Informational(` *********************************************************************************************************************************** `) logs.Log.Informational(" * ") switch { case self.sum[0] > 0 && self.sum[1] == 0: logs.Log.Notice(" * —— %s合计输出 %v 条数据,实爬URL %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", prefix, self.sum[0], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), self.takeTime) case self.sum[0] == 0 && self.sum[1] > 0: logs.Log.Notice(" * —— %s合计输出 %v 个文件,实爬URL %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", prefix, self.sum[1], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), self.takeTime) default: logs.Log.Notice(" * —— %s合计输出 %v 条数据 + %v 个文件,实爬URL %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", prefix, self.sum[0], self.sum[1], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), self.takeTime) } logs.Log.Informational(" * ") logs.Log.Informational(` *********************************************************************************************************************************** `) // 单机模式并发运行,需要标记任务结束 if self.AppConf.Mode == status.OFFLINE { self.setStatus(status.STOP) self.LogRest() self.finishOnce.Do(func() { close(self.finish) }) } }
// 任务执行 func (self *Logic) goRun(count int) { for i := 0; i < count && status.Crawl == status.RUN; i++ { // 从爬行队列取出空闲蜘蛛,并发执行 c := Pholcus.Crawls.Use() if c != nil { go func(i int, c crawl.Crawler) { // 执行并返回结果消息 c.Init(Pholcus.Spiders.GetByIndex(i)).Start() // 任务结束后回收该蜘蛛 Pholcus.Crawls.Free(c.GetId()) }(i, c) } } // 监控结束任务 sum := [2]uint{} //数据总数 for i := 0; i < count; i++ { s := <-cache.ReportChan if (s.DataNum == 0) && (s.FileNum == 0) { continue } log.Printf(" * ") switch { case s.DataNum > 0 && s.FileNum == 0: reporter.Log.Printf(" * [输出报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.DataNum, s.Time) case s.DataNum == 0 && s.FileNum > 0: reporter.Log.Printf(" * [输出报告 -> 任务:%v | 关键词:%v] 共下载文件 %v 个,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.FileNum, s.Time) default: reporter.Log.Printf(" * [输出报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条 + 下载文件 %v 个,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.DataNum, s.FileNum, s.Time) } log.Printf(" * ") sum[0] += s.DataNum sum[1] += s.FileNum } // 总耗时 takeTime := time.Since(cache.StartTime).Minutes() // 打印总结报告 log.Println(` *********************************************************************************************************************************** `) log.Printf(" * ") switch { case sum[0] > 0 && sum[1] == 0: reporter.Log.Printf(" * —— 本次合计抓取 %v 条数据,下载页面 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum[0], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) case sum[0] == 0 && sum[1] > 0: reporter.Log.Printf(" * —— 本次合计抓取 %v 个文件,下载页面 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum[1], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) default: reporter.Log.Printf(" * —— 本次合计抓取 %v 条数据 + %v 个文件,下载网页 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum[0], sum[1], cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) } log.Printf(" * ") log.Println(` *********************************************************************************************************************************** `) // 标记结束 self.finish <- true }
// 任务执行 func (self *Logic) goRun(count int) { for i := 0; i < count && status.Crawl == status.RUN; i++ { // 从爬行队列取出空闲蜘蛛,并发执行 c := Pholcus.Crawls.Use() if c != nil { go func(i int, c crawl.Crawler) { // 执行并返回结果消息 c.Init(Pholcus.Spiders.GetByIndex(i)).Start() // 任务结束后回收该蜘蛛 Pholcus.Crawls.Free(c.GetId()) }(i, c) } } // 监控结束任务 sum := 0 //数据总数 for i := 0; i < count; i++ { s := <-cache.ReportChan log.Printf(" * ") reporter.Log.Printf(" * [结束报告 -> 任务:%v | 关键词:%v] 共输出数据 %v 条,用时 %v 分钟!\n", s.SpiderName, s.Keyword, s.Num, s.Time) log.Printf(" * ") if slen, err := strconv.Atoi(s.Num); err == nil { sum += slen } } // 总耗时 takeTime := time.Since(cache.StartTime).Minutes() // 打印总结报告 log.Println(` *********************************************************************************************************************************** `) log.Printf(" * ") reporter.Log.Printf(" * —— 本次抓取合计 %v 条数据,下载页面 %v 个(成功:%v,失败:%v),耗时:%.5f 分钟 ——", sum, cache.GetPageCount(0), cache.GetPageCount(1), cache.GetPageCount(-1), takeTime) log.Printf(" * ") log.Println(` *********************************************************************************************************************************** `) // 标记结束 self.finish <- true }