Table of contents

How do I install Symfony Panther using Composer?

Symfony Panther is a powerful PHP library that provides a convenient browser kit for end-to-end testing and web scraping. It can drive Chrome or Firefox browsers through the DevTools Protocol or WebDriver API, making it ideal for handling JavaScript-heavy websites and dynamic content. This guide will walk you through the complete installation process using Composer.

Prerequisites

Before installing Symfony Panther, ensure your system meets these requirements:

  • PHP 7.4 or higher (PHP 8.0+ recommended)
  • Composer dependency manager
  • Google Chrome or Chromium browser (for default configuration)
  • chromedriver or geckodriver (depending on your preferred browser)

Installing Symfony Panther with Composer

Basic Installation

The simplest way to install Symfony Panther is through Composer. Run the following command in your project directory:

composer require symfony/panther

This command will download and install Symfony Panther along with all its dependencies.

Installing for Development Only

If you plan to use Symfony Panther only for testing or development purposes, install it as a development dependency:

composer require --dev symfony/panther

Installing with Browser Drivers

Symfony Panther can automatically manage browser drivers using the dbrekelmans/bdi package. Install both together:

composer require symfony/panther dbrekelmans/bdi

After installation, you can download the appropriate drivers:

# Download ChromeDriver
vendor/bin/bdi detect drivers

# Or download a specific driver version
vendor/bin/bdi driver:chromium --version=latest

Verifying the Installation

Create a simple test file to verify your installation works correctly:

<?php
// test-panther.php

require_once 'vendor/autoload.php';

use Symfony\Component\Panther\PantherTestCase;
use Symfony\Component\Panther\Client;

// Create a Panther client
$client = Client::createChromeClient();

// Navigate to a website
$crawler = $client->request('GET', 'https://example.com');

// Extract the page title
$title = $crawler->filter('title')->text();
echo "Page title: " . $title . "\n";

// Close the browser
$client->quit();

Run the test:

php test-panther.php

Configuration Options

Using Firefox Instead of Chrome

To use Firefox with Gecko driver:

<?php
use Symfony\Component\Panther\Client;

$client = Client::createFirefoxClient();

Custom Browser Configuration

You can customize browser options for advanced use cases:

<?php
use Symfony\Component\Panther\Client;

$options = [
    '--headless',
    '--disable-gpu',
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--window-size=1920,1080'
];

$client = Client::createChromeClient(null, $options);

Setting Custom Driver Paths

If you have custom driver installations:

<?php
use Symfony\Component\Panther\Client;

// For Chrome
$client = Client::createChromeClient('/path/to/chromedriver');

// For Firefox
$client = Client::createFirefoxClient('/path/to/geckodriver');

Integration with Symfony Framework

If you're working within a Symfony project, Panther integrates seamlessly:

# In a Symfony project
composer require --dev symfony/panther

Create a test class extending PantherTestCase:

<?php
// tests/Controller/WebScrapingTest.php

namespace App\Tests\Controller;

use Symfony\Component\Panther\PantherTestCase;

class WebScrapingTest extends PantherTestCase
{
    public function testPageScraping(): void
    {
        $client = static::createPantherClient();
        $crawler = $client->request('GET', 'https://example.com');

        $this->assertSelectorTextContains('h1', 'Example Domain');
    }
}

Common Installation Issues and Solutions

Issue: Chrome or ChromeDriver Not Found

Solution: Install Chrome and ensure it's in your system PATH, or specify the path explicitly:

# Ubuntu/Debian
sudo apt-get install google-chrome-stable

# macOS with Homebrew
brew install --cask google-chrome

Issue: Permission Denied Errors

Solution: Make sure the driver executables have proper permissions:

chmod +x vendor/bin/chromedriver

Issue: Port Already in Use

Solution: Specify a different port for the WebDriver server:

<?php
$client = Client::createChromeClient(null, [], [], 'http://127.0.0.1:9516');

Advanced Web Scraping Example

Here's a more comprehensive example demonstrating Symfony Panther's capabilities for web scraping:

<?php
require_once 'vendor/autoload.php';

use Symfony\Component\Panther\Client;

class WebScraper
{
    private $client;

    public function __construct()
    {
        $options = [
            '--headless',
            '--disable-gpu',
            '--no-sandbox',
            '--user-agent=Mozilla/5.0 (compatible; WebScraper/1.0)'
        ];

        $this->client = Client::createChromeClient(null, $options);
    }

    public function scrapeProduct($url)
    {
        $crawler = $this->client->request('GET', $url);

        // Wait for dynamic content to load
        $this->client->waitFor('.product-title');

        $title = $crawler->filter('.product-title')->text();
        $price = $crawler->filter('.price')->text();
        $description = $crawler->filter('.description')->text();

        return [
            'title' => $title,
            'price' => $price,
            'description' => $description
        ];
    }

    public function __destruct()
    {
        $this->client->quit();
    }
}

// Usage
$scraper = new WebScraper();
$product = $scraper->scrapeProduct('https://example-shop.com/product/123');
print_r($product);

Browser Management for Production

For production environments, consider using a standalone browser service:

# Start Chrome in headless mode
google-chrome --headless --remote-debugging-port=9222 --disable-gpu

Connect to the running instance:

<?php
$client = Client::createChromeClient(null, [], [], 'http://127.0.0.1:9222');

JavaScript Execution and Dynamic Content

Symfony Panther excels at handling AJAX requests and dynamic content loading, similar to other browser automation tools. You can execute custom JavaScript:

<?php
$client = Client::createChromeClient();
$crawler = $client->request('GET', 'https://example.com');

// Execute JavaScript
$result = $client->executeScript('return document.title;');
echo "Title from JS: " . $result;

// Wait for elements to appear
$client->waitFor('.dynamic-content', 10); // Wait up to 10 seconds

Performance Optimization

Disable Unnecessary Features

<?php
$options = [
    '--headless',
    '--disable-gpu',
    '--disable-images',
    '--disable-javascript', // Only if JS is not needed
    '--disable-plugins',
    '--disable-extensions'
];

$client = Client::createChromeClient(null, $options);

Reuse Browser Instances

For multiple requests, reuse the same client instance instead of creating new ones:

<?php
class EfficientScraper
{
    private static $client;

    public static function getClient()
    {
        if (self::$client === null) {
            self::$client = Client::createChromeClient();
        }
        return self::$client;
    }
}

Integration with Popular PHP Frameworks

Laravel Integration

In Laravel projects, you can create a service for web scraping:

# Install in Laravel
composer require symfony/panther

Create a service class:

<?php
// app/Services/WebScrapingService.php

namespace App\Services;

use Symfony\Component\Panther\Client;

class WebScrapingService
{
    public function scrapeUrl($url)
    {
        $client = Client::createChromeClient();
        $crawler = $client->request('GET', $url);

        // Your scraping logic here

        $client->quit();
        return $data;
    }
}

Comparison with Other Tools

While Symfony Panther is excellent for PHP-based scraping, you might also consider how it compares to browser session handling in other tools when evaluating your technology stack.

Conclusion

Symfony Panther provides a robust solution for web scraping and browser automation in PHP. Its integration with real browsers makes it ideal for handling modern web applications with dynamic content. The installation process is straightforward with Composer, and the library offers extensive configuration options for various use cases.

Remember to always respect websites' robots.txt files and terms of service when implementing web scraping solutions. Consider implementing rate limiting and respectful scraping practices to avoid overwhelming target servers.

For more advanced scenarios involving complex page navigation patterns, Symfony Panther's browser automation capabilities make it an excellent choice for comprehensive web scraping projects.

Try WebScraping.AI for Your Web Scraping Needs

Looking for a powerful web scraping solution? WebScraping.AI provides an LLM-powered API that combines Chromium JavaScript rendering with rotating proxies for reliable data extraction.

Key Features:

  • AI-powered extraction: Ask questions about web pages or extract structured data fields
  • JavaScript rendering: Full Chromium browser support for dynamic content
  • Rotating proxies: Datacenter and residential proxies from multiple countries
  • Easy integration: Simple REST API with SDKs for Python, Ruby, PHP, and more
  • Reliable & scalable: Built for developers who need consistent results

Getting Started:

Get page content with AI analysis:

curl "https://api.webscraping.ai/ai/question?url=https://example.com&question=What is the main topic?&api_key=YOUR_API_KEY"

Extract structured data:

curl "https://api.webscraping.ai/ai/fields?url=https://example.com&fields[title]=Page title&fields[price]=Product price&api_key=YOUR_API_KEY"

Try in request builder

Related Questions

Get Started Now

WebScraping.AI provides rotating proxies, Chromium rendering and built-in HTML parser for web scraping
Icon