Как парсить сайты и для чего это нужно?
Всем привет! Сегодня сегодня мы поговорим о том как сделать парсер сайтов на python,+ мы поговорим о том как мы можем внедрить парсер в Telegram бота.
Начало
Наша работа будет разделена на 2 части:
- В 1 части мы будем писать парсер.
- В 2 части мы этот парсер внедрим в Telegram бота.
Часть 1
Для начала определимся с тем, что будем парсить. Я подобрал отличный сайт который мог бы отлично подойти под парсинг. И так как я студент колледжа которому принадлежит этот сайт, мне значительно легче и удобнее будет автоматизировать сбор расписания на неделю.
Так что... ПОЕХАЛИ! Мы будем ипользовать две библиотеки: BeautifulSoup и requests
Кратко о библиотеках:
- BeautifulSoup и requests - это библиотеки для языка Python, которые используются для получения данных из Интернета.
- Requests - это библиотека, которая облегчает выполнение HTTP-запросов и управление сеансами. Это означает, что requests позволяет вашему коду получать страницы, изображения и другой контент с Интернета.
- BeautifulSoup - это библиотека для парсинга HTML-кода. Она позволяет коду извлекать конкретные элементы HTML-разметки из веб-страницы и далее обрабатывать их. Пример использования BeautifulSoup - извлечение текста, ссылок и других элементов из HTML-страницы.
Мы импортируем библиотеки которые на понадобятся для парсинга.
import requests
from bs4 import BeautifulSoup as BS
Теперь наша задача отправить get запрос на сайт и зайти в классы в которых мы можем найти нужные нам файлы.
resp = requests.get("https://collegetsaritsyno.mskobr.ru/uchashimsya/raspisanie-kanikuly")
bs = BS(resp.text, "html.parser")
cl = bs.find("div", class_ = "folders")
cl1 = cl.find_all("li", class_ = "pdf")
Теперь мы фильтруем файлы и если файлы с текстовым описанием не "Расписание 1 курс", то мы их пропускаем. А если файл нам подходит, то мы его сохраняем в качестве ссылки на сам файл. И уже в будущем мы сохраняем файл.
for i in cl1:
# Проверяем, содержит ли текст элемента строку "Расписание учебных занятий 1 курс с"
if "Расписание учебных занятий 1 курс с" in i.text:
# Получаем ссылку на PDF файл из атрибута href ссылки
pdf_url = "https://collegetsaritsyno.mskobr.ru" + i.a['href']
# Добавляем ссылку в список lst
lst.append(pdf_url)
# Выполняем запрос GET по ссылке на PDF файл и записываем полученные данные в файл на диск
response = requests.get(pdf_url)
filename = pdf_url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.content)
else:
continue
Вот первая часть подходит к концу. Давайте посмотрим как можно добавить парсер в бота
Часть 2
Импортируются необходимые модули, такие как Bot, Dispatcher, types (из aiogram), logging, requests, BeautifulSoup и os.
from aiogram import Bot, Dispatcher, executor, types
import logging
import requests
from bs4 import BeautifulSoup as BS
from aiogram import types
import os
from aiogram.types import Message, MediaGroup, InputMediaDocument
import random
Далее определяется токен для бота, создается ссылка на бота и его диспетчер (Dispatcher).
logging.basicConfig(level=logging.INFO)
TOKEN = "Token"
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
Далее определяется функция "send_First_Course", которая получает расписание для колледжа с помощью парсинга веб-страницы с помощью requests и BeautifulSoup. Затем проверяется, содержит ли файл "Расписание учебных занятий 1 курс с", и если это так, получается ссылка на файл и он в будущем должен будет загружается и сохранятся на диск.
def send_First_Course():
resp = requests.get("https://collegetsaritsyno.mskobr.ru/uchashimsya/raspisanie-kanikuly")
bs = BS(resp.text, "html.parser")
cl = bs.find("div", class_ = "folders")
cl1 = cl.find_all("li", class_ = "pdf")
for i in cl1:
if "Расписание учебных занятий 1 курс с" in i.text:
pdf_url = "https://collegetsaritsyno.mskobr.ru" + i.a['href']
# Определяем функцию отправки текстовых сообщений в чат Telegram
async def send_text(chat_id: int, message_text: str):
await bot.send_message(chat_id=chat_id, text=message_text)
# Выполняем запрос GET по ссылке на PDF файл и записываем полученные данные в файл на диск
response = requests.get(pdf_url)
filename = pdf_url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.content)
else:
continue
Затем определяются обработчики команд "/command1", "/command2" и "/command3". "/command1" отправляет URL-адрес файла расписания в ответ на запрос пользователя. "/command2" отправляет сам файл в ответ на запрос пользователя, а затем удаляет его с диска. "/command3" отправляет сообщение с ссылкой на чат на Telegram.
# Определяем обработчик команды command1 для отправки одного конкретного файла
async def send_text(chat_id: int, message_text: str):
await bot.send_message(chat_id=chat_id, text=message_text)
@dp.message_handler(commands=['command1'])
async def send_message_handler(message: types.Message):
chat_id = message.chat.id
message_text = pdf_url
await send_text(chat_id, message_text)
# Определяем обработчик команды command2 для отправки PDF файла в чат Telegram
@dp.message_handler(commands=['command2'])
async def send_pdf(message: Message):
# Создаем объект MediaGroup для отправки файла как документа
media = MediaGroup()
media.attach(InputMediaDocument(open(filename, 'rb')))
await message.reply_media_group(media=media)
# Определяем обработчик команды command3 для отправки ссылки на канал в Telegram
@dp.message_handler(commands=['command3'])
async def echo(message: types.Message):
await message.answer("https://t.me/HelloCodeWORLD")
Далее определяется основное тело кода с функцией "executor.start_polling()". Эта функция запускает бота, который начинает слушать сообщения от пользователей и отправлять ответы в соответствии с определенными командами.
# Вызов главной функции
send_First_Course()
# Запуск проекта
if __name__ == "__main__":
executor.start_polling(dp,skip_updates = True)
Ну чтож на этом все. Надеюсь вы смогли подчеркнуть, что то полезное для себя!