/*获取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(`:|\?|/|\*|<|>|"`)
        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)
}