перейти к содержанию

Парсинг веб-страниц с помощью PHP: подробное руководство

Парсинг веб-страниц растет в геометрической прогрессии, поскольку организации все больше полагаются на сбор и анализ данных для принятия бизнес-решений. Python и JavaScript могут получить больше заголовков, но PHP остается надежным выбором для многих задач парсинга.

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

Почему PHP для парсинга?

Давайте рассмотрим несколько ключевых причин, по которым PHP является отличным языком для парсинга веб-страниц:

вездесущность – PHP поддерживает более 75% веб-сайтов, поэтому парсинг PHP-сайтов на одном языке позволяет избежать проблем с перекрестным происхождением.

Скорость – Простые операции очистки в PHP выполняются очень быстро. Легкий вес делает его идеальным для очистки в больших масштабах.

Инструменты – Зрелые библиотеки, такие как Goutte, и интеграция с компонентами Symfony обеспечивают сложные возможности очистки.

Database Integration – Собранные данные можно напрямую вставлять в MySQL для облегчения анализа.

хостинг – Скребки легко развернуть на недорогих PHP-серверах общего хостинга.

Парсинг веб-страниц помогает принимать решения на основе данных во многих отраслях:

  • Электронная коммерция – собирайте цены, инвентарь и многое другое с сайтов конкурентов.
  • Маркетинг – собирайте данные о потенциальных клиентах и ​​потенциальных клиентах из каталогов.
  • Финансы – данные о доходах от урожая, финансовая отчетность и информация для инвесторов.
  • Недвижимость — соберите историю транзакций, оценки и детали листинга.
  • Путешествия – собирайте цены на авиабилеты/отели и наличие мест у OTA.

Это всего лишь несколько примеров: парсинг веб-страниц помогает предприятиям практически во всех отраслях. Благодаря возможностям извлечения огромных наборов данных PHP предоставляет средства для реализации этих сценариев использования анализа данных.

Основные библиотеки парсинга

В то время как PHP предлагает собственные функции для HTTP-запросов и анализа DOM, специально созданные библиотеки значительно ускоряют разработку. Вот некоторые из наиболее полезных инструментов парсинга PHP:

Жрать

Жрать — это полнофункциональный HTTP-клиент, который управляет файлами cookie, перенаправлениями, повторными попытками и другими деталями. Это делает его идеальным для надежных скриптов парсинга.

$client = new \GuzzleHttp\Client();

$response = $client->request(‘GET‘, ‘http://www.example.com‘);

Guzzle также поддерживает одновременные запросы для высокопроизводительного парсинга.

Symfony BrowserKit

Браузеркит эмулирует среду браузера, позволяя отправлять формы, нажимать ссылки и обрабатывать взаимодействия с сайтом.

Симфония Пантера

Пантера основан на BrowserKit, добавляя автоматизацию для реальных браузеров, таких как Chrome, с использованием WebDriver. Это позволяет парсить сложные сайты на базе JavaScript.

$client = \Symfony\Component\Panther\Client::createChromeClient();

$client->request(‘GET‘, ‘https://example.com‘);

падение

падение — это простая библиотека PHP для парсинга веб-страниц. Он расширяет компоненты Symfony, такие как DomCrawler:

$client = new \Goutte\Client();

$crawler = $client->request(‘GET‘, ‘https://example.com‘);

$crawler->filter(‘h1‘)->text();

Goutte делает выбор элементов и извлечение данных очень кратким.

Вместе эти библиотеки образуют мощный набор инструментов для парсинга PHP.

Выполнение HTTP-запросов

Отправной точкой для любого парсера является выдача HTTP-запросов для загрузки целевых страниц.

Сам PHP предоставляет базовые функции, такие как file_get_contents():

$html = file_get_contents(‘https://example.com‘);

Но этот простой подход имеет ограничения — отсутствие контроля над заголовками, обработкой перенаправлений или чтением информации об ответах.

Именно здесь становится полезным надежный HTTP-клиент, такой как Guzzle:

$client = new \GuzzleHttp\Client();

$response = $client->request(‘GET‘, ‘https://example.com‘);

Guzzle позволяет настраивать пользовательские заголовки, такие как пользовательские агенты, обрабатывать файлы cookie, читать тела ответов и многое другое. Мы можем проверить код состояния, чтобы убедиться, что запрос выполнен успешно:

if($response->getStatusCode() !== 200){
    throw new Exception("Request failed");
}

Это дает контроль, необходимый для парсинга в реальном мире.

Анализ и извлечение данных

После получения HTML-кода страницы нам необходимо извлечь нужные данные. PHP имеет несколько встроенных опций анализа DOM:

DOMДокумент

Класс DOMDocument загружает HTML и формирует запрашиваемое дерево DOM:

$dom = new DOMDocument();
$dom->loadHTML($html);

$links = $dom->getElementsByTagName(‘a‘);

SimpleXML

SimpleXML предоставляет возможности анализа XML/HTML с помощью простого API:

$xml = simplexml_load_string($html);

$links = $xml->xpath(‘//a‘); 

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

Вот где библиотеки любят падение светить. Goutte расширяет компонент DomCrawler Symfony, обеспечивая удобный для PHP очистку DOM:

$client = new \Goutte\Client();

$crawler = $client->request(‘GET‘, ‘https://example.com‘);

// Extract text from H1 tags
$text = $crawler->filter(‘h1‘)->text();

// Extract links from all paragraphs 
$crawler->filter(‘p‘)->each(function ($node) {
    print $node->filter(‘a‘)->link()->getUri() . "\n";
});

Сканер позволяет нажимать ссылки, отправлять формы и легко извлекать данные с помощью простого API.

Парсинг JavaScript-сайтов

Традиционный анализ DOM надежно работает только для статических сайтов. Современные веб-приложения в значительной степени полагаются на JavaScript для отображения контента.

Чтобы очистить эти сайты, нам нужно выполнить код JavaScript. Здесь используются такие инструменты, как Симфония Пантера заходи.

Panther автоматизирует настоящие браузеры, такие как Chrome и Firefox, через WebDriver:

$client = \Symfony\Component\Panther\Client::createChromeClient();

$crawler = $client->request(‘GET‘, ‘https://example.com‘);

// Extract text rendered by JavaScript
$text = $crawler->filter(‘.js-generated‘)->text();

Это дает возможность парсить сложные одностраничные приложения (SPA), управляемые JavaScript. Синтаксис остается совместимым со парсингом, отличным от JS.

Для еще большего контроля интегрируйте Selenium WebDriver напрямую с PHP. Это позволяет более полно автоматизировать действия браузера.

Обработка нумерации страниц

Часто существует несколько страниц, которые мы хотим непрерывно парсить. Нам нужно автоматически перемещаться по нумерации страниц, отслеживая при этом очищенные страницы.

Общий подход:

  1. Соскребите первую страницу
  2. Извлеките URL-адрес следующей страницы
  3. Поставить URL-адрес в очередь
  4. Повторить

Вот пример логики обработки нумерации страниц:

$baseUrl = "https://example.com/results";
$page = 1; 

do {

  $html = fetchPage("$baseUrl?page=$page");

  // Extract next page link
  $nextLink = $crawler->filter(‘.pagination .next‘)->link();

  // Queue next page if found
  if ($nextLink) {
    $uri = $nextLink->getUri(); 
    $page++;
  }

} while ($nextLink);

Более продвинутая тактика включает в себя обнаружение распространенных шаблонов нумерации страниц (page-2.html, /p2/ и т. д.) и расширение области сканирования при обнаружении новых ссылок.

Хранение очищенных данных

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

$file = fopen(‘results.csv‘, ‘w‘); 

// ... scraping logic 

fputcsv($file, [$title, $url, $date]);

fclose($file);

Структурированные данные лучше вставлять непосредственно в базу данных, например MySQL, с помощью PDO:

$db = new PDO(‘mysql:host=localhost;dbname=scraper‘, $user, $pass);

$statement = $db->prepare("INSERT INTO posts VALUES (:title, :url, :date)");

// ... scraping logic  

$statement->execute([
  ‘:title‘ => $title,
  ‘:url‘ => $url,
  ‘:date‘ => $date
]);

Это позволяет организовать данные для будущих отчетов и анализа.

Отладка веб-скребков

При разработке парсеров вы, вероятно, столкнетесь с такими проблемами, как:

  • Ошибки HTTP или неудачные запросы
  • Изменения в макетах страниц и селекторах
  • Блокировка сайтами
  • Ошибки рендеринга JavaScript

Вот несколько советов по отладке:

  • Включите подробное ведение журнала Guzzle для проверки запросов/ответов.
  • Распечатайте и просмотрите необработанный HTML-код на наличие изменений.
  • Используйте DevTools браузера для тестирования селекторов
  • Переключитесь на автономный просмотр, чтобы выявить проблемы JS
  • Ротация прокси и рандомизация шаблонов, таких как пользовательские агенты.
  • Начните с малого и постепенно расширяйте область действия парсера.

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

Расширенные возможности парсинга

Помимо основ, PHP поддерживает несколько расширенных возможностей очистки:

Cookie – Сохраняйте файлы cookie между запросами для поддержания состояния сеанса.

Формы и логины – Отправляйте данные POST и заполняйте поля формы программно.

API – Взаимодействуйте с API-интерфейсами JSON с помощью Guzzle.

Изображения и медиа – Загружайте двоичный контент, например изображения, PDF-файлы и многое другое.

многопоточность – Распараллеливайте и масштабируйте парсинг с помощью ReactPHP или Amp.

Безголовые браузеры – Тесная интеграция с Puppeteer и Selenium для более полного управления браузером.

Скрапинг как услуга – Разгрузить парсинг полностью управляемым поставщикам.

Для этих более сложных задач могут потребоваться дополнительные библиотеки помимо основных функций PHP.

Этический парсинг веб-страниц

При масштабном парсинге важно следовать лучшим практикам, которые обеспечивают надежный сбор данных и позволяют избежать проблем с целевыми сайтами:

  • Избегайте перегрузки сайтов – Ограничьте скорость/пропускную способность запросов до разумного уровня.
  • Проверьте robots.txt – Следуйте пожеланиям сканирования сайта.
  • Рандомизировать шаблоны – Меняйте пользовательские агенты и IP-адреса, чтобы они выглядели более человечными.
  • Храните данные безопасно – Не оставляйте скопированные данные в открытом доступе.
  • Соблюдайте законы – Рассмотрите такие нормативные акты, как законы об авторском праве и конфиденциальности данных.
  • Источники кредита – Ссылка на исходные данные, где это применимо.

Соблюдение этических принципов парсинга позволяет ответственно подходить к сбору данных.

Заключение

Это руководство лишь поверхностно описывает надежный парсинг в PHP. Этот язык вместе со зрелыми библиотеками, такими как Goutte, представляет собой высокопроизводительную платформу.

Подводя итог, мы рассмотрели:

  • HTTP-запросы с Guzzle
  • Разбор DOM с помощью Goutte
  • Парсинг сайтов JavaScript с помощью Panther
  • Управление нумерацией страниц и сканированием
  • Хранение данных в базах данных
  • Отладка и устранение неполадок парсеров
  • Передовые методы, такие как прокси и безголовые браузеры.

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

Вы создавали парсеры с помощью PHP? Я хотел бы услышать ваш опыт и предложения в комментариях ниже!

Присоединяйтесь к беседе

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