Как я собрал данные с LinkedIn, используя Selenium и Beautiful Soup
Наставник: Сининг Чен
LinkedIn - это социальная сеть, предназначенная для профессионального общения и сильно ориентированная на трудоустройство. Ее веб-сайт и приложения содержат сотни миллионов профилей профессиональных пользователей, а также вакансии.
Для получения информации о рынке труда, представленной на LinkedIn, мы использовали инструменты для парсинга веб-страниц, написанные на Python: Selenium и Beautiful Soup. В этой статье рассказывается о том, как установить веб-драйвер Selenium и Beautiful Soup на ваш компьютер с помощью pip, чтобы получить доступ к информации, которую мы видим на LinkedIn. Особенно с использованием исходного кода веб-страницы мы создали автоматизированные функции, такие как ввод текста в поле поиска, нажатие кнопок и парсинг текста. Для этого нам пришлось преодолеть несколько проблем, включая различие между Selenium и Beautiful Soup, поиск нужных элементов и избегание ошибок, вызванных всплывающими сообщениями.
Мы также визуализировали тенденции, показанные нашими данными. Графики отображены в нашей другой статье, ссылка на которую приведена ниже: https://medium.com/@sophie14159/linkedin-job-trends-2dd64f1d4541
Selenium
Selenium Python предоставляет API, который позволяет вам получать доступ к веб-драйверам, включая Firefox, Internet Explorer и Chrome, что будет продемонстрировано позже.
Beautiful Soup
Beautiful Soup - это библиотека Python, которая позволяет нам парсить информацию со веб-страниц, получая доступ к их исходному коду. Для этого используется парсер HTML или XML.
Более подробную информацию можно найти в других ресурсах в конце этой статьи.
Установка
Чтобы парсить информацию с веб-страниц, например, с LinkedIn, нам необходимо установить selenium, Beautiful Soup и веб-драйвер.
Мне потребовалось установить как pip, так и selenium на свой ноутбук, и я сделал это с помощью командной строки. Сначала я установил pip.
Примечание: Поскольку у меня уже был установлен pip, я удалил его и затем установил заново, чтобы получить самую новую версию. Затем, чтобы получить доступ к pip и установить selenium, мне потребовалось использовать "pip install selenium". Однако, как предупреждение указывает, мне также нужно было изменить путь с помощью "cd", чтобы получить доступ к pip.
2. Установка Selenium и Beautiful Soup
После успешной установки и доступности pip я просто использовал команды "pip install selenium" и "pip install bs4". Таким образом, Selenium и Beautiful Soup были успешно установлены. Теперь мы можем использовать их в наших скриптах Python.
3. Загрузка веб-драйвера
В моем случае я решил использовать chromedriver, хотя, как уже упоминалось ранее, Selenium не ограничивается только Chrome. В зависимости от того, какая версия Chrome у меня была, я использовал следующий сайт для загрузки chromedriver: https://chromedriver.chromium.org/downloads.
Примечание: Если вы не уверены, какая версия Chrome у вас установлена, вы можете следовать инструкциям здесь%20Click%20on%20the%20Menu,number%20can%20be%20found%20here.).
С установленным Selenium, Beautiful Soup и веб-драйвером мы готовы написать наш код!
Python Script
**#импорт webdriver для Chrome**from selenium import webdriverbrowser = webdriver.Chrome('chromedriver_win32/chromedriver.exe')
В коде выше мы импортировали chromedriver, который теперь позволит нам получать доступ к веб-страницам через браузер Chrome. Затем я вошел в свою учетную запись LinkedIn, чтобы получить доступ к этим веб-страницам.
**#Открыть страницу входа**
browser.get('https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin')
**#Ввести данные для входа:**
elementID = browser.find_element_by_id('username')
elementID.send_keys(username)
elementID = browser.find_element_by_id('password')
elementID.send_keys(password)**#Примечание: замените значения "username" и "password" на свои данные для входа в LinkedIn**elementID.submit()
Автоматически откроется веб-страница, и программа автоматически введет ваше имя пользователя и пароль, как вы указали в коде.
Следует иметь в виду, что, поскольку вы используете свою учетную запись LinkedIn, веб-страницы и информация, к которым вы можете получить доступ через LinkedIn, ограничены тем, что доступно в вашем профиле. Например, определенные пользователи, с которыми вы не связаны, могут быть невидимы для вас.
Успешно вошедши в систему, мы теперь можем выполнять множество функций, несколько из которых я использовал, перечислены ниже:
1. Ввод в поле поиска
**#Перейти на веб-страницу**
browser.get('https://www.linkedin.com/jobs/?showJobAlertsModal=false')**#Найти поле поиска**
jobID = browser.find_element_by_class_name('jobs-search-box__text-input')**#Отправить ввод**
jobID.send_keys(job)
В приведенном выше примере я получил доступ к странице, где я могу искать работу. Элементом, который мне нужно было найти в браузере, было поле поиска. Я нашел имя класса, щелкнув правой кнопкой мыши на странице и выбрав "Инспектировать", что показывает мне исходный код любой веб-страницы.
Фактически, использование исходного кода было более важным ключом для выполнения функций в моем коде. Щелкая стрелкой в верхнем левом углу окна исходного кода, я мог видеть код любого элемента, на который я щелкал на странице LinkedIn. Затем я вставлял имя класса в свой код на Python, чтобы получить к нему доступ.
2. Нажатие кнопки
Нажатие кнопки может означать отправку введенных вами данных в поисковую строку выше, но это определенно не ограничивается только этим. В моих целях мне нужно было нажать кнопку, чтобы открыть список фильтров, примененных к поиску работы.
Это простой двухшаговый процесс:
browser.find_element_by_class_name("search-s-facet__button").click()
Я нашел имя класса элемента через исходный код, как объяснялось в предыдущей функции, затем применил метод click. Я написал этот код в одной строке, но его также можно разделить на две строки с использованием переменной:
**#Эти две строки кода не нажимают на ту же кнопку, что и в предыдущем случае**search = browser.find_element_by_class_name('jobs-search-box__submit-button')
search.click()
3. Парсинг текста
В коде после изображения я попытался получить количество вакансий, которые получились в результате поиска определенного типа карьеры. Это число сначала было преобразовано в строку, поэтому я преобразовал его в целое число.
**#Получение исходного кода страницы**
src = browser.page_source
soup = BeautifulSoup(src, 'lxml')**#Извлечение текста из исходного кода**
results = soup.find('small', {'class': 'display-flex t-12 t-black--light t-normal'}).get_text().strip().split()[0]
results = int(results.replace(',', ''))
Ошибки и решения
Selenium и Beautiful Soup могут работать вместе для выполнения множества функций, которые определенно не ограничены тем, что я использовал выше. Однако я хотел бы рассмотреть несколько ошибок, с которыми я столкнулся при написании своего собственного кода, а также объяснить свои решения.
1. Selenium против Beautiful Soup
Поскольку мой код использовал и Selenium, и Beautiful Soup, я часто путал, какой из них мне нужно использовать в зависимости от моих целей. Однажды я попытался найти и нажать на элемент, выполнив поиск его в html-коде, прежде чем понять, что я пытаюсь выполнить функцию Selenium с использованием Beautiful Soup!
Хотя эти два инструмента работают вместе, Beautiful Soup позволил мне собирать данные, к которым я имел доступ на LinkedIn. В то же время Selenium - это инструмент, который я использовал для автоматизации процесса доступа к этим веб-страницам и элементам на сайте.
2. Невозможно найти элемент
Это, пожалуй, самая раздражающая ошибка, так как в исходном коде есть элементы, к которым мой код, кажется, не может получить доступ.
Вот блок кода, который помог мне исправить эту проблему:
last_height = browser.execute_script('return document.body.scrollHeight')
for i in range(3):
browser.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(SCROLL_PAUSE_TIME)
new_height = browser.execute_script('return document.body.scrollHeight')
last_height = new_height
Вышеуказанный блок кода действует как загрузчик страницы, который позволяет мне получить доступ к большей части исходного кода для поиска нужных элементов. Например, когда вы первоначально загружаете страницу, вы не можете увидеть многое на веб-сайте, пока не прокрутите вниз. Код выше позволяет автоматизировать это действие "прокрутки вниз".
Ссылка на YouTube-канал, который познакомил меня с этим кодом, приведена в конце этой истории вместе с другими ресурсами.
3. Всплывающее окно сообщений
Одной из первых проблем, с которой я столкнулся, был способ появления моих сообщений, которые в основном блокировали часть веб-страницы, которую я хотел видеть.
Это, казалось, была автоматическая функция в LinkedIn, поэтому мне нужен был способ обойти ее. Если бы я использовал LinkedIn вручную, я бы просто нажал вкладку сообщений один раз, и всплывающее окно было бы свернуто. Мне нужно было выполнить это действие в моем коде.
Мое решение ниже проверяет, было ли всплывающее окно уже свернуто, в таком случае оно не будет блокировать другие элементы на странице. Если мой код не может найти свернутое окно сообщений, то я ищу случай, когда это действительно всплывающее окно, и нажимаю его, чтобы закрыть.
**#Импорт проверки исключений**
from selenium.common.exceptions import NoSuchElementExceptiontry:
if browser.find_element_by_class_name('msg-overlay-list-bubble--is-minimized') is not None:
pass
except NoSuchElementException:
try:
if browser.find_element_by_class_name('msg-overlay-bubble-header') is not None:
browser.find_element_by_class_name('msg-overlay-bubble-
header').click()
except NoSuchElementException:
pass
Заключение
Selenium и Beautiful Soup позволяют выполнять множество различных функций, включая парсинг данных, полученных с помощью LinkedIn. Используя данные, которые я собрал с помощью функций в этой статье, я смог получить необходимые данные для создания графиков, отражающих рынок труда, как предлагает LinkedIn.
Ресурсы:
Selenium: https://selenium-python.readthedocs.io/
Beautiful Soup: https://pypi.org/project/beautifulsoup4/
Соответствующий YouTube-канал: https://www.youtube.com/channel/UCTiWgVtEGSY4cuduJbMPblA