crawlb

package module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 11, 2023 License: MIT Imports: 20 Imported by: 0

README

go-crawlb

GoDev

go-crawl パッケージは Web サイトの巡回ユーティリティを提供します.

Usage

import "github.com/17e10/go-crawlb"

cl, err := crawlb.NewClient(ctx, 2 * time.Second, cacheDir, numTx)
cl.NewTransaction()
resp, err := cl.Get("https://google.com/")
defer resp.Body.Close()

License

This software is released under the MIT License, see LICENSE.

Author

17e10

Documentation

Overview

crawl パッケージは Web サイトの巡回ユーティリティを提供します.

Index

Examples

Constants

View Source
const SkipAll notifyb.Notify = "skip all"

Variables

This section is empty.

Functions

func Download

func Download(cl *Client, url string) (tmpname string, err error)

Download は指定された URL からファイルを取得し 一時ファイルに保存します.

Example
package main

import (
	"fmt"
	"os"

	crawl "github.com/17e10/go-crawlb"
)

var cl *crawl.Client

func main() {
	tmpname, err := crawl.Download(cl, "https://example.com/dl/x")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer os.Remove(tmpname) // It is a temporary file, so it will be deleted when finished.

	f, err := os.Open(tmpname)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()
}
Output:

func ScanCsv

func ScanCsv(r io.Reader, enc encoding.Encoding, rower ReadCsvRower) error

ScanCsv は CSV を読み込んでレコードに分解します.

CSV の各行毎にカラムを []string に分解し rower.ReadRow を呼び出します. 全ての行をスキャンし終わると rower.Done を呼び出します.

rower.ReadRow が SkipAll を返すと以降のスキャンをスキップします. この場合 rower.Done を呼び出しません.

ScanCsv は golang.org/x/text/transform を使用して文字コードの変換をサポートします. enc に japanese.ShiftJIS などを渡すと指定したエンコーディングで変換します. enc に nil を渡すと変換せず UTF-8 として処理します.

Example
package main

import (
	"fmt"
	"os"

	crawl "github.com/17e10/go-crawlb"
	"golang.org/x/text/encoding/japanese"
)

type CsvReader struct{}

func (*CsvReader) ReadRow(i int, row []string) error {
	fmt.Printf("len: %d\n", len(row))
	return nil
}

func (*CsvReader) Done() error {
	fmt.Println("done")
	return nil
}

func main() {
	f, err := os.Open("testfiles/sjis.csv")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	var cr CsvReader
	err = crawl.ScanCsv(f, japanese.ShiftJIS, &cr)
	if err != nil {
		fmt.Println(err)
		return
	}
}
Output:

func ScanZip

func ScanZip(name string, filer ReadZipFiler) error

ScanZip は Zip ファイルの内容をスキャンします.

ファイルを見つける毎に filer.ReadFile を呼び出します. 全てのファイルをスキャンし終わると filer.Done を呼び出します.

filer.ReadFile が SkipAll を返すと以降のスキャンをスキップします. この場合 filer.Done を呼び出しません.

Example
package main

import (
	"archive/zip"
	"fmt"

	crawl "github.com/17e10/go-crawlb"
)

type ZipReader struct{}

func (*ZipReader) ReadFile(file *zip.File) error {
	fmt.Println(file.Name)

	f, err := file.Open()
	if err != nil {
		return err
	}
	defer f.Close()

	return nil
}

func (*ZipReader) Done() error {
	fmt.Println("done")
	return nil
}

func main() {
	var zr ZipReader
	err := crawl.ScanZip("example.zip", &zr)
	if err != nil {
		fmt.Println(err)
	}
}
Output:

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client はキャッシュ機構とアクセス間隔制御機構を持つ HTTP クライアントです.

Client はサーバに負荷を掛けないよう指定した間隔を空けてアクセスします.

Client が持つキャッシュ機構はキャッシュディレクトリに トランザクション単位でアクセス結果をファイル保存します. トランザクションは世代管理していて複数世代を保持することができます. この仕組みによって障害発生時を再現したり サーバに負担を掛けずに開発・テストができます. トランザクションは最大世代数を超えると自動的に破棄されます.

func NewClient

func NewClient(ctx context.Context, d time.Duration, cacheDir string, numTx int) (*Client, error)

NewClient は新しい Client を作成します.

サーバへのアクセス間隔は d で指定します. キャッシュ機構のディレクトリやトランザクションの最大世代数はそれぞれ cacheDir, numTx で指定します.

func (*Client) Do

func (cl *Client) Do(req *http.Request) (*http.Response, error)

Do は http.Request を送信し http.Response を返します. もしトランザクションにキャッシュがあれば キャッシュされた結果を返します.

func (*Client) Get

func (cl *Client) Get(url string) (resp *http.Response, err error)

Get は指定された URL に対して GET を発行します.

func (*Client) Head

func (cl *Client) Head(url string) (resp *http.Response, err error)

Head は指定された URL に対して HEAD を発行します.

func (*Client) LastTransaction

func (cl *Client) LastTransaction() error

LastTransaction は前回のトランザクションを再開します.

func (*Client) NewTransaction

func (cl *Client) NewTransaction() error

NewTransaction は新しいトランザクションを開始し世代を切り替えます.

func (*Client) Post

func (cl *Client) Post(url, contentType string, body io.Reader) (resp *http.Response, err error)

Post は指定された URL に対して POST を発行します.

body をフォーム形式や JSON 形式で送信する場合 それぞれ PostForm, PostJson を利用するとより簡単です.

func (*Client) PostForm

func (cl *Client) PostForm(url string, data url.Values) (resp *http.Response, err error)

PostForm はペイロードをフォーム形式で POST を発行します.

func (*Client) PostJson

func (cl *Client) PostJson(url string, data any) (resp *http.Response, err error)

PostJson はペイロードを JSON 形式で POST を発行します.

func (*Client) SetTransaction

func (cl *Client) SetTransaction(name string) error

SetTransaction は指定したトランザクションを使用します.

type ReadCsvRower

type ReadCsvRower interface {
	ReadRow(i int, row []string) error
	Done() error
}

ReadCsvRower は ScanCsv の結果を受け取るインターフェイスです.

type ReadCsvRowerFunc

type ReadCsvRowerFunc func(int, []string) error

ReadCsvRowerFunc は通常の関数を ReadCsvRower に変換するアダプタです.

func (ReadCsvRowerFunc) Done

func (fn ReadCsvRowerFunc) Done() error

Done は fn(-1, nil) を呼び出します.

func (ReadCsvRowerFunc) ReadRow

func (fn ReadCsvRowerFunc) ReadRow(i int, row []string) error

ReadRow は fn(i, row) を呼び出します.

type ReadZipFiler

type ReadZipFiler interface {
	ReadFile(file *zip.File) error
	Done() error
}

ReadZipFiler は ScanZip の結果を受け取るインターフェイスです.

type ReadZipFilerFunc

type ReadZipFilerFunc func(*zip.File) error

ReadZipFilerFunc は通常の関数を ReadZipFiler に変換するアダプタです.

func (ReadZipFilerFunc) Done

func (fn ReadZipFilerFunc) Done() error

Done は fn(nil) を呼び出します.

func (ReadZipFilerFunc) ReadFile

func (fn ReadZipFilerFunc) ReadFile(file *zip.File) error

ReadFile は fn(file) を呼び出します.

type TestEvents

type TestEvents []string

func (*TestEvents) Add

func (ev *TestEvents) Add(a ...any)

func (*TestEvents) Addf

func (ev *TestEvents) Addf(format string, a ...any)

func (*TestEvents) Reset

func (ev *TestEvents) Reset()

Directories

Path Synopsis
cache パッケージは http のキャッシュ機構を提供します.
cache パッケージは http のキャッシュ機構を提供します.
mutex パッケージは http のアクセス権制御を提供します.
mutex パッケージは http のアクセス権制御を提供します.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL