YXK 发表于 2021-7-20 10:59

GO语言 COLLY库初学,实现一个图片网站的采集,还没写完!

package main

import (
      "encoding/csv"
      "fmt"
      "github.com/PuerkitoBio/goquery"
      "github.com/gocolly/colly"
      "log"
      "os"
      "time"
)


func main() {

      fName := "图片.csv"
      file, err := os.Create(fName)
      if err != nil {
                log.Fatalf("无法找到文件 %q: %s\n", fName, err)
                return
      }
      defer file.Close()
      writer := csv.NewWriter(file)
      defer writer.Flush()
      // 写到运行目录CSV文件-首行文本
      writer.Write([]string{"详情界面地址"})

      //采集目标网址
      url := "https://www.ivsky.com/tupian/"

      //创建收集器
      c := colly.NewCollector(
                //设置选项
                colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"),
                )


      // 设置抓取频率限制
      c.Limit(&colly.LimitRule{
                DomainGlob:"*",
                RandomDelay: 5 * time.Second, // 随机延迟
                Parallelism: 2, //并发数
      })

      //详情页
      c.OnHTML("ul.ali", func(e *colly.HTMLElement) {
                // 依次遍历所有的li节点
                e.DOM.Find("li").Each(func(i int, s *goquery.Selection) {
                        href, found := s.Find("div.il_img > a").Attr("href")
                        // 如果找到了详情页,则继续下一步的处理
                        if found {
                              //调试输出绝对地址
                              log.Println(e.Request.AbsoluteURL(href))

                              //把得到的详情页地址写入CSV文件
                              writer.Write([]string{e.Request.AbsoluteURL(href)})
                              //调试输出相对地址
                              //log.Println(href)
                        }
                })
      })

      //所有页码
      c.OnHTML("div.pagelist", func(e *colly.HTMLElement) {
                href, found := e.DOM.Find("a.page-next").Attr("href")
                // 如果有下一页,则继续访问
                if found {
                        //继续访问绝对地址的下一页
                        e.Request.Visit(e.Request.AbsoluteURL(href))
                }
      })


      //请求发起之前输出请求地址
      c.OnRequest(func(r *colly.Request) {
                fmt.Println("Visiting", r.URL)
      })

      //访问采集目标
      c.Visit(url)

}
页: [1]
查看完整版本: GO语言 COLLY库初学,实现一个图片网站的采集,还没写完!