CoderCastrov logo
CoderCastrov
LinkedIn

Как я собрал данные с LinkedIn, используя Selenium и Beautiful Soup

Как я собрал данные с LinkedIn, используя Selenium и Beautiful Soup
просмотров
7 мин чтение
#LinkedIn

Наставник: Сининг Чен

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 и изменение пути с помощью командной строки в Windows

Примечание: Поскольку у меня уже был установлен 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. Нажатие кнопки

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

Все фильтры функций работы в LinkedIn

Это простой двухшаговый процесс:

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