前提条件#
- cURL拡張機能を備えたPHP 8.0以降
- Firecrawl APIキー — 無料で取得できます
ウェブを検索#
Firecrawl は、cURL を使って REST API 経由で PHP から利用できます。
<?php$apiKey = getenv('FIRECRAWL_API_KEY');$ch = curl_init('https://api.firecrawl.dev/v2/search');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $apiKey, 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'query' => 'firecrawl web scraping', 'limit' => 5, ]),]);$response = curl_exec($ch);curl_close($ch);$results = json_decode($response, true);foreach ($results['data']['web'] as $result) { echo $result['title'] . ' - ' . $result['url'] . "\n";}レスポンス例
{ "success": true, "data": { "web": [ { "url": "https://docs.firecrawl.dev", "title": "Firecrawl Documentation", "markdown": "# Firecrawl\n\nFirecrawl is a web scraping API..." } ] }}ページをスクレイピングする#
<?php$ch = curl_init('https://api.firecrawl.dev/v2/scrape');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $apiKey, 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'url' => 'https://example.com', ]),]);$response = curl_exec($ch);curl_close($ch);$data = json_decode($response, true);echo $data['data']['markdown'];レスポンス例
{ "success": true, "data": { "markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...", "metadata": { "title": "Example Domain", "sourceURL": "https://example.com" } }}ページをInteractする#
ブラウザセッションを開始し、自然言語のプロンプトでページをInteractしたら、セッションを終了します。
ステップ1 — スクレイピングでセッションを開始する#
<?php$ch = curl_init('https://api.firecrawl.dev/v2/scrape');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $apiKey, 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'url' => 'https://www.amazon.com', 'formats' => ['markdown'], ]),]);$response = curl_exec($ch);curl_close($ch);$scrapeResult = json_decode($response, true);$scrapeId = $scrapeResult['data']['metadata']['scrapeId'];echo "scrapeId: $scrapeId\n";ステップ 2 — 操作を送信#
<?php$interactUrl = "https://api.firecrawl.dev/v2/scrape/$scrapeId/interact";$headers = [ 'Authorization: Bearer ' . $apiKey, 'Content-Type: application/json',];// 商品を検索する$ch = curl_init($interactUrl);curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_POSTFIELDS => json_encode([ 'prompt' => 'Search for iPhone 16 Pro Max', ]),]);$response = curl_exec($ch);curl_close($ch);echo $response . "\n";// 最初の結果をクリックする$ch = curl_init($interactUrl);curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_POSTFIELDS => json_encode([ 'prompt' => 'Click on the first result and tell me the price', ]),]);$response = curl_exec($ch);curl_close($ch);echo $response . "\n";ステップ3 — セッションを停止する#
<?php$ch = curl_init($interactUrl);curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $apiKey, ],]);curl_exec($ch);curl_close($ch);echo "Session stopped\n";再利用可能なヘルパークラス#
繰り返し利用する場合は、API をクラスにラップします。
<?phpclass Firecrawl{ private string $apiKey; private string $baseUrl = 'https://api.firecrawl.dev/v2'; public function __construct(string $apiKey) { $this->apiKey = $apiKey; } private function post(string $endpoint, array $payload): array { $ch = curl_init($this->baseUrl . $endpoint); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $this->apiKey, 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode($payload), ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode >= 400) { throw new \RuntimeException("Firecrawl API error: HTTP $httpCode"); } return json_decode($response, true); } public function scrape(string $url, array $options = []): array { return $this->post('/scrape', array_merge(['url' => $url], $options)); } public function search(string $query, int $limit = 5): array { return $this->post('/search', ['query' => $query, 'limit' => $limit]); }}// 使用例$app = new Firecrawl(getenv('FIRECRAWL_API_KEY'));$result = $app->scrape('https://example.com');echo $result['data']['markdown'];
