// core processer func (self *crawler) Process(req *context.Request) { // 声明response var resp *context.Response defer func() { if err := recover(); err != nil { // do not affect other if strerr, ok := err.(string); ok { reporter.Log.Println(strerr) } else { reporter.Log.Println("Process error:", err) } } }() // reporter.Log.Println("**************断点 1 ***********") // download page for i := 0; i < 3; i++ { self.sleep() resp = self.Downloader.Download(req) if resp.IsSucc() { // if fail retry 3 times break } } // reporter.Log.Println("**************断点 2 ***********") if !resp.IsSucc() { // if fail do not need process return } // reporter.Log.Println("**************断点 3 ***********") // 过程处理,提炼数据 self.Spider.GoRule(resp) // reporter.Log.Println("**************断点 5 ***********") // 该条请求结果存入pipeline datas := resp.GetItems() for i, count := 0, len(datas); i < count; i++ { self.Pipeline.Collect( resp.GetRuleName(), //DataCell.RuleName datas[i], //DataCell.Data resp.GetUrl(), //DataCell.Url resp.GetParent(), //DataCell.ParentUrl time.Now().Format("2006-01-02 15:04:05"), ) } // reporter.Log.Println("**************断点 end ***********") }
// 获取任务规则采集语义字段 func (self *Spider) GetOutFeild(resp *context.Response, index int) string { return self.RuleTree.Nodes[resp.GetRuleName()].OutFeild[index] }
// 根据响应流运行指定解析规则 func (self *Spider) GoRule(resp *context.Response) { self.RuleTree.Nodes[resp.GetRuleName()].ParseFunc(self, resp) }