Python є однією з найпопулярніших мов програмування для веб-скрапінгу завдяки своїм потужним бібліотекам та інтуїтивно зрозумілому синтаксису. У цій статті буде розглянуто основи веб-скрапінгу та налаштування середовища для розробки першого веб-скрапера на Python за допомогою бібліотек Beautiful Soup, Playwright і lxml.
Python пропонує безліч бібліотек, які значно спрощують процес веб-скрапінгу. Ось деякі з найпопулярніших і часто використовуваних:
HTTP є основним протоколом для передачі даних в Інтернеті. Під час введення URL в адресному рядку браузера користувачем, протокол генерує HTTP-запит, який надсилається на веб-сервер. У відповідь веб-сервер надсилає HTTP-відповідь, яка містить дані веб-сторінки, які браузер інтерпретує і відображає. У контексті веб-скрапінгу, основне завдання полягає в імітації цього процесу за допомогою скрипта, який автоматично генерує HTTP-запити для вилучення вмісту веб-сторінок.
Перший крок - встановлення Python. Завантажити Python для подальшого встановлення в системі можна з офіційного сайту.
Другий крок - налаштування віртуального середовища для управління залежностями. Для створення й активації віртуального середовища використовуються такі команди:
python -m venv scraping_env
source scraping_env/bin/activate
Далі необхідно встановити пакети за допомогою таких команд:
pip install requests
pip install beautifulsoup4
pip install lxml
Почнемо з простого веб-скрапера, який використовує бібліотеку requests для вилучення статичного HTML-контенту.
Найпоширеніший тип HTTP-запиту - GET-запит, який використовується для отримання даних із зазначеного URL. Ось базовий приклад того, як виконати GET-запит на http://example.com:
import requests
url = 'http://example.com'
response = requests.get(url)
Бібліотека requests надає кілька способів обробки та опрацювання відповіді:
Перевірка статусу коду: переконайтеся, що запит був успішним.
if response.status_code == 200:
print('Request was successful!')
else:
print('Request failed with status code:', response.status_code)
Витяг вмісту: витягніть текст або вміст у форматі JSON із відповіді.
# Отримання вмісту відповіді у вигляді тексту
page_content = response.text
print(page_content)
# Отримання вмісту відповіді у форматі JSON (якщо відповідь у форматі JSON)
json_content = response.json()
print(json_content)
Під час веб-скрапінгу є ризик зіткнутися з різними мережевими та HTTP помилками. Наприклад, ресурс може бути тимчасово недоступний, запит може перевищувати встановлений час очікування, або сервер може повертати помилкові HTTP статуси, як-от 404 (Not Found) або 500 (Internal Server Error). Ці ситуації можуть порушити нормальне виконання скрипта, якщо вони не будуть належним чином оброблені.
import requests
url = 'http://example.com'
try:
response = requests.get(url, timeout=10) # Установка таймаута для запроса
response.raise_for_status() # Вызов ошибки HTTP Error для некорректных ответов
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.ConnectionError:
print('Failed to connect to the server.')
except requests.exceptions.Timeout:
print('The request timed out.')
except requests.exceptions.RequestException as req_err:
print(f'Request error: {req_err}')
else:
print('Request was successful!')
У цій частині ми розглянемо, як можна визначити і витягти дані з HTML-елементів, використовуючи популярні бібліотеки, такі як Beautiful Soup і lxml.
HTML (HyperText Markup Language) - це основна мова розмітки для створення веб-сторінок. Вона використовує вкладені елементи, представлені тегами, такими як <div>, <p>, <a>, та інші. Кожен тег може містити текст, інші теги або обидва ці елементи, а також різні атрибути, які можуть надавати додаткову інформацію про тег.
XPath і CSS-селектори - два інструменти, які надають універсальні способи для вибору елементів на основі їхніх атрибутів або позиції в документі.
Під час веб-скрапінгу часто потрібно точно визначити XPath або CSS селектори для вибору HTML-елементів, з яких потрібно витягти дані. Знайти селектори можна з використанням інструментів розробника браузера.
Сучасні веб-браузери оснащені вбудованими інструментами розробника, що дають змогу вивчати структуру HTML веб-сторінок. Використовуйте наступний покроковий посібник, щоб навчитися користуватися цими інструментами:
XPath: /html/body/div/h1
CSS Selector: body > div > h1
Beautiful Soup - бібліотека Python для парсингу HTML і XML документів. Вона надає прості методи й атрибути для навігації та пошуку за структурою HTML.
from bs4 import BeautifulSoup
import requests
# URL веб-сторінки для скрапінгу
url = 'https://example.com'
# Надсилання HTTP GET запиту на URL
response = requests.get(url)
# Парсинг HTML вмісту відповіді за допомогою Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')
# Використання CSS селектора для пошуку всіх тегів <h1>, які знаходяться всередині тегів <div>,
# які є прямими попередниками тега <body>
h1_tags = soup.select('body > div > h1')
# Ітерація за списком знайдених тегів <h1> і виведення їхнього текстового вмісту
for tag in h1_tags:
print(tag.text)
Помилки парсингу часто виникають, коли структура HTML або XML сторінки відрізняється від очікуваної, що може призвести до проблем під час вилучення даних. Один із найчастіших типів винятків, який може виникнути під час роботи з бібліотеками, такими як Beautiful Soup, - AttributeError.
from bs4 import BeautifulSoup
import requests
# URL веб-сторінки для скрапінгу
url = 'https://example.com'
# Надсилання HTTP GET запиту на URL
response = requests.get(url)
try:
# Парсинг HTML вмісту відповіді за допомогою Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')
# Використання CSS селектора для пошуку всіх тегів <h1>, які знаходяться всередині тегів <div>,
# які є прямими попередниками тега <body>
h1_tags = soup.select('body > div > h1')
# Ітерація за списком знайдених тегів <h1> і виведення їхнього текстового вмісту
for tag in h1_tags:
print(tag.text)
except AttributeError as attr_err:
# Обробка випадків, коли може виникнути AttributeError (наприклад, якщо response.content дорівнює None)
print(f'Attribute error occurred: {attr_err}')
except Exception as parse_err:
# Обробка будь-яких інших винятків, які можуть виникнути під час парсингу
print(f'Error while parsing HTML: {parse_err}')
lxml пропонує глибший рівень контролю та оптимізації, що робить бібліотеку чудовим вибором для обробки великих обсягів даних або особливо складних XML/HTML структур.
from lxml.html import fromstring
import requests
# URL веб-сторінки для скрапінгу
url = 'https://example.com'
# Надсилання HTTP GET запиту на URL
response = requests.get(url)
# Парсинг HTML вмісту відповіді з використанням методу fromstring бібліотеки lxml
parser = fromstring(response.text)
# Використання XPath для пошуку всіх тегів <h1>, які знаходяться всередині тегів <div>,
# які є прямими попередниками тега <body>
title = parser.xpath('/html/body/div/h1/text()')[0]
# Виведення заголовка
print(title)
Як і Beautiful Soup, бібліотека lxml дає змогу обробляти помилки парсингу, включно з виключеннями, як-от lxml.etree.XMLSyntaxError, що виникають за наявності синтаксичних помилок у HTML або XML документах.
from lxml.html import fromstring
from lxml import etree
import requests
# URL веб-сторінки для скрейпінгу
url = 'https://example.com'
# Надсилання HTTP GET запиту на URL
response = requests.get(url)
try:
# Парсинг HTML вмісту відповіді з використанням методу fromstring бібліотеки lxml
parser = fromstring(response.text)
# Використання CSS селектора для пошуку всіх тегів <h1>, які знаходяться всередині тегів <div>,
# які є прямими попередниками тега <body>
title = parser.xpath('/html/body/div/h1/text()')[0]
# Виведення заголовка
print(title)
except IndexError:
# Обробка випадку, коли XPath запит не повертає результатів
print('No <h1> tag found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Обробка помилок синтаксису XML під час парсингу
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Обробка будь-яких інших винятків
print(f'An unexpected error occurred: {e}')
Наступний важливий крок після успішного вилучення даних з HTML-елементів - їх збереження. Python надає безліч опцій для виконання цього завдання, включно з форматами файлів, такими як CSV і JSON.
CSV (Comma-Separated Values) - простий і широко використовуваний формат для зберігання табличних даних. Модуль csv у Python надає зручні інструменти для запису даних у файли CSV.
import csv
# Приклад даних
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Збереження даних у файл CSV
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Paragraph'])
for paragraph in data['paragraphs']:
writer.writerow([data['title'], paragraph])
print('Data saved to scraped_data.csv')
JSON (JavaScript Object Notation) - популярний і легкий формат обміну даними, що добре підходить для зберігання структурованої інформації. Завдяки своїй структурі, JSON ідеально підходить для зберігання даних у вигляді об'єктів або масивів, що робить його особливо корисним для веб-скрапінгу.
import json
# Приклад даних
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Збереження даних у файл JSON
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
print('Data saved to scraped_data.json')
Playwright - потужний інструмент для скрапінгу динамічного контенту і взаємодії з веб-елементами. Він чудово справляється з сайтами, на яких активно використовується JavaScript, що робить його ідеальним вибором там, де традиційні парсери HTML неефективні.
Для встановлення Playwright і його налаштування виконайте такі команди:
pip install playwright
playwright install
Playwright дає змогу взаємодіяти з веб-елементами, такими як заповнення форм і натискання кнопок. Він може очікувати завершення AJAX-запитів перед продовженням, що робить його ідеальним для скрапінгу динамічного контенту. Наведений код демонструє скрапінг сторінки продукту на Amazon з використанням Playwright і lxml.
Спочатку імпортуються необхідні модулі. Визначається функція run, яка починається з налаштування проксі-сервера і запуску нового екземпляра браузера з цим проксі в режимі роботи без інтерфейсу, що дозволяє спостерігати за діями браузера. У контексті браузера відкривається нова сторінка і переходить за вказаним URL продукту на Amazon з тайм-аутом у 60 секунд для повного завантаження сторінки.
Скрипт взаємодіє зі сторінкою, обираючи певний стиль продукту з меню, що випадає, та опцію продукту, використовуючи локатори та зіставлення тексту. Після переконання в тому, що ці взаємодії завершено і сторінка знову повністю завантажена, захоплюється HTML-вміст сторінки.
HTML-вміст потім аналізується з використанням методу fromstring бібліотеки lxml для створення дерева елементів. За допомогою XPath-запиту витягується текстовий вміст назви продукту з певного елемента <span> з ID productTitle. Скрипт включає обробку помилок для керування випадками, коли XPath-запит не повертає результатів, виникають синтаксичні помилки XML під час парсингу або будь-які інші несподівані винятки. Нарешті, виводиться витягнута назва продукту, і контекст браузера та сам браузер закриваються для завершення сеансу.
Функція run виконується в сеансі Playwright, розпочатому за допомогою sync_playwright, що забезпечує управління і виконання всього процесу в контрольованому середовищі. Ця структура забезпечує надійність і стійкість до помилок під час виконання завдання веб-скрапінгу.
from playwright.sync_api import Playwright, sync_playwright
from lxml.html import fromstring, etree
def run(playwright: Playwright) -> None:
# Визначення проксі-сервера
proxy = {"server": "https://IP:PORT", "username": "LOGIN", "password": "PASSWORD"}
# Запуск нового екземпляра браузера із зазначеним проксі та в режимі без інтерфейсу
browser = playwright.chromium.launch(
headless=False,
proxy=proxy,
slow_mo=50,
args=['--ignore-certificate-errors'],
)
# Створення нового контексту браузера
context = browser.new_context(ignore_https_errors=True)
# Відкриття нової сторінки в контексті браузера
page = context.new_page()
# Перехід на зазначену сторінку продукту Amazon
page.goto(
"https://www.amazon.com/A315-24P-R7VH-Display-Quad-Core-Processor-Graphics/dp/B0BS4BP8FB/",
timeout=10000,
)
# Очікування повного завантаження сторінки
page.wait_for_load_state("load")
# Вибір певного стилю товару з меню, що випадає
page.locator("#dropdown_selected_style_name").click()
# Вибір певної характеристики товару
page.click('//*[@id="native_dropdown_selected_style_name_1"]')
page.wait_for_load_state("load")
# Отримання HTML-вмісту завантаженої сторінки
html_content = page.content()
try:
# Парсинг HTML-вмісту з використанням методу fromstring бібліотеки lxml
parser = fromstring(html_content)
# Використання XPath для вилучення текстового вмісту назви продукту
product_title = parser.xpath('//span[@id="productTitle"]/text()')[0].strip()
# Виведення витягнутої назви продукту
print({"Product Title": product_title})
except IndexError:
# Обробка випадку, коли XPath-запит не повертає результатів
print('Product title not found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Обробка синтаксичних помилок XML під час парсингу
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Обробка будь-яких інших винятків
print(f'An unexpected error occurred: {e}')
# Закриття браузера та його контексту
context.close()
browser.close()
# Використання sync_playwright для запуску сесії Playwright і виконання скрипта
with sync_playwright() as playwright:
run(playwright)
Веб-скрапінг з використанням Python є ефективним способом для збору даних з веб-сайтів. Описані інструменти дають змогу витягувати, обробляти та зберігати веб-дані для будь-яких завдань. У цьому процесі проксі-сервери для зміни IP-адрес і затримки між запитами відіграють ключову роль, даючи змогу уникати блокувань. Beautiful Soup є простим у використанні інструментом для новачків, тоді як для обробки великих обсягів даних рекомендується використовувати lxml через його продуктивність. Playwright чудово підходить для просунутих завдань скрапінгу завдяки його можливості ефективно взаємодіяти з динамічно завантажуваними веб-сайтами на JavaScript.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Коментарі: 0