Большая дыра в наборе инструментов для Data Scientist [Часть 1]
Парсинг 101 с использованием Selenium и Python
Обычно забывается во всех магистерских программах и курсах по Data Science, парсинг веб-страниц является, по моему честному мнению, базовым инструментом в наборе инструментов Data Scientist, так как он является инструментом для получения и использования внешних данных из вашей организации, когда общедоступные базы данных недоступны.
И пока API и доступные открытые источники данных не станут нормой (если это вообще произойдет), парсинг веб-страниц будет необходим для получения интересующих вас данных, будь то цены конкурентов на их веб-сайте или знание местоположения всех супермаркетов рядом с вами.
Но что такое Selenium?
Selenium - это автоматизатор веб-браузера. Когда он используется в качестве парсера, вы получаете браузер, такой как Chrome или Firefox, который переходит на веб-страницу, с которой вы хотите взаимодействовать, и извлекает по пути всю информацию, которая вам может понадобиться.
Хотя он обычно используется для тестирования, это такой универсальный инструмент, что его часто и широко используют для парсинга веб-страниц.
Помните, что это базовый (обратите внимание на слово "базовый", так как я буду делать упрощения) учебник, чтобы вы могли начать работать с Selenium в качестве парсера веб-страниц, не принимайте его как исчерпывающий учебник.
Почему Selenium важен для меня как Data Scientist?
Что ж... вы могли заметить, что, к сожалению, не так много людей предоставляют легкий или бесплатный доступ к данным вне вашей компании, и иногда даже внутри вашей компании.
Например, вам может понадобиться получить список всех цен на отели в вашем городе, и буквально никто не предоставит вам упорядоченную базу данных цен на отели в виде файла Excel. Если они это сделают, это ваш счастливый день, если нет, то это тоже ваш счастливый день, вы можете начать парсить.
Факт в том, что существует множество информации, которую вы можете получить, и как Data Scientist вы можете либо сидеть за своим столом и говорить "У меня нет необходимой информации для этого анализа", либо пытаться найти изобретательные способы ее получения, и парсинг - один из них.
Примечание: Существуют и другие достаточно эффективные фреймворки для парсинга, такие как Scrapy (https://scrapinghub.com/scrapy-cloud)_ _которые могут быть более подходящими и легче внедряемыми для вашего проекта.
Дело в том, что почти все веб-страницы, которые я нашел для парсинга, уже были защищены от Scrapy и других инструментов (вам, вероятно, понадобится смена IP, и это стоит денег), и большинство из них не были защищены от Selenium. Едва нашел одну или две, защищенные хорошо написанным кодом Selenium.
Кроме того, Selenium хорошо работает на старомодных и плохо написанных страницах, в конце концов, для меня Selenium - это как внедорожник, не самый быстрый, не самый эффективный и не самый простой в управлении. Но он может доставить вас практически везде. Не требует асфальтированных дорог и, конечно же, легко справляется с бездорожьем.
Теперь давайте приступим к сбору данных.
0. Личный совет
Как говорит Selenium на своей веб-странице:
Поэтому, если вы собираетесь использовать Selenium для парсинга веб-сайта, сначала прочитайте условия и положения веб-страницы или посетите файл robots.txt веб-сайта (многие из них разрешают парсить, другие не разрешают, а большинство не имеют ясной политики; поэтому используйте на свой страх и риск) и, конечно же, будьте вежливы, не отправляйте запросы как зверь, старайтесь вести себя как автоматизированный человек, запускайте парсер во время низкой активности и не перегружайте серверы хоста. Так что после этого продолжайте на свой страх и риск.
1. Установка Selenium
Ну, это просто, я предполагаю, что у вас уже установлен Python 3 и вы знаете, как создать хотя бы простой блокнот:
pip install selenium
2. Установка драйвера
Selenium управляет браузером (Chrome, Firefox и т.д.) через драйвер, каждый браузер имеет свои собственные драйверы.
Например, если вы хотите открыть Mozilla Firefox, вам нужно будет использовать драйвер Mozilla, такой как Geckodriver, вот ссылка:
https://github.com/mozilla/geckodriver/releases
Так что дело обстоит так: Selenium говорит драйверу через функцию WebDriver(), что делать в выбранном браузере.
Представьте это как марионетку: Selenium - это мозг, который говорит руке, что делать, рука - это драйвер, и, наконец, марионетка - это браузер.
Самый простой способ установить Geckodriver на Mac - перейти в терминал и просто ввести:
brew install geckodriver
Если у вас нет установленного Homebrew, вам следует установить его сейчас:
Другой способ - получить файл и просто добавить его в переменную PATH.
Другие инструкции по настройке Geckodriver на Mac:
https://www.kenst.com/2016/12/installing-marionette-firefoxdriver-on-mac-osx/
А на Windows:
https://www.softwaretestinghelp.com/geckodriver-selenium-tutorial/
3. Запуск Selenium: "Привет, парсинг!"
В целях простоты откройте блокнот, такой как Jupyter (конечно, вы можете использовать .py)
Сначала мы импортируем необходимый пакет WebDriver и указываем, что будем использовать Firefox. На этом этапе мы уже должны установить Geckodriver.
from selenium import webdriver
driver = webdriver.Firefox()
Затем мы заставляем эту "куклу" перейти на страницу, которую мы хотим посетить, давайте навестимся к нашим друзьям на Hackernoon.com, как вы можете проверить в их файле robots.txt, у них нет запрета на user-agents (www.hackernoon.com/robots.txt)
driver.get("https://www.hackernoon.com")
На этом пока достаточно, вы установили Selenium и уже открыли веб-страницу с его помощью, в следующем посте мы объясним, как навигироваться по странице TDS с помощью Selenium (или любой другой), щелкая тут и там и получая некоторую информацию.
Но пока, если вы просто вставите эти строки кода и запустите их, вы увидите, как ваша "кукла" перемещается в TDS, щелкает на кнопку поиска и ищет одну из ваших самых любимых статей. Вот эта!
Добавьте в область импорта следующие строки:
import time
from selenium.webdriver.common.keys import Keys
Затем добавьте внизу следующее:
search_button = driver.find_element_by_class_name("search-container")
search_button.click()
time.sleep(2)
input_bar = driver.find_element_by_name("searchvalue")
input_bar.send_keys('The big hole on Data Scientists toolset')
time.sleep(2)
input_bar.send_keys(Keys.RETURN)
time.sleep(10)
driver.close()
Окончательное поведение должно выглядеть так (без изображений с настольной конфиденциальностью, аплодирующих людей)
И вот вам! Используйте это, делитесь им по своему усмотрению и оставляйте немного аплодисментов ниже.
Помните, что атрибуция принесет вам хорошую карму.
Увидимся в следующем посте!