1 заметка с тегом

#webscraping

Веселая аналитика. Lamptest💡

Продолжаем серию веселых аналитических статей.
Предыдущие части:
Веселая аналитика. Радиостанции (http://rweather.ru/blog/all/veselaya-analitika-radiostancii/)

Если вам близка тема светодиодного освещения и вы хотите знать какие лампы выбрать то вам идти на сайт хорошего человека Алексея Надёжина (LampTest в соцсетях:
Facebook: http://fb.com/lamptest.ru
Вконтакте: http://vk.com/lamptest
Geektimes: http://geektimes.ru/company/lamptest).

Алексей тестирует лампы, пишет обзоры и все это сведено в таблицу, по ней можно выбрать, что вас интересует и посмотреть всякие интересности!
А пока мы тут сгенерим Алексею несколько визитов на сайт.
Стоит сказать спасибо однокурснику Саше Михайлову (ссылка на его блог), у которого я подглядел идею блога и таких вот статей, спасибо тебе дорогой товарищ, что стал мотивацией!
В статьях продолжаем применять и расширять навыки, приобретенные на специализации “Аналитик данных” Яндекс.Практикум. Среди прочих интересных тем, была тема про извлечение данных с помощью вебскрепинга (ссылка на вики).

Инструментарий

  • python
  • requests
  • bs4 (BeautifullSoup) — библиотека для вебскрепинга
  • selenium — используем для получения содержимого динамических веб-страниц
  • tqdm — красивости для циклов
  • pandas
  • data_view — библиотека для первичного обзора данных

Решив, что все будет быстро и безболезненно, открыл jupyter notebook, импортировал нужные библиотеки (pandas, requests, bs4). При открытии главной страницы сайта нам предоставлен выбор фильтров и только одна галочка установлена (поле “Тип лампы” = LED), нам собственно так и нужно — получить всю информацию. Нажимаем на кнопку “Показать” и у нас таблица, есть страницы, их аж 59, надо разобраться как ходить по страничкам!?.
Посмотрим на url полученной страницы — http://lamptest.ru/search/#currency=rub&type=LED — пока ничто в нем не говорит о наличии номера страницы. Но если перейти на вторую, то он изменится — http://lamptest.ru/search/#currency=rub&type=LED&start=50, для 3 страницы url выглядит так  — http://lamptest.ru/search/#currency=rub&type=LED&start=100, делаем вывод, что для первой страницы необходимо установить параметр start = 0. Так и поступим.

Получается такой pipeline:

  • формируем правильный адрес страницы (с помощью цикла и range)
  • получаем содержимое веб-страницы (requests.get)
  • передаем код страницы в парсер BeautifullSoup
  • ищем нужные теги и классы
  • складываем информацию в датафрейм

Чтобы узнать какие элементы html нам нужны открываем консоль разработчика в браузере (Яндекс.Браузер, F12). Выбираем пиктограмму с курсором в верхнем левом углу консоли (она должна стать синей) — в таком режиме вы выбираете элемент и исследуете его.

Выбираем любой элемент таблицы, нажимаем на него и строчка кода этого элемента подсветится в консоли.

В моем случае это “brand”. И если поизучать столбцы таблицы, заметим, что все они находятся в элементах с id=td и разными классами (brand, model, desc и др.). Эти параметры надо передать методу find_all супа, приготовленного из кода страницы. На выходе список всех найденных элементов, у каждого необходимо изъять текст.

res = soup.find_all("td", class_=cl)
i.text for i in res

Пишем код, запускаем, на выходе пусто🧐. Проверяем все еще раз, смотрим другие теги — все одно пусто! А давайте узнаем, что мы получаем в коде страницы при помощи

r = requests.get(url)

Вызываем атрибут и смотрим.

r.text

А в коде страницы нет нужной нам информации. Google в помощь. Гуглим и выясняется, что бывает парсинг статических страниц и парсинг динамических страниц.
Статический парсинг, парсинг страниц, на которых все элементы присутствуют сразу, без подгрузки во время запроса. Для такого парсинга подойдет способ, которым я пытался решить задачу.
Динамические страницы, те на которых используются скрипты JS, Ajax и другие, они в реальном времени подгружают информацию. Для парсинга таких страниц необходима эмуляция поведения браузера. Чтобы этого достичь используется библиотека selenium и ее компонент webdriver. Драйвер позволяет автоматически управлять браузером.
Для того чтобы связка selenium+webdriver+браузер работала необходима установка компонентов. В документации этот процесс описан достаточно подробно https://selenium.dev/documentation/en/webdriver/driver_requirements/.
Важное замечание: вначале я пытался пойти простым путем, как гласила документация в версиях Safari старше 10, webdriver идет в комплекте, классно подумал я, надо только запустить. Запускаться webdriver отказался по непонятным причинам, после команды

safaridriver -p 1337

в консоле тишина.
Из оставшихся браузеров (Opera, Firefox, Chrome) выбор пал на Google Chrome. По ссылке в документации скачал chromedriver, скопировал в нужную папку, установил браузер и понадеявшись на все последние версии, запустил chromedriver и чудо произошло, драйвер запустился! Драйвер запускает локальный сервер к которому и происходит обращение через selenium.

Но selenium.webdriver отказался подключался к драйверу, сославшись на разницу в версиях🤦‍♂️. Проверяем версии, chrome 78.xxxxx, chromedriver 79. Что же идем качаем совместимую с браузером версию chromedriver (качаем, копируем).
Теперь, когда все версии правильные, selenium подключается к chromedriver. И мы готовы получать данные.

Измененный pipeline:

  • формируем правильный адрес страницы (с помощью цикла и range)
  • открываем веб-страницу (driver.get)
  • получаем ее содержимое (driver.page_source)
  • передаем содержимое страницы в парсер BeautifullSoup
  • ищем нужные теги и классы
  • складываем информацию в датафрейм

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

Поставить теги #yandex #yandexpraktikum #praktikum
 192   5 мес   #lamptest #analytic #data #analize #dataanalyst   #webscraping