Веб-скрейпинг на PHP

Веб-скрапинг с помощью PHP: Пошаговый самоучитель

In this guide, I’ll walk you through creating a simple web scraper with PHP. Don’t worry if you’re new to the process; I’ll take it one step at a time. By the end, you’ll know how to pull data from websites and store it in files for future use. Let’s dive in!

Что такое веб-скрейпинг?

Веб-скрейпинг Это процесс получения данных с веб-сайта путем извлечения полезной информации из HTML-структуры. Он позволяет разработчикам получать данные из источников, которые не предоставляют API или где API недостаточно для конкретных сценариев использования.

Например, вы можете захотеть собирать данные с e-commerce-сайтов, чтобы извлечь цены, описания или изображения товаров. Затем эти данные можно использовать для сравнения, анализа или просто сохранить для дальнейшего использования.

Почему именно PHP для веб-скрейпинга?

В то время как Python и JavaScript В PHP есть множество библиотек для веб-скрейпинга, например Scrapy, BeautifulSoup и Puppeteer, PHP тоже хорошо подходит для веб-скрейпинга по нескольким причинам:

  1. Simple Setup: PHP прост в настройке и не требует дополнительной установки, как некоторые другие языки программирования.
  2. Built-in ToolsPHP предлагает cURL, встроенную библиотеку для выполнения HTTP-запросов, которая необходима для веб-скрейпинга.
  3. HTML Parsing: PHP предлагает такие библиотеки, как Simple HTML DOM Parser, которые упрощают извлечение и обработку HTML-данных.
  4. Wide Availability: PHP широко используется на многих хостинговых платформах, поэтому он удобен для задач веб-скрейпинга и не требует специальных прав доступа или настроек сервера.

Прочитайте мою статью о лучшие PHP-библиотеки для веб-скрапинга.

Leveraging Advanced Proxies

Иногда веб-скрейпинг может сталкиваться с такими препятствиями, как Блокировка IP-адресов или CAPTCHA. Когда это происходит, подключение продвинутого прокси-сервиса может помочь вашему скрейперу продолжать работу без сбоев. Прокси-решение от Bright Data предлагает автоматическую ротацию IP и интеллектуальные функции, которые помогают обходить антибот-защиту. Это значит, что вы можете сосредоточиться на извлечении и анализе данных с помощью PHP, не застревая на проблемах с подключением.

Ознакомьтесь с моим списком Лучшие провайдеры прокси для веб-скрапинга.

Let’s now walk through how to set up your first web scraper using PHP.

Шаг 1: Настройка PHP-окружения

Чтобы начать веб-скрейпинг на PHP, вам понадобятся следующие компоненты:

  • PHP: Установите последнюю версию PHP (8.3 или выше) с официального сайта или через пакетный менеджер.
  • IDE: Используйте любую IDE, но мы рекомендуем Visual Studio Code за простоту использования и богатую поддержку расширений. Если вам нужна IDE, созданная специально для веб-скрейпинга, попробуйте этот инструмент.
  • Libraries: Вам понадобятся Simple HTML DOM Parser и cURL (он предустановлен вместе с PHP), чтобы выполнять HTTP-запросы и разбирать HTML-содержимое.

Установка PHP и необходимых библиотек

  1. Скачайте и установите PHP с Официальный сайт PHP.
  2. Для Windows можно использовать такие инструменты, как XAMPP или WAMP, которые обеспечивают удобную среду для разработки на PHP.
  3. Скачайте Simple HTML DOM Parser с сайта SourceForge и добавьте его в папку проекта.

После того как вы настроите PHP и необходимые библиотеки, каталог проекта должен выглядеть примерно так:

/web-scraping-project

├── scraper.php

└── simple_html_dom.php

Шаг 2: Выполняем HTTP-запросы с помощью cURL

Чтобы извлекать данные с сайта, сначала нужно отправить HTTP-запрос к серверу сайта. Библиотека cURL в PHP отлично подходит для этого. Вот как с помощью cURL получить HTML-контент веб-страницы.

Пример базового запроса cURL

<?php
// URL of the website you want to scrape
$url = "https://example.com";
// Initialize cURL session
$curl = curl_init();
// Set cURL options
curl_setopt($curl, CURLOPT_URL, $url); // Specify the URL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Return response as a string
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // Follow redirects
// Execute the cURL session
$htmlContent = curl_exec($curl);
// Check for errors
если ($htmlContent === false) {
echo "Ошибка: " . curl_error($curl);
exit;
}
// Close the cURL session
curl_close($curl);
// Output the fetched HTML content
echo $htmlContent;
?>

Этот код отправляет запрос на https://example.com и выводит необработанный HTML-ответ. Это первый шаг веб-скрейпинга: получение нужных данных.

Шаг 3: Парсинг HTML-контента

После того как вы получили исходный HTML, следующий шаг: разобрать его и извлечь нужную информацию. В PHP нет встроенных функций для разбора HTML, но Simple HTML DOM Parser упрощает эту задачу.

Let’s use this library to extract data from the webpage. Start by including the library in your script and then use its functions to navigate the HTML structure.

Извлечение данных с помощью Simple HTML DOM Parser

<?php
// Include the Simple HTML DOM Parser library
include_once('simple_html_dom.php');
// Fetch the HTML content using cURL (as shown previously)
$htmlContent = file_get_contents('https://example.com');
// Create a Simple HTML DOM object
$html = str_get_html($htmlContent);
// Extract data using CSS selectors
$title = $html->find('title', 0)->plaintext; // Extract the title of the page
$heading = $html->find('h1', 0)->plaintext; // Extract the first h1 tag
// Output the extracted data
echo "Заголовок страницы: $title\n";
echo "Heading: $heading\n";
?>

В этом примере мы получаем заголовок страницы и первый заголовок (h1) веб-страницы. Метод find в Simple HTML DOM Parser работает аналогично jQuery: вы можете передавать CSS-селекторы для извлечения конкретных элементов.

Шаг 4: Сбор данных по нескольким элементам

В большинстве случаев вам нужно извлекать не один фрагмент данных. Давайте расширим предыдущий пример, чтобы собрать несколько элементов. Мы извлечём данные о товаре (название, цену и URL изображения) с e-commerce-сайта.

Scraping Multiple Products

<?php
// Include the Simple HTML DOM Parser
include_once('simple_html_dom.php');
// URL of the e-commerce site
$url = 'https://example.com/products';
// Fetch the HTML content using cURL
$htmlContent = file_get_contents($url);
// Create a Simple HTML DOM object
$html = str_get_html($htmlContent);
// Find all product containers
$products = $html->find('.product'); // Use the appropriate CSS selector for product items
// Loop through each product and extract data
foreach ($products в роли $product) {
$name = $product->find('.product-title', 0)->plaintext;
$price = $product->find('.product-price', 0)->plaintext;
$image = $product->find('img', 0)->src;
// Output the extracted product information
echo "Product: $name\n";
echo "Цена: $price\n";
echo "Image URL: $image\n";
echo " - - - - - - - - - - - -\n";
}
?>

Здесь мы используем селектор `.product`, чтобы найти каждый товар на странице, а затем извлечь для него название, цену и URL изображения. Вы можете адаптировать CSS-селекторы под реальную структуру сайта, с которого собираете данные.

Шаг 5: Сохранение данных в CSV-файл

После того как вы извлекли данные, вам, скорее всего, захочется сохранить их для дальнейшего использования. Распространенный способ сделать это - экспортировать данные в CSV-файл. В PHP есть встроенные функции для работы с CSV-файлами, так что это легко.

Экспорт данных в CSV

<?php
// Array of scraped product data
$productData = [
['Name' => 'Product 1', 'Цена' => '$10.00', 'Image URL' => 'https://example.com/image1.jpg'],
['Name' => 'Product 2', 'Цена' => '$20.00', 'Image URL' => 'https://example.com/image2.jpg'],
];
// Specify the path to the CSV file
$csvFilePath = 'products.csv';
// Open the CSV file for writing
$file = fopen($csvFilePath, 'w');
// Write the column headers
fputcsv($file, array_keys($productData[0]));
// Write each product's data to the CSV file
foreach ($productData в роли $product) {
fputcsv($file, $product);
}
// Close the CSV file
fclose($file);
// Output a success message
echo "CSV file created successfully: $csvFilePath\n";
?>

Этот код берет данные о товарах из массива и записывает их в CSV-файл. функция fputcsv is used to write each row of data to the file. After running the script, you’ll have a products.csv file containing the scraped information.

Шаг 6: Обработка ошибок и доработка скрейпера

While the examples above cover the basics of web scraping, real-world scraping often involves more complex tasks, such as handling errors, dealing with CAPTCHAs, respecting robots.txt, and scraping large volumes of data.

Вот еще несколько советов:

  • Error Handling: Всегда проверяйте ошибки в запросах cURL и обрабатывайте их надлежащим образом.
  • Respect Robots.txt: Websites may have rules in their robots.txt file to prevent scraping. Always check and comply with these rules.
  • Ограничение скорости: Не отправляйте слишком много запросов за короткий промежуток времени, чтобы вас не заблокировали. Между запросами можно добавлять задержки с помощью sleep() в PHP.
  • User-Agent: Некоторые сайты блокируют запросы от небраузерных клиентов. Установите заголовок User-Agent, чтобы имитировать веб-браузер.
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36');

Продвинутые методы веб-скрейпинга на PHP

Сбор больших объемов данных с сайтов требует большего, чем базовые методы скрейпинга. Чтобы эффективно собирать данные в больших масштабах, вам понадобятся продвинутые методы, включая веб-краулинг, обработку динамического контента и обход антибот-защиты. Давайте разберем, как решать каждую из этих задач с PHP.

1. Веб-краулинг с PHP

Веб-краулинг — это процесс систематического обхода всех страниц сайта и извлечения нужных данных с каждой страницы. Это особенно важно для сбора данных с сайтов с пагинацией, где контент распределён по нескольким страницам.

Скрейпер, который вы создали в предыдущих разделах, извлекает данные только с одной страницы. Теперь давайте доработаем его, чтобы он обходил все страницы сайта и извлекал данные с каждой из них.

Шаг 1: Изучите механизм пагинации

Прежде чем начинать, определите, как сайт реализует пагинацию. В большинстве случаев ссылки пагинации представлены HTML-элементом, например кнопкой «Next» или рядом номеров страниц. Изучив HTML страницы, можно найти ссылку на следующую страницу и использовать её для дальнейшего обхода.

Шаг 2: Реализация веб-краулинга

Let’s modify the previous scraper to crawl through paginated content.

<?php
include_once("simple_html_dom.php");
$url = "https://scrapingcourse.com/ecommerce/";
$productData = array();
функция скребок($url) {
echo "Сбор данных со страницы: $url\n";
// Initialize cURL session
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$htmlContent = curl_exec($curl);
если ($htmlContent === false) {
$error = curl_error($curl);
echo "Ошибка cURL: " . $error;
exit;
}
curl_close($curl);
// Parse the HTML content
$html = str_get_html($htmlContent);
$products = $html->find(".product");
foreach ($products в роли $product) {
$name = $product->find(".woocommerce-loop-product__title", 0);
$image = $product->find("img", 0);
$price = $product->find("span.price", 0);
если ($name && $price && $image) {
$decodedPrice = html_entity_decode($price->plaintext);
$productInfo = array(
"Name" => $name->plaintext,
"Price" => $decodedPrice,
"URL изображения" => $image->src
);
global $productData;
$productData[] = $productInfo;
}
}
// Look for the "Next" page link
$nextPageLink = $html->find("a.next", 0);
если ($nextPageLink) {
$nextPageUrl = $nextPageLink->href;
скребок($nextPageUrl); // Recursively scrape the next page
}
}
// Start scraping from the first page
скребок($url);
// Output the collected data
print_r($productData);
?>

Этот скрипт использует cURL для получения HTML-контента, разбирает его с помощью Simple HTML DOM Parser и ищет данные о товаре (название, цену и URL изображения). Затем он находит ссылку на страницу «Next» и рекурсивно собирает данные со всех страниц, пока ссылки не закончатся.

2. Работа с динамическим контентом в PHP

Некоторые сайты используют JavaScript для динамической загрузки контента после первоначальной загрузки страницы. Простой HTML DOM Parser не подойдёт для таких сайтов, поскольку он работает только со статическим HTML. Для динамического контента нужен headless-браузер вроде Selenium, который умеет выполнять JavaScript.

Шаг 1: Использование Selenium с PHP

Selenium позволяет имитировать действия реального пользователя, управляя браузером программно. В PHP для взаимодействия с Selenium WebDriver можно использовать пакет php-webdriver.

Чтобы настроить Selenium в PHP, выполните следующие шаги:

Install Composer (если еще не установлены).

Установите Selenium WebDriver для PHP с помощью Composer:

composer require php-webdriver/webdriver composer require symfony/css-selector

Download Selenium Server и запустите его локально:

java -jar selenium-server-<version>.jar standalone - selenium-manager true

Шаг 2: реализация динамического веб-скрейпинга с Selenium

Вот как можно использовать Selenium для извлечения данных со страницы, которая загружается динамически:

<?php
namespace ИИ используется для автоматического распознавания и извлечения релевантных данных из веб-страниц, включая изображения, текст и ссылки.\WebDriver;
использовать ИИ используется для автоматического распознавания и извлечения релевантных данных из веб-страниц, включая изображения, текст и ссылки.\WebDriver\Remote\DesiredCapabilities;
использовать ИИ используется для автоматического распознавания и извлечения релевантных данных из веб-страниц, включая изображения, текст и ссылки.\WebDriver\Remote\RemoteWebDriver;
использовать ИИ используется для автоматического распознавания и извлечения релевантных данных из веб-страниц, включая изображения, текст и ссылки.\WebDriver\Chrome\ChromeOptions;
require_once("vendor/autoload.php");
$host = "http://localhost:4444/"; // Local Selenium server
$capabilities = DesiredCapabilities::chrome();
$chromeOptions = новый ChromeOptions();
$chromeOptions->addArguments([" - headless"]); // Run Chrome in headless mode
$capabilities->setCapability(ChromeOptions::CAPABILITY_W3C, $chromeOptions);
$driver = RemoteWebDriver::create($host, $capabilities);
функция скребок($driver) {
$driver->manage()->окно()->maximize();
$products = $driver->findElements(WebDriverBy::cssSelector(".product-container"));
foreach ($products в роли $product) {
$name = $product->findElement(WebDriverBy::cssSelector(".product-name"))->getText();
$price = $product->findElement(WebDriverBy::cssSelector(".product-price"))->getText();
$image_url = $product->findElement(WebDriverBy::cssSelector("img"))->getAttribute("src");
echo "Имя: $name\n";
echo "Цена: $price\n";
echo "Image URL: $image_url\n";
}
}
// Open the target page
$driver->получить("https://www.scrapingcourse.com/infinite-scrolling");
$lastHeight = $driver->executeScript("return document.body.scrollHeight");
в то время как (true) {
$driver->executeScript("window.scrollTo(0, document.body.scrollHeight);");
спать(2);
$newHeight = $driver->executeScript("return document.body.scrollHeight");
если ($newHeight == $lastHeight) {
скребок($driver);
перерыв;
}
$lastHeight = $newHeight;
}
// Close the browser
$driver->quit();
?>

В этом коде мы используем Selenium, чтобы открыть веб-страницу, прокрутить её и извлечь данные, которые JavaScript динамически рендерит. После прокрутки страницы до конца и проверки, что весь контент загрузился, скрейпер извлекает название товара, цену и URL изображения.

3. Избежание блокировок при скрейпинге с PHP

Многие сайты используют антибот-защиту, такую как блокировка по IP-адресу, CAPTCHA и ограничение частоты запросов, чтобы предотвратить веб-скрейпинг. Чтобы обходить эти ограничения, можно использовать такие методы, как ротация IP-адресов и имитация поведения обычного пользователя.

Шаг 1: используйте прокси, чтобы избежать обнаружения

Один из эффективных способов избежать блокировки - использовать прокси. Используя ротацию прокси для каждого запроса, можно избежать срабатывания антибот-систем, которые считают подозрительными несколько запросов с одного IP-адреса.

Можно использовать сервисы вроде Bright Data, которые предлагают автоматическую ротацию прокси и позволяют обходить антибот-системы, такие как CAPTCHA и JavaScript-проверки.

Шаг 2: имитируйте действия обычного пользователя

Еще один способ избежать обнаружения - имитировать заголовки реального браузера. Например, можно задать заголовок User-Agent так, чтобы он выдавал себя за реальный браузер, например Chrome или Firefox.

Вот пример того, как добавить в ваш скрейпер пользовательский заголовок User-Agent:

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://www.example.com");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// Set a custom User-Agent to mimic a real browser
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
$htmlContent = curl_exec($curl);
curl_close($curl);
echo $htmlContent;
?>

Шаг 3: используйте API для веб-скрейпинга

Для более продвинутой защиты от ботов, такой как Cloudflare или Akamai, может понадобиться специализированный API для веб-скрейпинга, например Bright Data. Он автоматически берет на себя ротацию прокси, обход CAPTCHA и рендеринг JavaScript, упрощая скрейпинг даже самых сложных сайтов.

<?php
$apiUrl = "https://api.Bright Data.com/v1/?apikey=<YOUR_Bright Data_API_KEY>&url=" . urlencode("https://www.example.com");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

Заключение

Bright Data автоматизирует весь процесс скрейпинга, позволяя сосредоточиться на извлечении данных, а не на борьбе с блокировками.

Веб-скрейпинг на PHP — мощный способ извлекать данные с сайтов, а сочетание cURL и Simple HTML DOM Parser делает процесс простым и эффективным. Неважно, собираете ли вы товарные данные, новостные статьи или ленты соцсетей, PHP легко справится с этой задачей.

When scraping websites, be mindful of legal and ethical concerns, including respecting the site’s robots.txt file and terms of service. With great power comes great responsibility!

 

Похожие записи