Вебскрапінг із 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 недостатньо для конкретних сценаріїв використання.

Наприклад, ви можете захотіти виконувати вебскрапінг сайтів електронної комерції, щоб витягувати ціни на товари, описи або зображення. Потім ці дані можна використовувати для порівняння, аналізу або просто зберегти для подальшого використання.

Чому PHP для вебскрапінгу?

While Python and JavaScript мають багато бібліотек для скрапінгу, таких як ScrapyРазом із BeautifulSoup і Puppeteer, PHP також добре підходить для вебскрапінгу з кількох причин:

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

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

Leveraging Advanced Proxies

Іноді вебскрапінг може наштовхуватися на такі перешкоди, як Блокування IP-адрес або CAPTCHAs. Коли це стається, інтеграція просунутого проксі-сервісу може допомогти вашому вебскраперу працювати без збоїв. проксі-рішення 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: Для надсилання HTTP-запитів і розбору HTML-вмісту вам знадобляться Simple HTML DOM Parser і cURL (який попередньо встановлений у PHP).

Встановіть PHP і потрібні бібліотеки

  1. Завантажте та встановіть PHP з Офіційний вебсайт PHP.
  2. У Windows можна використовувати такі інструменти, як XAMPP або WAMP, які забезпечують зручне середовище для розробки PHP.
  3. Завантажте Simple HTML DOM Parser from 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
if ($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\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 as $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 "Продукт: $name\n";
echo "Ціна: $price\n";
echo "URL зображення: $image\n";
echo " - - - - - - - - - - - -\n";
}
?>

Тут ми використовуємо селектор .product, щоб знайти кожен товар на сторінці, а потім витягнути для кожного товару назву, ціну та URL зображення. Ви можете налаштувати CSS-селектори залежно від фактичної структури сайту, який ви скрапите.

Крок 5: Збереження даних у CSV-файл

Після того як ви витягнете дані, вам, імовірно, захочеться зберегти їх для подальшого використання. Поширений спосіб зробити це — експортувати дані в CSV-файл. У PHP є вбудовані функції для роботи з CSV-файлами, тож це легко.

Експорт даних у CSV

<?php
// Array of scraped product data
$productData = [
['Назва' => 'Product 1', 'Price' => '$10.00', 'URL зображення' => 'https://example.com/image1.jpg'],
['Назва' => 'Продукт 2', 'Price' => '$20.00', '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 as $product) {
fputcsv($file, $product);
}
// Close the CSV file
fclose($file);
// Output a success message
echo "CSV-файл успішно створено: $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.
  • Rate Limiting: Уникайте надсилання занадто великої кількості запитів за короткий проміжок часу, щоб не бути заблокованими. Ви можете додати затримки між запитами за допомогою 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();
function scraper($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);
if ($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 as $product) {
$name = $product->find(".woocommerce-loop-product__title", 0);
$image = $product->find("img", 0);
$price = $product->find("span.price", 0);
if ($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);
if ($nextPageLink) {
$nextPageUrl = $nextPageLink->href;
scraper($nextPageUrl); // Recursively scrape the next page
}
}
// Start scraping from the first page
scraper($url);
// Output the collected data
print_r($productData);
?>

Цей скрипт використовує cURL для отримання HTML-вмісту, аналізує його за допомогою Simple HTML DOM Parser і шукає дані про товари (назву, ціну та URL зображення). Потім він шукає посилання на сторінку «Next» і рекурсивно збирає дані з усіх сторінок, доки не закінчаться посилання.

2. Обробка динамічного контенту в PHP

Деякі вебсайти використовують JavaScript для динамічного завантаження контенту після початкового завантаження сторінки. Простий HTML DOM Parser не підходить для таких сайтів, оскільки він обробляє лише статичний HTML. Для динамічного контенту нам потрібен headless browser, наприклад Selenium, який може рендерити JavaScript.

Крок 1: Використання Selenium із PHP

Selenium дає змогу імітувати реального користувача, керуючи браузером програмно. Для PHP можна використати пакет php-webdriver, щоб взаємодіяти із Selenium 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 Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
require_once("vendor/autoload.php");
$host = "http://localhost:4444/"; // Local Selenium server
$capabilities = DesiredCapabilities::chrome();
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments([" - headless"]); // Run Chrome in headless mode
$capabilities->setCapability(ChromeOptions::CAPABILITY_W3C, $chromeOptions);
$driver = RemoteWebDriver::create($host, $capabilities);
function scraper($driver) {
$driver->manage()->window()->maximize();
$products = $driver->findElements(WebDriverBy::cssSelector(".product-container"));
foreach ($products as $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 "URL зображення: $image_url\n";
}
}
// Open the target page
$driver->get("https://www.scrapingcourse.com/infinite-scrolling");
$lastHeight = $driver->executeScript("return document.body.scrollHeight");
while (true) {
$driver->executeScript("window.scrollTo(0, document.body.scrollHeight);");
sleep(2);
$newHeight = $driver->executeScript("return document.body.scrollHeight");
if ($newHeight == $lastHeight) {
scraper($driver);
break;
}
$lastHeight = $newHeight;
}
// Close the browser
$driver->quit();
?>

У цьому коді ми використовуємо Selenium, щоб відкрити вебсторінку, прокрутити її та витягнути дані, які динамічно рендеряться JavaScript. Після прокручування донизу сторінки та переконання, що весь вміст завантажився, скрейпер витягує назву товару, ціну та URL зображення.

3. Як уникати блокувань під час вебскрапінгу з PHP

Багато вебсайтів застосовують антибот-захист, наприклад блокування IP-адрес, CAPTCHA або rate limiting, щоб запобігти вебскрапінгу. Щоб обійти ці обмеження, можна використовувати такі техніки, як ротація IP-адрес і імітація поведінки легітимного користувача.

Крок 1: Використовуйте проксі, щоб уникнути виявлення

Один із ефективних способів уникнути блокування — використовувати проксі. Чергуючи проксі для кожного запиту, ви можете не запускати антибот-системи, які позначають численні запити з однієї IP-адреси.

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

Крок 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;
?>

Conclusion

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!

 

Схожі записи