Вебскрапінг на Perl

Вебскрапінг у Perl: покроковий посібник

У цьому посібнику я розповім про все, що вам потрібно знати, щоб почати вебскрапінг у Perl, зокрема про інструменти, які ви використовуватимете, про те, як витягувати дані, і як розв’язувати щоденні виклики. Після завершення цього туторіалу ви зможете збирати дані з більшості сайтів і працювати з інформацією, яку зібрали. Тож занурмося.

Що таке вебскрапінг?

Вебскрапінг Вебскрапінг — це процес вилучення даних із вебсайтів. Він передбачає отримання HTML-вмісту вебсторінки, а потім його парсинг, щоб знайти й зібрати потрібні дані. Дані, які ви збираєте, можуть включати текст, зображення або інші загальнодоступні ресурси в інтернеті. Вебскрапінг широко використовують у data mining, дослідженнях і аналізі.

Однак важливо пам’ятати, що вебскрапінг має відповідати умовам користування сайту, оскільки скрапінг іноді може порушувати їхні правила. Завжди переконайтеся, що ви можете збирати дані з сайту, і respect their robots.txt file.

Покращте свою операцію зі скрапінгу

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

  1. Bright Data — Best overall for advanced scraping; features extensive proxy management and reliable APIs.
  2. Octoparse — Зручний no-code інструмент для автоматизованого вилучення даних із вебсайтів.
  3. ScrapingBee — API, орієнтований на розробників, який ефективно працює з проксі, браузерами та CAPTCHA.
  4. Scrapy — Фреймворк з відкритим кодом для Python, ідеальний для завдань краулінгу даних і вебскрапінгу.
  5. ScraperAPI — Handles tough scrapes with advanced anti-bot technologies; great for developers.

Важливо! Я не пов’язаний із жодним із постачальників, згаданих вище. Тепер продовжуймо.

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

Perl — ідеальний вибір для вебскрапінгу, тому що:

  • Text Processing Power: Perl добре відомий своєю здатністю обробляти й витягувати текст, що є критично важливим для вебскрапінгу сторінок.
  • Rich Libraries: Існує чимало модулів Perl, як-от LWP, HTTP::Tiny та HTML::Parser, які спрощують цей процес.
  • Cross-Platform: Perl працює на різних платформах, як-от Windows, Linux і macOS, що робить його універсальним для різних середовищ.

Налаштування Perl для вебскрапінгу

Перш ніж почати вебскрапінг сайтів, потрібно встановити Perl і необхідні модулі.

Крок 1: Встановіть Perl

If you don’t have Perl installed on your system, you can download it from perl.org. On Linux and macOS, Perl usually comes pre-installed. On Windows, you can install Strawberry Perl, which includes a full Perl environment.

Крок 2: Встановіть потрібні модулі

Щоб спростити вебскрапінг, вам знадобиться кілька модулів Perl. Найпоширеніші з них:

  • LWP::UserAgent — Для обробки HTTP-запитів.
  • HTML::Parser — Щоб розбирати HTML-вміст.
  • Mojo::DOM — Легкий DOM-парсер, подібний до jQuery.
  • URI — Для розбору URL.

Ви можете встановити ці модулі за допомогою CPAN (Comprehensive Perl Archive Network):

cpan LWP::UserAgent HTML::Parser Mojo::DOM URI

Альтернативно можна використати cpanm (CPAN Minus), щоб встановити модулі:

cpanm LWP::UserAgent HTML::Parser Mojo::DOM URI

Базовий вебскрапінг у Perl

Let’s start by scraping data from a simple website. We’ll use LWP::UserAgent for HTTP requests and HTML::Parser to extract the data.

Приклад 1: Вебскрапінг заголовків із сайту

Уявіть, що ви хочете виконати вебскрапінг заголовків статей із новинного сайту. Ось як це можна зробити:

Уявіть, що ви хочете виконати вебскрапінг заголовків статей із новинного сайту. Ось як це можна зробити:

use LWP::UserAgent;
use HTML::Parser;
# Create a user agent object
my $ua = LWP::UserAgent->new;
# Specify the URL you want to scrape
my $url = 'https://example.com';
# Make the HTTP request
my $response = $ua->get($url);
# Check if the request was successful
if ($response->is_success) {
my $html_content = $response->decoded_content;
# Create a new HTML parser
my $parser = HTML::Parser->new(api_version => 3);
# Define how to handle the data
$parser->handler(start => &start_tag, "tagname, attr, text");
# Parse the HTML content
$parser->parse($html_content);
} else {
die "Error fetching $url: " . $response->status_line;
}
# Function to handle the start of a tag
sub start_tag {
my ($tagname, $attr, $text) = @_;
# Check for

теги (або будь-який інший тег, у якому містяться заголовки)


if ($tagname eq 'h2') {
print "Title: $textn";
}
}

Пояснення коду:

  • LWP::UserAgent використовується для надсилання HTTP-запиту до вебсайту.
  • HTML::Parser використовується для розбору HTML-вмісту. Він визначає

    теги (які зазвичай містять заголовки статей) і виводить їх.

  • The function start_tag is called whenever the parser encounters a tag. We check if the tag is

    і вивести вміст.

Приклад 2: Вебскрапінг даних за допомогою Mojo::DOM

Mojo::DOM — це сучасна потужна бібліотека для вебскрапінгу в Perl. Вона спрощує навігацію HTML-вмістом, надаючи інтерфейс, схожий на jQuery.

use Mojo::DOM;
use LWP::UserAgent;
# Initialize user agent
my $ua = LWP::UserAgent->new;
# Specify the URL to scrape
my $url = 'https://example.com';
# Make HTTP request
my $response = $ua->get($url);
my $html_content = $response->decoded_content;
# Create Mojo DOM object
my $dom = Mojo::DOM->new($html_content);
# Extract all

titles


for my $title ($dom->find('h2')->each) {
print "Title: " . $title->text . "n";
}

Explanation:

  • Mojo::DOM спрощує вибір і перебір HTML-елементів.
  • The $dom->find(‘h2’) method finds all

    теги, а метод each дає змогу ітеруватися по кожному елементу.

Handling Dynamic Content

Деякі сайти динамічно завантажують вміст за допомогою JavaScript. Вбудовані модулі Perl не можуть безпосередньо обробляти JavaScript, але є способи обійти це.

Рішення: використання headless-браузерів

Щоб вебскрапити динамічний вміст, можна використати безголовий браузер, наприклад Selenium. Хоча в Perl немає прямого модуля Selenium, ви можете керувати Selenium через його WebDriver API.

Ось простий приклад із використанням Selenium::Remote::Driver:

use Selenium::Remote::Driver;
# Create a new Selenium driver instance
my $driver = Selenium::Remote::Driver->new;
# Navigate to a website
$driver->get('https://example.com');
# Wait for the page to load
sleep 5;
# Extract the page source
my $html_content = $driver->get_page_source;
# Process HTML content as needed
print $html_content;
# Close the driver
$driver->quit;

Explanation:

Selenium — потужний інструмент для автоматизації веббраузерів. У наведеному вище прикладі використано безголовий браузер, щоб завантажити сторінку й отримати HTML-вміст.

Handling Anti-Scraping Measures

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

  1. Use User-Agent Rotation — Багато сайтів блокують запити на основі user agent. Використовуйте різні рядки user-agent. Докладніше про те, як використовувати user-agents для вебскрапінгу.
  2. Limit Request Frequency — Не перевантажуйте сервер надто великою кількістю запитів. Впровадьте паузи між запитами.
  3. Use Proxy Servers — Ротуйте IP-адреси за допомогою проксі, щоб зменшити ймовірність блокування. Ознайомтеся з моїм список найкращих ротаційних проксі.

Ось приклад налаштування власного user-agent у Perl:

use LWP::UserAgent;
# Create a user agent object with a custom user-agent string
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36');
# Send a request
my $response = $ua->get('https://example.com');

Storing Scraped Data

Після того як ви зібрали дані, вам, імовірно, захочеться зберегти їх для подальшого використання. Дані можна зберігати в:

  • CSV-файли — Корисно для структурованих даних.
  • Databases — Якщо вам потрібні потужніші можливості запитів і збереження даних.
  • JSON — Ідеально підходить для ієрархічних або вкладених даних.

Ось як зберегти зібрані заголовки у файл CSV:

use Text::CSV;
# Create a new CSV object
my $csv = Text::CSV->new({ binary => 1, auto_diag => 1 });
# Open a CSV file for writing
open my $fh, '>', 'titles.csv' or die "Не вдалося відкрити файл: $!";
# Write the header row
$csv->say($fh, ["Title"]);
# Write the scraped titles to the CSV
for my $title ($dom->find('h2')->each) {
$csv->say($fh, [$title->text]);
}
# Close the file
close $fh;

Explanation:

  • Text::CSV є простим модулем Perl для читання та запису CSV-файлів.
  • Наведений вище код зберігає зібрані заголовки у файл CSV із заголовком.

Conclusion

Вебскрапінг у Perl і в 2025 році залишається потужним і ефективним інструментом. Використовуючи правильні модулі, такі як LWP::UserAgent, HTML::Parser і Mojo::DOM, ви легко можете витягувати дані з вебсайтів. Незалежно від того, чи потрібно вам скрапити статичний HTML, чи динамічний контент, Perl пропонує відповідні рішення. За умови правильних технік і етичних практик вебскрапінг може стати неоціненним навичком для збирання даних з вебу.

Схожі записи