前提条件#
- Go 1.21+
- Firecrawl APIキー — 無料で取得できます
ウェブを検索#
Firecrawl は REST API 経由で Go から利用できます。net/http を使って直接リクエストを送信できます。
package mainimport ( "bytes" "encoding/json" "fmt" "io" "net/http" "os")func main() { apiKey := os.Getenv("FIRECRAWL_API_KEY") body, _ := json.Marshal(map[string]interface{}{ "query": "firecrawl web scraping", "limit": 5, }) req, _ := http.NewRequest("POST", "https://api.firecrawl.dev/v2/search", bytes.NewReader(body)) req.Header.Set("Authorization", "Bearer "+apiKey) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { fmt.Fprintf(os.Stderr, "リクエストに失敗しました: %v\n", err) os.Exit(1) } defer resp.Body.Close() result, _ := io.ReadAll(resp.Body) fmt.Println(string(result))}レスポンス例
{ "success": true, "data": { "web": [ { "url": "https://docs.firecrawl.dev", "title": "Firecrawl Documentation", "markdown": "# Firecrawl\n\nFirecrawl is a web scraping API..." } ] }}ページをスクレイピング#
body, _ := json.Marshal(map[string]string{ "url": "https://example.com",})req, _ := http.NewRequest("POST", "https://api.firecrawl.dev/v2/scrape", bytes.NewReader(body))req.Header.Set("Authorization", "Bearer "+apiKey)req.Header.Set("Content-Type", "application/json")resp, err := http.DefaultClient.Do(req)if err != nil { fmt.Fprintf(os.Stderr, "request failed: %v\n", err) os.Exit(1)}defer resp.Body.Close()result, _ := io.ReadAll(resp.Body)fmt.Println(string(result))レスポンス例
{ "success": true, "data": { "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...", "metadata": { "title": "Example Domain", "sourceURL": "https://example.com" } }}ページを操作する#
ブラウザセッションを開始し、自然言語の指示でページをInteractしてから、セッションを終了します。
ステップ 1 — スクレイピングしてセッションを開始する#
body, _ := json.Marshal(map[string]interface{}{ "url": "https://www.amazon.com", "formats": []string{"markdown"},})req, _ := http.NewRequest("POST", "https://api.firecrawl.dev/v2/scrape", bytes.NewReader(body))req.Header.Set("Authorization", "Bearer "+apiKey)req.Header.Set("Content-Type", "application/json")resp, err := http.DefaultClient.Do(req)if err != nil { fmt.Fprintf(os.Stderr, "request failed: %v\n", err) os.Exit(1)}defer resp.Body.Close()var scrapeResult map[string]interface{}json.NewDecoder(resp.Body).Decode(&scrapeResult)data := scrapeResult["data"].(map[string]interface{})metadata := data["metadata"].(map[string]interface{})scrapeId := metadata["scrapeId"].(string)fmt.Println("scrapeId:", scrapeId)ステップ 2 — 操作を送信#
// 商品を検索するinteractBody, _ := json.Marshal(map[string]string{ "prompt": "Search for iPhone 16 Pro Max",})interactURL := fmt.Sprintf("https://api.firecrawl.dev/v2/scrape/%s/interact", scrapeId)req, _ = http.NewRequest("POST", interactURL, bytes.NewReader(interactBody))req.Header.Set("Authorization", "Bearer "+apiKey)req.Header.Set("Content-Type", "application/json")resp, err = http.DefaultClient.Do(req)if err != nil { fmt.Fprintf(os.Stderr, "interact failed: %v\n", err) os.Exit(1)}defer resp.Body.Close()result, _ := io.ReadAll(resp.Body)fmt.Println(string(result))// 最初の結果をクリックするinteractBody, _ = json.Marshal(map[string]string{ "prompt": "Click on the first result and tell me the price",})req, _ = http.NewRequest("POST", interactURL, bytes.NewReader(interactBody))req.Header.Set("Authorization", "Bearer "+apiKey)req.Header.Set("Content-Type", "application/json")resp, err = http.DefaultClient.Do(req)if err != nil { fmt.Fprintf(os.Stderr, "interact failed: %v\n", err) os.Exit(1)}defer resp.Body.Close()result, _ = io.ReadAll(resp.Body)fmt.Println(string(result))ステップ 3 — セッションを停止する#
req, _ = http.NewRequest("DELETE", interactURL, nil)req.Header.Set("Authorization", "Bearer "+apiKey)resp, err = http.DefaultClient.Do(req)if err != nil { fmt.Fprintf(os.Stderr, "delete failed: %v\n", err) os.Exit(1)}defer resp.Body.Close()fmt.Println("Session stopped")再利用可能なヘルパー#
繰り返し使う場合は、API を小さなヘルパーでラップします。
type FirecrawlClient struct { APIKey string BaseURL string Client *http.Client}func NewFirecrawlClient(apiKey string) *FirecrawlClient { return &FirecrawlClient{ APIKey: apiKey, BaseURL: "https://api.firecrawl.dev/v2", Client: &http.Client{}, }}func (fc *FirecrawlClient) post(endpoint string, payload interface{}) ([]byte, error) { body, err := json.Marshal(payload) if err != nil { return nil, err } req, err := http.NewRequest("POST", fc.BaseURL+endpoint, bytes.NewReader(body)) if err != nil { return nil, err } req.Header.Set("Authorization", "Bearer "+fc.APIKey) req.Header.Set("Content-Type", "application/json") resp, err := fc.Client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() return io.ReadAll(resp.Body)}func (fc *FirecrawlClient) Scrape(url string) ([]byte, error) { return fc.post("/scrape", map[string]string{"url": url})}func (fc *FirecrawlClient) Search(query string, limit int) ([]byte, error) { return fc.post("/search", map[string]interface{}{"query": query, "limit": limit})}Note
v1 API ではコミュニティ提供の Go SDKを利用できます。詳細は Go SDK ドキュメントをご覧ください。

