1. Введение
Цель данной статьи - заинтересовать вас скрапингом сайтов, чтобы вы захотели прокачать себя в этом направлении и познакомить с библиотекой BeautifulSoup. Мы напишем небольшой скрипт, который будет заходить на сайт с турами для пляжного отдыха и искать самые дешевые из них.
Весь код вы можете посмотреть на GitHub.
2. Прежде чем начать
Создайте новый проект и файл main.py в используемой вами IDE или редакторе. Установите библиотеку beautifulsoup4:
pip install beautifulsoup4
Основную информацию по этой библиотеке можно посмотреть тут.
3. Логика приложения
После того как вы установили beautifulsoup4, мы можем написать основную логику нашего приложения.
Сначала импортируйте все необходимые модули, которые нам понадобятся:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
А затем напишите код, указанный ниже.
Разберем подробно что тут происходит:
- if __name__ == "__main__" - проверяет, используем ли мы скрипт как библиотеку (т.е. используем import main.py), или же запускаем его как основной файл.
- html = urlopen('https://www.turcentr.by/pob.php') - открываем web-страничку и получаем объект с которым можно работать как с менеджером контекста.
- bsobj = BeautifulSoup(html) - создаем объект BeautifulSoup. Это позволяет нам автоматически отформатировать и представить HTML-страницу в виде Python объектов, представляющих собой XML-структуры.
- prices = get_all_prices() - наша собственная функция. Она вернет нам все цены туров на страничке.
- prices = get_min_prices(prices) - наша собственная функция. Она вернет нам только самые низкие цены для каждого тура.
- countries = get_countries() - наша собственная функция. Она вернет нам список стран, куда мы можем поехать отдыхать.
- print_best_tours(countries, prices) - распечатывает список в следующем виде: страна и цена тура. Примерный результат нашей программы показан на рисунке ниже.
8. По желанию, вы также можете раскомментировать строчку ниже, чтобы вводить желаемую цену с консоли:
desired_price = input('Введите желаемую цену тура: ')
и подставить в print_best_tours в качестве 3-го аргумента. По умолчанию этот параметр равен = 900 р. Заметьте, что вы должны будете ввести 3-х или 4-х значное число и преобразовать его в тип int, потому что я забыл это сделать :).
4. get_all_prices()
В этой функции мы используем созданный ранее объект BeautifulSoup и находим все теги (метод findAll) в которых содержится текст, удовлетворяющий нашему регулярному выражению. Вы можете прочитать в комментариях, какая часть регулярного приложения за что отвечает, но в итоге мы хотим найти теги в которых есть что-то похожее на это "1 235,00 р." или на это "834,00 р.".
Параметр re.VERBOSE позволяет нам написать регулярное выражение в развернутом виде, с комментариями, в противном случае нам бы пришлось написать все это выражение в одну строку, что значительно ухудшило бы понимание того, для чего и как это выражение работает.
5. get_min_prices(prices)
На используемом нами сайте, у каждого тура есть 3 цены в зависимости от выбранного отеля. Так как мы хотим заплатить как можно меньше, то из всех цен сохраняем только цены для отелей с 3-мя звездами.
Вы могли заметить, что при создании списка минимальных цен используется функция clear_price(price). Все что она делает, это оставляет только целую часть цены, убирая лишние пробелы, разделитель, дробную часть и символ р с точкой в конце.
6. get_countries()
Аналогично get_all_prices(), только теперь мы ищем названия стран в которых нам предлагают отдохнуть.
Одно важное отличие состоит в том, что теперь мы в метод findAll передаем другие аргументы, а именно, тег 'p' - абзац, который должен иметь атрибут class = 'r_title'.
7. print_best_tours(countries, prices, desired_price=900):
В этой функции мы объединяем список стран и список цен: zip(..., ...), возвращаем новый список, отсортированный по цене, с помощью метода sorted() и выводим только те туры, которые удовлетворяют нашей желаемой цене: desired_price.
Теперь вы можете запустить код и проверить, что он работает. Как я писал выше, весь код выложен на GitHub в public репозиторий, поэтому вам не обязательно вводить весь код вручную.
Если вам не понятно как в данном случае происходит сортировка, вы можете прочитать мою статью по сортировке списков.
Заключение.
На этом все. Спасибо, что дочитали до конца. Ставьте лайки, подписывайтесь на канал и приходите снова. В разделе "Полезные ссылки" вы найдете замечательную книгу для скрапинга сайтов, если вас заинтересовала эта тема.
Полезные ссылки
1. Скрипт на GitHub
2. BeautifulSoup
3. Книга: Скрапинг веб-сайтов с помощью Python, автор: Райан Митчел.
4. Сортировка списков
5. CrazyPython