Golang コードを書き始めた

リファレンスを参照しながら少しずつ作りはじめてる

スクレイピング系のプログラムを作ることにした。
とりま、main.goだけでいく。今のところ。structの分離とかはおいおいやっていけば良いかなと。
rubyで書いていたコードのgo移植なので細かいdomの確認とかはrubyのものが流用できるので結構純粋にGolangだけの取り組みなので良い題材かなと
初めてのGoのプログラミングだけど1時間ぐらいで骨子が見えてきているのはなかなか良いペースだと自画自賛
やっぱ書かないと身につかないね。

package main

/*
実装方針
とりまDB登録とかしちゃうのはやめておいて、
logger作るのはやめておいて
JSONから設定読み込んで出力するとか
goqueryで一回叩いてみるとか、その辺を2017/06/10はするところまで

チャンネルとかデータ構造とかは2017/06/11から少しずつやっていけばよろし。
=>ちょっとやりはじめてる
*/

import (
	f "fmt"
	"os"
	"strings"
	"encoding/json"

	"github.com/PuerkitoBio/goquery"
)

const StartURL = "http://youtubeanisoku1.blog106.fc2.com/"
const Configfile = "config.json"
const (
	KOUSINPAGE int = iota
	KOBETUPAGE
	HIMADOSEARCH
	HIMADOVIDEO
)

type Config struct {
	DonloadDir  string `json:"downloaddir"`
	DBFILE      string `json:"dbfile"`
	TITLEREGEXP string `json:"title_regexp"`
}
var cfg Config

type JOB struct {
	JOBKIND int
	URL     string
}

// チャンネル
var JobCh chan *JOB

// コンフィグを読み出す
func loadConfig() (*Config, error) {
	f, err := os.Open(Configfile)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	err = json.NewDecoder(f).Decode(&cfg)
	return &cfg, err
}

// ディスパッチャー
func dispatcher(ch <-chan *JOB) {
	for {
		job := <-ch
		f.Println(job)
	}
}

// 本体
func Run() int {
	// コンフィグ読み出し
	cfg, err := loadConfig()
	if err != nil {
		f.Println("config load error", err)
		return 1
	}
	f.Println(cfg)

	// JOBのチャンネル
	JobCh = make(chan *JOB)
	go dispatcher(JobCh)

	// 初期キック
	doc, err := goquery.NewDocument(StartURL)
	if err != nil {
		f.Println("url scraping fail:", StartURL)
		return 1
	}
	doc.Find(".Top_info div ul li a").Each(func(_ int, s *goquery.Selection) {
		title, _ := s.Attr("title")
		if strings.Contains(title, "更新状況") {
			url, _ := s.Attr("href")
			JobCh <- &JOB{KOUSINPAGE, url}
		}
	})

	return 0
}

func main() {
	retcode := Run()
	os.Exit(retcode)
}