Очень часто возникает необходимость вытащить какую-то информацию с сайтов, в которых отсутствует API. Приходится применять технику, которая называется парсинг. Парсинг - это анализ исходного HTML кода веб-страницы и извлечение необходимых нам кусочков информации. Как получить HTML код любой веб-страницы с помощью requests.get(), было рассказано в предыдущем уроке. В данной статье, поговорим о парсинге.
Есть два пути вытаскивания нужных отрезков информации из HTML кода веб страниц
- С использованием регулярных выражений
- С использованием специальных модулей
Что такое регулярные выражения, мы разберем в следующих уроках. Скажу лишь, что применять регулярки для парсинга веб страниц нецелесообразно. Гораздо удобнее использовать готовые модули.
Рассмотрим один из таких модулей - Beautiful Soup. Он позволяет получать любые кусочки HTML кода и текста, делая выборку на основе указанных селекторов - классов или id искомых тегов. В этом он сильно похож на JQuery, если кто-то из вас занимается созданием сайтов, понять что такое селекторы не составит труда. Для остальных поясним:
Любая веб страница представляет из себя набор HTML тегов - специальных слов, которые заключены в скобки из значков больше-меньше. Например тег ссылки может выглядеть так
<a href="#" class="north62" id='wn17'>Ссылка</a>
Мы можем получить любой тег, обратившись к нему по его классу, в данном случае '.north62' или по id - '#wn17'. В результате нам вернется тег с искомым id, либо список из тегов, у которых есть такой класс.
Чтобы распарсить какую-то веб страницу, нужно открыть её исходный код, найти в нём нужные нам теги, выписать их классы или id. А потом обращаться к ним по селекторам. Давайте поясним всё это на примере.
Сперва установим в Python модуль Beautiful Soup, дав в командной строке команду:
pip install beautifulsoup4
В программе мы должны будем вписать сокращенный вариант названия модуля
import bs4
Итак, для примера сделаем программу, которая получает прогноз погоды на сегодня по региону Москва. Информацию будем парсить вот отсюда:
https://sinoptik.com.ru/погода-москва
Сперва нам нужно понять, какие именно теги нам нужно вытаскивать.
Откроем HTML код страницы и найдём в нём показания температуры за утро и день. Мы заметим, что нужная нам температура расположена в тегах с классами p3, p4, p5, p6
В свою очередь, эти классы вложены в теги с классом temperature
Значит селекторы для выборки этих тегов будут выглядеть так:
'.temperature .p3'
'.temperature .p4'
'.temperature .p5'
'.temperature .p6'
Теперь найдем в исходном коде тег где лежит текстовое описание погоды
Как видим оно лежит в теге с классом description который вложен в тег с классом rSide. Значит селектор для получения этого тега будет таким:
'.rSide description'
Напишем программу:
import requests, bs4
s=requests.get('https://sinoptik.com.ru/погода-москва')
b=bs4.BeautifulSoup(s.text, "html.parser")
p3=b.select('.temperature .p3')
pogoda1=p3[0].getText()
p4=b.select('.temperature .p4')
pogoda2=p4[0].getText()
p5=b.select('.temperature .p5')
pogoda3=p5[0].getText()
p6=b.select('.temperature .p6')
pogoda4=p6[0].getText()
print('Утром :' + pogoda1 + ' ' + pogoda2)
print('Днём :' + pogoda3 + ' ' + pogoda4)
p=b.select('.rSide .description')
pogoda=p[0].getText()
print(pogoda.strip())
Итак, сперва мы получили в переменную s код веб страницы в виде HTML. Далее преобразовали этот код в объект для парсинга b=bs4.BeautifulSoup(s.text, "html.parser").
И теперь, используем select для получения нужных нам тегов. Команда select возвращает список из всех найденных тегов с заданным селектором. В нашем случае в возвращаемом списке всего 1 элемент с индексом 0, потому что мы ищем не повторяющиеся значения тегов. Например, чтобы получить первое значение температуры, сперва получим список всех найденных совпадений p3=b.select('.temperature .p3') а уже потом возьмем текст из нулевого элемента полученного списка pogoda1=p3[0].getText().
С остальными тегами всё точно также. Мы просто задаём селектор, состоящий из имён классов искомых тегов, получаем список найденных тегов, и берем с этого списка нулевой элемент(нумерация списков идёт с нуля).
Полученные переменные мы выводим с помощью print И получаем что-то вроде этого:
Исходники программы можно скачать тут:
http://pythono.ru/book/13/weather.rar
Вы можете изменить в программе город на ваш, поменяв в конце адреса s=requests.get('https://sinoptik.com.ru/погода-москва') название города. Подобным образом можно получить информацию не только с сайта погоды, а вообще с ЛЮБОГО сайта.
Мы продолжим разбирать тему парсинга в следующем уроке.
Подписывайтесь на мой блог, будет еще много интересного и полезного!
Доброго дня, очень интересно пишите я увлекся, но у меня беда с установкой модулей. OS linux mint 18.2 вот такая беда с установкой модулей
seregka@Lenovo ~ $ sudo pip3 install beautifulsoup4
[sudo] пароль для seregka:
The directory '/home/seregka/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/seregka/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python2.7/dist-packages
Пытаюсь вставить флаг -H
seregka@Lenovo ~ $ sudo pip3 install beautifulsoup4
[sudo] пароль для seregka:
The directory '/home/seregka/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/seregka/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python2.7/dist-packages
Весь измаялся гугл не помог ((((
Ну насколько я понимаю оно просит выставить права на запись для /home/seregka/.cache/pip/http
/home/seregka/.cache/pip/
/home/seregka/.cache/
Поставьте этим директориям соотв права в линуксе и попробуйте повторить
К том у же оно пишет Requirement already satisfied
Проверьте - может оно уже установилось - сделйте import bs4 в программе и посмотрите выдаст ли ошибки
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
t3ran13, xroni, polyideic, archibald116, svetlanaaa, tristamoff, gapel, on1x, kondratij, graff0x, vlad1m1r, verdon
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
Очень полезно. но у меня что-то пока на 10-ку не удается прицепить модули из прошлых уроков.
А что именно пишет - какую ошибку? Давайте я помогу вам разобраться чтобы все заработало
Вечером буду дома, опишу что выдает.
окей
Здравствуйте!
Не могли бы Вы мне помочь с программированием сайта?
Мой ник в телеге и скайпе - polyideic
Написал вам в телеграме