Esempio n. 1
0
// 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 ***********")
}
Esempio n. 2
0
// 获取任务规则采集语义字段
func (self *Spider) GetOutFeild(resp *context.Response, index int) string {
	return self.RuleTree.Nodes[resp.GetRuleName()].OutFeild[index]
}
Esempio n. 3
0
// 根据响应流运行指定解析规则
func (self *Spider) GoRule(resp *context.Response) {
	self.RuleTree.Nodes[resp.GetRuleName()].ParseFunc(self, resp)
}