Парсер. Начнем с того, что это такое? Парсер — это программа (скрипт), которая обрабатывает входные данные (часто текстовые, реже — изображения или видео) согласно определённым правилам, извлекает нужную информацию и преобразует её в структурированный формат.
Основное назначение парсера — сбор информации, преимущественно с веб-сайтов.
1. Выбор языка программирования
Написать парсер можно практически на любом языке, но я покажу примеры на Python с использованием простых в освоении библиотек.
2. Основные типы парсеров
2.1. Регулярные выражения
Самый простой способ обработки текста по шаблонам:
import re
text = "Email: user@example.com"
match = re.search(r'([\w\.-]+)@([\w\.-]+)', text)
if match:
print(match.group()) # user@example.com
Здесь используется библиотека re
для работы с регулярными выражениями. Метод re.search
помогает найти и извлечь нужный фрагмент текста. Регулярные выражения сложны на первых порах, но после освоения становятся мощным инструментом.
2.2. Парсеры для HTML
Большинство ассоциирует парсеры именно с веб-скрейпингом. Для этого потребуются библиотеки BeautifulSoup
и lxml
:
BeautifulSoup
— популярная библиотека для извлечения данных из HTML
lxml
— инструмент для обработки HTML через XPath и CSS-селекторы
Пример с lxml
:
from lxml import html
html_content = """
<html>
<body>
<h1>Hello, World!</h1>
<p class="text">This is a paragraph.</p>
<a href="https://example.com">Link</a>
</body>
</html>
"""
tree = html.fromstring(html_content)
h1 = tree.xpath('//h1/text()')[0]
p_text = tree.xpath('//p[@class="text"]/text()')[0]
link = tree.xpath('//a/@href')[0]
print(h1) # "Hello, World!"
print(p_text) # "This is a paragraph."
print(link) # "https://example.com"
Пример с BeautifulSoup
:
from bs4 import BeautifulSoup
html = """
<html>
<body>
<h1>Hello, World!</h1>
<p class="text">This is a paragraph.</p>
<a href="https://example.com">Link</a>
</body>
</html>
"""
soup = BeautifulSoup(html, 'lxml')
h1 = soup.find('h1').text
p_text = soup.find('p', class_='text').text
link = soup.find('a')['href']
print(h1) # "Hello, World!"
print(p_text) # "This is a paragraph."
print(link) # "https://example.com"
3. Обработка ошибок
Хороший парсер должен:
Чётко сообщать об ошибках (место и причину)
По возможности продолжать работу после сбоев
Предоставлять контекст (номер строки, позицию)
try:
# код парсераexcept SomeParserError as e:
print(f"Ошибка в строке
{e.line_num}: {e.message}"
)
Рекомендую использовать модуль
logging
для сложных парсеров с многоступенчатой обработкой.
4. Этические аспекты
Соблюдайте авторские права и условия использования
Не перегружайте серверы (добавляйте задержки 5-15 сек)
Предпочитайте официальные API парсингу
5. Практические примеры
Пример 1:
import requests
from bs4 import BeautifulSoup
url = 'https://www.example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1').text if soup.find('h1') else 'No title'
paragraphs = [p.text for p in soup.find_all('p')]
links = [a['href'] for a in soup.find_all('a', href=True)]
print(
{
'title': title,
'paragraphs': paragraphs,
'links': links
}
)
Пример 2:
import requests
from lxml import html
url = 'https://www.example.com'
response = requests.get(url)tree = html.fromstring(response.content)
title = tree.xpath('//h1/text()')[0] if tree.xpath(
'//h1/text()'
) else 'No title'
paragraphs = tree.xpath('//p/text()')
links = tree.xpath('//a/@href')
print({
'title': title,
'paragraphs': paragraphs,
'links': links
}
)
Больше практикуйтесь.
И да прибудем с вами сила.