├── README.md └── main.go /README.md: -------------------------------------------------------------------------------- 1 | # iraq-reports-downloader 2 | 3 | イラク日報ダウンローダ 4 | 5 | ## Usage 6 | 7 | ``` 8 | $ iraq-reports-downloader 9 | ``` 10 | 11 | ## Installation 12 | 13 | ``` 14 | $ go get github.com/mattn/iraq-reports-downloader 15 | ``` 16 | 17 | ## License 18 | 19 | MIT 20 | 21 | ## Author 22 | 23 | Yasuhiro Matsumoto (a.k.a. mattn) 24 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "io" 5 | "log" 6 | "net/http" 7 | "os" 8 | "path" 9 | "strings" 10 | "sync" 11 | 12 | "github.com/PuerkitoBio/goquery" 13 | ) 14 | 15 | func download(url string) error { 16 | resp, err := http.DefaultClient.Get(url) 17 | if err != nil { 18 | return err 19 | } 20 | defer resp.Body.Close() 21 | 22 | filename := path.Base(url) 23 | f, err := os.Create(filename) 24 | if err != nil { 25 | return err 26 | } 27 | defer f.Close() 28 | 29 | _, err = io.Copy(f, resp.Body) 30 | if err != nil { 31 | return err 32 | } 33 | return nil 34 | } 35 | 36 | func worker(q chan string, wg *sync.WaitGroup) { 37 | defer wg.Done() 38 | 39 | for { 40 | url, ok := <-q 41 | if !ok { 42 | return 43 | } 44 | if err := download(url); err == nil { 45 | log.Printf("downloaded %s", url) 46 | } else { 47 | log.Println(err) 48 | } 49 | } 50 | } 51 | 52 | func main() { 53 | doc, err := goquery.NewDocument("https://www.asahi.com/articles/ASL4J669JL4JUEHF016.html") 54 | if err != nil { 55 | log.Fatal(err) 56 | } 57 | 58 | q := make(chan string) 59 | 60 | var wg sync.WaitGroup 61 | wg.Add(5) 62 | for i := 0; i < 5; i++ { 63 | go worker(q, &wg) 64 | } 65 | 66 | doc.Find(".PlainMod .title a").Each(func(n int, qs *goquery.Selection) { 67 | if a, ok := qs.Attr("href"); ok && strings.HasSuffix(a, ".pdf") { 68 | q <- a 69 | } 70 | }) 71 | 72 | close(q) 73 | wg.Wait() 74 | } 75 | --------------------------------------------------------------------------------