/*获取URL范例*/
/*
Find 查找获取当前匹配的每个元素的后代
Eq 选择第几个
Attr 获取对应的标签属性
AttrOr 获取对应的标签属性。这个可以设置第二个参数。获取的默认值 如果获取不到默认调用对应默认值
Each 遍历每一个元素
Text 获取当前对应的文本
Html 获取当前对象的标签
AddClass 添加 class 不过用来抓取有点鸡肋不知道为何要写这个
Children 返回所有子元素
Filter 过滤标签元素
Prev 获取上一个元素
Next 获取下一个元素
*/
package main

import (     "fmt"     "log"     "os"     "regexp"     "strconv"

    "github.com/PuerkitoBio/goquery" )

func getdata(ins int, ch chan int) {     url := ""     if ins == 1 {         url = "https://colobu.com/categories/Go"     } else {         url = "https://colobu.com/categories/Go/page/" + strconv.Itoa(ins) + "/"     }     doc, err := goquery.NewDocument(url)     if err != nil {         log.Fatal(err)     }     //  <a class="article-title" href="/2019/06/01/packet-capture-injection-and-analysis-gopacket/">[译]利用 gopackage 进行包的捕获、注入和分析</a>     doc.Find(".article-title").Each(func(i int, s *goquery.Selection) {         a,  := s.Attr("href")         text := s.Text()         a = "https://colobu.com" + a         //htmls,  := s.Html()         fmt.Println("")         fmt.Println("")

        fmt.Println("  地址:" + a)         fmt.Println("  标题:" + text)         /text = strings.ReplaceAll(text, ":", " ")         text = strings.ReplaceAll(text, "/", " ")         text = strings.ReplaceAll(text, "\", " ")         text = strings.ReplaceAll(text, "?", " ")         text = strings.ReplaceAll(text, "", " ") */         reg := regexp.MustCompile(:|\?|/|\*|&lt;|&gt;|")         tilte := reg.ReplaceAllString(text, " ")         docm, err := goquery.NewDocument(a)         if err != nil {             log.Fatal(err)         }         sstext := ""         docm.Find(".article-entry").Each(func(ii int, ss *goquery.Selection) {             sstext = ss.Text()

        })         //fmt.Println("  正文:" + sstext)         file, _ := os.OpenFile("./爬虫/第"+strconv.Itoa(ins)+"页  "+strconv.Itoa(i+1)+"篇  "+tilte+"页爬虫.txt", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0666)         defer file.Close()         file.Write([]byte(text + "\n正文:\n" + sstext + "\n\n\n"))         fmt.Println("  ---------------------------------------------------------------------------- ")

    })     ch <- ins }

func Doing(s, e int) {     ch := make(chan int)     for i := s; i <= e; i++ {         go getdata(i, ch)     }     for i := s; i <= e; i++ {         n := <-ch         fmt.Printf("第%d页爬取完毕\n", n)     } } func main() {     var start, end int     fmt.Println("输入起始页")     fmt.Scan(&start)     fmt.Println("输入终止页")     fmt.Scan(&end)     Doing(start, end) }