Documentation
¶
Overview ¶
crawl パッケージは Web サイトの巡回ユーティリティを提供します.
Index ¶
- Constants
- func Download(cl *Client, url string) (tmpname string, err error)
- func ScanCsv(r io.Reader, enc encoding.Encoding, rower ReadCsvRower) error
- func ScanZip(name string, filer ReadZipFiler) error
- type Client
- func (cl *Client) Do(req *http.Request) (*http.Response, error)
- func (cl *Client) Get(url string) (resp *http.Response, err error)
- func (cl *Client) Head(url string) (resp *http.Response, err error)
- func (cl *Client) LastTransaction() error
- func (cl *Client) NewTransaction() error
- func (cl *Client) Post(url, contentType string, body io.Reader) (resp *http.Response, err error)
- func (cl *Client) PostForm(url string, data url.Values) (resp *http.Response, err error)
- func (cl *Client) PostJson(url string, data any) (resp *http.Response, err error)
- func (cl *Client) SetTransaction(name string) error
- type ReadCsvRower
- type ReadCsvRowerFunc
- type ReadZipFiler
- type ReadZipFilerFunc
- type TestEvents
Examples ¶
Constants ¶
const SkipAll notifyb.Notify = "skip all"
Variables ¶
This section is empty.
Functions ¶
func Download ¶
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()
}
func ScanCsv ¶
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
}
}
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)
}
}
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client はキャッシュ機構とアクセス間隔制御機構を持つ HTTP クライアントです.
Client はサーバに負荷を掛けないよう指定した間隔を空けてアクセスします.
Client が持つキャッシュ機構はキャッシュディレクトリに トランザクション単位でアクセス結果をファイル保存します. トランザクションは世代管理していて複数世代を保持することができます. この仕組みによって障害発生時を再現したり サーバに負担を掛けずに開発・テストができます. トランザクションは最大世代数を超えると自動的に破棄されます.
func NewClient ¶
NewClient は新しい Client を作成します.
サーバへのアクセス間隔は d で指定します. キャッシュ機構のディレクトリやトランザクションの最大世代数はそれぞれ cacheDir, numTx で指定します.
func (*Client) Do ¶
Do は http.Request を送信し http.Response を返します. もしトランザクションにキャッシュがあれば キャッシュされた結果を返します.
func (*Client) LastTransaction ¶
LastTransaction は前回のトランザクションを再開します.
func (*Client) NewTransaction ¶
NewTransaction は新しいトランザクションを開始し世代を切り替えます.
func (*Client) Post ¶
Post は指定された URL に対して POST を発行します.
body をフォーム形式や JSON 形式で送信する場合 それぞれ PostForm, PostJson を利用するとより簡単です.
func (*Client) SetTransaction ¶
SetTransaction は指定したトランザクションを使用します.
type ReadCsvRower ¶
ReadCsvRower は ScanCsv の結果を受け取るインターフェイスです.
type ReadCsvRowerFunc ¶
ReadCsvRowerFunc は通常の関数を ReadCsvRower に変換するアダプタです.
type ReadZipFiler ¶
ReadZipFiler は ScanZip の結果を受け取るインターフェイスです.
type ReadZipFilerFunc ¶
ReadZipFilerFunc は通常の関数を ReadZipFiler に変換するアダプタです.
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()