29 апреля 2025 года

Базовые навыки написания парсера - руководство для начинающих

Parser Python Пайтон Beautifulsoup Requests Парсер

Парсер. Начнем с того, что это такое? Парсер — это программа (скрипт), которая обрабатывает входные данные (часто текстовые, реже — изображения или видео) согласно определённым правилам, извлекает нужную информацию и преобразует её в структурированный формат.


Основное назначение парсера — сбор информации, преимущественно с веб-сайтов.


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

}

)


Больше практикуйтесь. 
И да прибудем с вами сила.

Если вы хотите обсудить статью или у вас есть вопросы, то можете это сделать в Телеграм канале.