// core processer func (self *crawler) Process(req *request.Request) { var ( ctx = self.Downloader.Download(self.Spider, req) // download page downUrl = req.GetUrl() ) if err := ctx.GetError(); err != nil { // 返回是否作为新的失败请求被添加至队列尾部 if self.Spider.DoHistory(req, false) { // 统计失败数 cache.PageFailCount() } // 提示错误 logs.Log.Error(" * Fail [download][%v]: %v\n", downUrl, err) return } defer func() { if err := recover(); err != nil { if activeStop, _ := err.(string); activeStop == spider.ACTIVE_STOP { return } // 返回是否作为新的失败请求被添加至队列尾部 if self.Spider.DoHistory(req, false) { // 统计失败数 cache.PageFailCount() } // 提示错误 logs.Log.Error(" * Panic [process][%v]: %v\n", downUrl, err) } }() // 过程处理,提炼数据 ctx.Parse(req.GetRuleName()) // 处理成功请求记录 self.Spider.DoHistory(req, true) // 统计成功页数 cache.PageSuccCount() // 提示抓取成功 logs.Log.Informational(" * Success: %v\n", downUrl) // 该条请求文本结果存入pipeline for _, item := range ctx.PullItems() { self.Pipeline.CollectData(item) } // 该条请求文件结果存入pipeline for _, f := range ctx.PullFiles() { self.Pipeline.CollectFile(f) } // 释放ctx准备复用 spider.PutContext(ctx) }
// core processer func (self *crawler) Process(req *request.Request) { var ( downUrl = req.GetUrl() sp = self.Spider ) defer func() { if p := recover(); p != nil { if sp.IsStopping() { // println("Process$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$") return } // 返回是否作为新的失败请求被添加至队列尾部 if sp.DoHistory(req, false) { // 统计失败数 cache.PageFailCount() } // 提示错误 stack := make([]byte, 4<<10) //4KB length := runtime.Stack(stack, true) start := bytes.Index(stack, []byte("/src/runtime/panic.go")) stack = stack[start:length] start = bytes.Index(stack, []byte("\n")) + 1 stack = stack[start:] if end := bytes.Index(stack, []byte("\ngoroutine ")); end != -1 { stack = stack[:end] } stack = bytes.Replace(stack, []byte("\n"), []byte("\r\n"), -1) logs.Log.Error(" * Panic [process][%s]: %s\r\n[TRACE]\r\n%s", downUrl, p, stack) } }() var ctx = self.Downloader.Download(sp, req) // download page if err := ctx.GetError(); err != nil { // 返回是否作为新的失败请求被添加至队列尾部 if sp.DoHistory(req, false) { // 统计失败数 cache.PageFailCount() } // 提示错误 logs.Log.Error(" * Fail [download][%v]: %v\n", downUrl, err) return } // 过程处理,提炼数据 ctx.Parse(req.GetRuleName()) // 该条请求文件结果存入pipeline for _, f := range ctx.PullFiles() { if self.Pipeline.CollectFile(f) != nil { break } } // 该条请求文本结果存入pipeline for _, item := range ctx.PullItems() { if self.Pipeline.CollectData(item) != nil { break } } // 处理成功请求记录 sp.DoHistory(req, true) // 统计成功页数 cache.PageSuccCount() // 提示抓取成功 logs.Log.Informational(" * Success: %v\n", downUrl) // 释放ctx准备复用 spider.PutContext(ctx) }