Beispiel #1
0
//主页解析
func (self *Www79xsComProcessor) mainParse(p *robot.Page) {
	//开始解析页面
	query := p.GetHtmlParser()
	query.Find(".subnav ul li a").Each(func(i int, s *goquery.Selection) {
		addr, _ := s.Attr("href")
		if addr == utils.GirlUrl {
			p.AddTargetRequest(utils.InitRequest(utils.BaseUrl+addr, map[string]string{"first": utils.GIRL}, self.urlListParse))
		} else {
			p.AddTargetRequest(utils.InitRequest(utils.BaseUrl+addr, map[string]string{"first": utils.BOY}, self.urlListParse))
		}
	})
}
Beispiel #2
0
func main() {
	start_url := utils.BaseUrl
	//加载配置文件
	settings := utils.LoadConf("conf/spider.conf")
	//获取数据库连接信息
	dbinfo, ok := settings["DBINFO"]
	if !ok {
		log.Fatalf("please insert dbinfo in spider.conf")
	}

	//爬虫初始化
	options := robot.SpiderOptions{
		TaskName:      "79xs",
		PageProcesser: process.NewWww79xsComProcessor(),
		Downloader:    downloader.NewHttpDownloader("text/html; charset=gb2312"),
		Scheduler:     scheduler.NewQueueScheduler(false),
		Pipelines:     []robot.Pipeline{pipeline.NewPipelineMySQL(dbinfo)},
		//设置资源管理器,资源池容量为100
		ResourceManage: resource.NewSpidersPool(100, nil),
	}

	sp := robot.NewSpider(options)
	//增加根url
	sp.AddRequest(utils.InitRequest(start_url, nil, nil))
	go sp.Run()
	<-utils.Stop
	sp.Close()
}
Beispiel #3
0
//获取分类页面的url list,并解析
func (self *Www79xsComProcessor) urlListParse(p *robot.Page) {
	meta := p.GetRequest().GetMeta()
	//开始解析页面
	query := p.GetHtmlParser()
	//获取尾页addr
	lastaddr, ok := query.Find("tbody a").Last().Attr("href")
	if ok {
		//解析addr
		kv := goutils.GetKVInRelaPath(lastaddr)
		//url拼接
		maxpage, _ := strconv.Atoi(kv["page"])
		for i := 1; i <= maxpage; i++ {
			page := strconv.Itoa(i)
			p.AddTargetRequest(utils.InitRequest(
				"http://www.79xs.com/Book/ShowBookList.aspx?tclassid="+kv["tclassid"]+"&page="+page,
				meta.(map[string]string),
				self.classParse))
		}
	} else {
		p.AddTargetRequest(utils.InitRequest(p.GetRequest().GetUrl(), meta.(map[string]string), self.classParse))
	}
}
Beispiel #4
0
//解析小说详情页
func (self *Www79xsComProcessor) introParse(p *robot.Page) {
	meta := p.GetRequest().GetMeta().(map[string]string)
	//开始解析页面
	query := p.GetHtmlParser()
	intro := query.Find("#info h3 p").Eq(1).Text()
	img, _ := query.Find(".img img").Attr("src")
	// 小说章节列表地址
	chaptersource, _ := query.Find(".b1 a").Attr("href")
	tmp := utils.MapCopy(meta)
	tmp["introduction"] = intro
	tmp["img"] = utils.BaseUrl + img
	tmp["chaptersource"] = utils.BaseUrl + chaptersource
	p.AddTargetRequest(utils.InitRequest(utils.BaseUrl+chaptersource, tmp, self.chaperParse))
}
Beispiel #5
0
//小说章节解析
func (self *Www79xsComProcessor) chaperParse(p *robot.Page) {
	meta := p.GetRequest().GetMeta().(map[string]string)
	//开始解析页面
	query := p.GetHtmlParser()
	query.Find(".insert_list li").Each(func(i int, s *goquery.Selection) {
		tmp := utils.MapCopy(meta)
		tmp["chapter"] = strconv.Itoa(i)
		tmp["subtitle"] = s.Find("strong a").Text()
		addr, _ := s.Find("strong a").Attr("href")
		tmp["contenturl"] = p.GetRequest().GetBaseUrl() + addr
		//检测contenturl, 如果数据库中存在,则跳过本次抓取,如果不存在则将url加入调度队列
		//这个需求有时间再做
		if len(tmp["subtitle"]) != 0 {
			p.AddTargetRequest(utils.InitRequest(tmp["contenturl"], tmp, self.contentParse))
		}
	})
}
Beispiel #6
0
func main() {
	spidername := "79xs"
	start_url := utils.BaseUrl
	//加载配置文件
	settings := utils.LoadConf("conf/spider.conf")
	//获取数据库连接信息
	dbinfo, ok := settings["DBINFO"]
	if !ok {
		log.Fatalf("please insert dbinfo in spider.conf")
	}

	//爬虫初始化
	options := robot.SpiderOptions{
		TaskName:      spidername,
		PageProcesser: process.NewWww79xsComProcessor(),
		Downloader:    downloader.NewHttpDownloader("text/html; charset=gb2312"),
		Scheduler:     scheduler.NewMysqlScheduler(spidername, dbinfo),
		//Scheduler: scheduler.NewQueueScheduler(false),
		Pipelines: []robot.Pipeline{pipeline.NewPipelineMySQL(dbinfo)},
		//设置资源管理器,资源池容量为100
		ResourceManage: resource.NewSpidersPool(100, nil),
	}

	sp := robot.NewSpider(options)

	init := false
	for _, arg := range os.Args {
		if arg == "--init" {
			init = true
			break
		}
	}

	if init {
		//增加根url
		sp.AddRequest(utils.InitRequest(start_url, map[string]string{
			"handler": "mainParse",
		}))
		log.Println("重新开始爬")
	} else {
		log.Println("继续爬")
	}
	go sp.Run()
	<-utils.Stop
	sp.Close()
}
Beispiel #7
0
//分类列表解析
func (self *Www79xsComProcessor) classParse(p *robot.Page) {
	meta := p.GetRequest().GetMeta().(map[string]string)
	//开始解析页面
	query := p.GetHtmlParser()
	query.Find("div .yl_nr_lt2 ul").Each(func(i int, s *goquery.Selection) {
		//获取二级分类, 小说标题,作者
		second := s.Find(".ynl2 a").Text()
		title := s.Find(".ynl3 a").Eq(1).Text()
		author := s.Find(".ynl6 a").Text()
		novelsource := utils.BaseUrl + func() string {
			addr, _ := s.Find(".ynl3 a").Eq(1).Attr("href")
			return addr
		}()
		tmp := make(map[string]string)
		tmp["first"] = meta["first"]
		tmp["second"] = second
		tmp["title"] = title
		tmp["author"] = author
		tmp["novelsource"] = novelsource
		p.AddTargetRequest(utils.InitRequest(novelsource, tmp, self.introParse))
	})
}