[Golang] 纯文本查看 复制代码 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)
}
|