Лекция - Создание парсера сайтов на Python

Professor

Professional
Messages
213
Reaction score
22
Points
18
Парсер сайтов сайтов на Python.

Парсинг веб-страниц - это процесс автоматического сбора данных с веб-сайтов. Он позволяет извлекать информацию, такую как тексты, ссылки, изображения и другие данные, из HTML-кода страниц. Парсинг широко используется в различных областях, таких как анализ данных, мониторинг цен, агрегация новостей, исследования рынка и многое другое.

Представьте, что вы хотите собрать информацию о ценах на товары с нескольких интернет-магазинов для сравнения. Вручную посещать каждый сайт и записывать цены будет очень утомительно и трудоемко. Вместо этого вы можете написать программу на Python, которая автоматически посетит эти сайты, извлечет данные о ценах и сохранит их в структурированном виде. Это и есть парсинг веб-страниц.

Для парсинга мы будем использовать две популярные библиотеки Python: Requests и BeautifulSoup.
Requests - это библиотека, которая позволяет отправлять HTTP-запросы и получать ответы от веб-серверов. С её помощью мы можем загружать HTML-код веб-страниц.

BeautifulSoup - это библиотека для обработки и извлечения данных из HTML и XML документов. Она предоставляет удобный интерфейс для навигации по дереву документа и поиска нужных элементов.
Давайте начнем с установки этих библиотек. Открываем терминал и выполняем следующие команды:
Python:
pip install requests
pip install beautifulsoup4

Теперь мы готовы к написанию кода. Импортируем необходимые библиотеки в наш скрипт:
Python:
Copy codeimport requests
from bs4 import BeautifulSoup

Следующий шаг - определить функцию, которая будет выполнять парсинг. Назовем её parse_data(). Внутри этой функции мы будем отправлять HTTP-запросы, получать HTML-код страницы и извлекать нужные данные.

Но прежде чем отправлять запросы, нам нужно позаботиться о том, чтобы сайт не заблокировал нас, приняв за бота. Для этого мы можем установить специальные заголовки (headers) и куки (cookies) в наших запросах, чтобы имитировать поведение обычного браузера.

Следующий шаг - определить функцию, которая будет выполнять парсинг. Назовем её parse_data(). Внутри этой функции мы будем отправлять HTTP-запросы, получать HTML-код страницы и извлекать нужные данные.

Но прежде чем отправлять запросы, нам нужно позаботиться о том, чтобы сайт не заблокировал нас, приняв за бота. Для этого мы можем установить специальные заголовки (headers) и куки (cookies) в наших запросах, чтобы имитировать поведение обычного браузера.

Python:
Copy codeheaders = {[/SIZE][/CENTER]
[SIZE=7][CENTER]    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'https://www.google.com/',
    'Connection': 'keep-alive',
}

cookies = {
    'session_id': 'abc123def456',
    'user_token': '1234567890',
}

Обратите внимание, что значения заголовков и куки могут отличаться в зависимости от сайта, который вы парсите. Иногда вам нужно будет исследовать сайт и посмотреть, какие заголовки и куки он ожидает от браузера.

Теперь мы можем отправить GET-запрос на нужную страницу, передав заголовки и куки:
Python:
Copy codeurl = 'https://example.com/page'[/SIZE][/CENTER][/SIZE][/CENTER]
[SIZE=7][CENTER][SIZE=7][CENTER]response = requests.get(url, headers=headers, cookies=cookies)

Если запрос успешен (код ответа 200), мы получим HTML-код страницы в объекте response. Чтобы начать обработку этого кода, создадим объект BeautifulSoup:
Python:
Copy codesoup = BeautifulSoup(response.content, 'html.parser')

Объект soup представляет собой дерево HTML-документа, по которому мы можем перемещаться и искать нужные элементы с помощью различных методов.

Допустим, нам нужно найти все элементы <div> с классом "product" на странице. Мы можем сделать это так:
Python:
Copy codeproducts = soup.find_all('div', class_='product')

Метод find_all() вернет список всех подходящих элементов. Затем мы можем перебрать этот список и извлечь нужные данные из каждого элемента:
Python:
Copy codefor product in products:[/SIZE][/CENTER]
[SIZE=7][CENTER]    name = product.find('h3', class_='product-name').text.strip()
    price = product.find('span', class_='product-price').text.strip()
    print(f'Name: {name}, Price: {price}')

Здесь мы находим элементы с классами "product-name" и "product-price" внутри каждого элемента product, извлекаем их текстовое содержимое с помощью атрибута text и очищаем от лишних пробелов с помощью метода strip().

Давайте рассмотрим еще несколько полезных методов BeautifulSoup:
  • find(): находит первый элемент, соответствующий заданным критериям.
  • find_all(): находит все элементы, соответствующие заданным критериям.
  • get_text(): получает текстовое содержимое элемента, включая содержимое всех вложенных элементов.
  • get(): получает значение указанного атрибута элемента.

Вот примеры использования этих методов:
Copy code# Найти первый элемент <h1> на странице
title = soup.find('h1')

# Найти все элементы <a> внутри <div> с классом "menu"
menu_links = soup.find('div', class_='menu').find_all('a')

# Извлечь текст из элемента
text = element.get_text()

# Извлечь значение атрибута "href" из ссылки
url = link.get('href')

Помните, что структура HTML-кода может меняться со временем, поэтому ваши селекторы должны быть достаточно гибкими. Если парсер перестает работать из-за изменений на сайте, не бойтесь исследовать HTML-код в инспекторе браузера и адаптировать свой код соответственно.
Еще один важный аспект парсинга - обработка исключений и ошибок. Иногда страница может быть недоступна, или элемент, который вы ищете, отсутствует на странице. Чтобы ваш парсер не завершался с ошибкой в таких случаях, используйте блоки try-except:
Python:
Copy codetry:[/SIZE][/CENTER]
 [SIZE=7][CENTER]    title = soup.find('h1', class_='page-title').text.strip()
 except AttributeError:
     title = 'Заголовок не найден'

Теперь давайте рассмотрим более полный пример парсера, который извлекает последние новости с сайта:
Python:
Copy codeimport requests
 from bs4 import BeautifulSoup
 
 def parse_news():
     url = 'https://example.com/news'
    
     response = requests.get(url)
     soup = BeautifulSoup(response.text, 'html.parser')
    
     news_list = soup.find('ul', class_='news-list')
     news_items = news_list.find_all('li')
    
     for item in news_items:
         title = item.find('h2').text.strip()
         description = item.find('p').text.strip()
         date = item.find('span', class_='date').text.strip()
        
         print(f'Title: {title}')
         print(f'Description: {description}')
         print(f'Date: {date}')
         print('---')
 
 parse_news()

В этом примере мы находим список новостей по селектору ul.news-list, а затем извлекаем заголовок, описание и дату из каждого элемента новости.

На этом мы завершаем нашу лекцию о парсинге веб-страниц с помощью Python. Конечно, это только начало, и для более сложных задач парсинга вам понадобится больше знаний и практики. Но я надеюсь, что эта лекция дала вам хорошую отправную точку и вдохновила на дальнейшее изучение.
А я вам с этим обязательно помогу! С каждой новой лекцией мы будем разбирать различные темы, которые вы можете предлагать мне в личке!

Если у вас есть вопросы - не стесняйтесь задавать. Желаю вам успехов в ваших проектах по парсингу!
 
Top