Парсинг сайта new-science.ru с BeautifulSoup: пошаговое руководство для начинающих
Если вы осваиваете парсинг веб-страниц на Python, библиотека BeautifulSoup (bs4) - один из лучших инструментов для старта. В этой статье мы на практическом примере разберём, как спарсить результаты поиска с сайта new-science.ru. Вы узнаете, как анализировать HTML-код, извлекать заголовки статей и ссылки, а также обрабатывать пагинацию. Код проекта доступен на GitHub по ссылке: github.com/AlexGame2012/habr.git.
Подготовка к парсингу: инструменты и библиотеки
Для работы вам понадобится Python 3, а также установленные библиотеки requests и beautifulsoup4. Установите их через pip:
pip install requests beautifulsoup4Также рекомендуется использовать lxml в качестве парсера - он быстрее и стабильнее стандартного html.parser. Установите его командой:
pip install lxmlАнализ структуры страницы new-science.ru
Перед написанием кода важно изучить HTML-код страницы с результатами поиска. Откройте в браузере ссылку: https://new-science.ru/?s=глобальное+потепление и нажмите F12 (Инструменты разработчика). Обратите внимание на контейнеры, в которых находятся статьи. Обычно это элементы article или div с определёнными классами. В случае new-science.ru каждая статья обёрнута в <article class="post-card">. Внутри находятся заголовок <h2 class="entry-title"> и ссылка <a href="...">.
Написание парсера на BeautifulSoup
Создайте файл parser.py и импортируйте необходимые модули:
import requests
from bs4 import BeautifulSoupОтправьте GET-запрос к странице поиска:
url = 'https://new-science.ru/?s=глобальное+потепление'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')Теперь найдите все карточки статей и извлеките из них данные:
articles = soup.find_all('article', class_='post-card')
for article in articles:
title_tag = article.find('h2', class_='entry-title').find('a')
title = title_tag.text.strip()
link = title_tag['href']
print(f'{title}: {link}')Этот код выведет список заголовков и ссылок на статьи из первой страницы поиска.
Обработка пагинации: парсинг всех страниц
Чтобы собрать данные со всех страниц результатов, нужно найти кнопку «Далее» или определить параметр пагинации в URL. На new-science.ru пагинация реализована через параметр page. Например, вторая страница: https://new-science.ru/page/2/?s=глобальное+потепление. Напишите цикл, который перебирает страницы, пока не достигнет последней:
page = 1
while True:
url = f'https://new-science.ru/page/{page}/?s=глобальное+потепление'
response = requests.get(url)
if response.status_code != 200:
break
soup = BeautifulSoup(response.text, 'lxml')
articles = soup.find_all('article', class_='post-card')
if not articles:
break
for article in articles:
# извлечение данных
pass
page += 1Не забудьте добавить задержку между запросами (time.sleep(1)), чтобы не перегружать сервер.
Сохранение результатов в файл
Для удобства сохраните спарсенные данные в CSV или JSON. Пример сохранения в CSV с помощью модуля csv:
import csv
with open('articles.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Title', 'Link'])
for title, link in data:
writer.writerow([title, link])Теперь у вас есть структурированный файл, который можно использовать для дальнейшего анализа.
Типичные ошибки и их решение
- Ошибка 403 (Forbidden): сайт блокирует автоматические запросы. Добавьте заголовок User-Agent в запрос:
headers = {'User-Agent': 'Mozilla/5.0'}. - Пустой результат: проверьте, не изменилась ли структура HTML. Используйте
print(soup.prettify())для отладки. - Бесконечный цикл пагинации: всегда проверяйте, есть ли на странице статьи, и устанавливайте лимит страниц.
Заключение
Парсинг new-science.ru с BeautifulSoup - отличная практика для новичков. Вы научились анализировать HTML, извлекать данные и обрабатывать пагинацию. Исходный код проекта вы найдёте на GitHub. Экспериментируйте, добавляйте новые поля (дату, автора) и адаптируйте парсер под другие сайты.