Если максимально упростить, скрейпинг веб-страниц включает автоматизацию процесса сбора информации, доступной в Интернете, которую затем можно хранить, анализировать или использовать для принятия решений.
Теперь вы можете задаться вопросом: почему LinkedIn? LinkedIn, как профессиональная сетевая платформа, представляет собой сокровищницу данных. На ней размещен огромный объем информации о специалистах, компаниях и возможностях трудоустройства. Например, рекрутеры могут использовать эту платформу для поиска потенциальных кандидатов, отделы продаж могут с ее помощью выявлять потенциальных клиентов, а исследователи могут анализировать рынок труда с помощью ее данных. Возможности безграничны.
Из этого урока вы узнаете, как выполнять скрейпинг данных LinkedIn с использованием Beautiful Soup. Изучив пошаговый процесс, вы также ознакомитесь с решением Bright Data , которое значительно ускоряет скрейпинг LinkedIn.
Скрейпинг LinkedIn на Python
В этом руководстве вы будете использовать Python для создания веб-скрейпера с помощью бесплатных инструментов, таких как Beautiful Soup и Requests. Итак, давайте приступим!
Обратите внимание: данное руководство предназначено только для образовательных целей и демонстрации технических возможностей. Имейте в виду, что скрейпинг данных LinkedIn строго запрещен в соответствии с пользовательским соглашением LinkedIn. Любое неправомерное использование этой информации для скрейпинга LinkedIn может привести к постоянному бану вашего аккаунта LinkedIn или другим потенциальным негативным юридическим последствиям. Действуйте на свой страх и риск.
Прежде чем начать, убедитесь, что в вашей системе установлен Python версии 3.7.9 или более новой.
После установки Python выполните настройку необходимых библиотек для веб-скрейпинга. Здесь вы будете использовать сервис Requests
для выполнения HTTP-запросов, BeautifulSoup
(BS4) для парсинга содержимого HTML и Playwright
для взаимодействия в браузере и автоматизации задач. Откройте оболочку или терминал и выполните следующие команды:
pip3 install beautifulsoup4
pip3 install requests
pip3 install playwright
Структура и объекты данных LinkedIn
Прежде чем приступить к скрейпингу LinkedIn, в следующем разделе мы расскажем о структуре данного сайта и определим объекты данных, которые вы будете извлекать. Для целей этого руководства вы сосредоточитесь на скрейпинге списков вакансий, профилей пользователей, статей и информации о компаниях:
- Списки вакансий содержат такие сведения, как название должности, компания, в которой открыта вакансия, место и описание работы.
- Информация о курсе может включать такие данные, как название курса, имя преподавателя, продолжительность и описание курса.
- Данные компании могут включать название компании, ее отрасль, размер, местоположение и описание.
- Статьи пишутся специалистами и посвящены таким темам, как профессиональное развитие и отраслевая аналитика.
Например, если вы хотите лучше понять структуру HTML страницы «Вакансии» на LinkedIn, выполните следующие действия:
- Перейдите на сайт LinkedIn и войдите в свой аккаунт.
- Нажмите на значок «Вакансии» на верхней панели навигации. Введите любое название вакансии (например, «фронтенд-разработчик») и нажмите «Ввод».
- Щелкните правой кнопкой мыши на вакансии в списке и выберите «Изучить» (Inspect), чтобы открыть инструменты разработчика в браузере.
- Проанализируйте структуру HTML, чтобы определить теги и атрибуты, содержащие данные, скрейпинг которых вы хотите выполнить.
Скрейпинг списков вакансий
Начните со скрейпинга списков вакансий из LinkedIn. Вы будете использовать сервис Requests
для получения HTML-содержимого страницы и BeautifulSoup
для парсинга и извлечения соответствующей информации.
Создайте новый файл с именем scraper_linkedIn_jobs.py
и добавьте следующий код:
import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/jobs/search?keywords=Frontend%20Developer&location=United%20States&pageNum=0'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
job_listings = soup.find_all('div', {'class':'job-search-card'})
for job in job_listings:
title = job.find('h3', {'class': 'base-search-card__title'}).text.strip()
company = job.find('a', {'class': 'hidden-nested-link'}).text.strip()
location = job.find('span', {'class': 'job-search-card__location'}).text.strip()
anchor_tag = job.find('a', class_='base-card__full-link')
href_link = anchor_tag['href']
print(f"Title: {title}\nCompany: {company}\nLocation: {location}\nJob Link: {href_link}\n")
else:
print("Failed to fetch job listings.")
Этот код извлекает списки вакансий со страницы поиска LinkedIn, которые содержат вакансии для фронтенд-разработчиков в США.
Примечание: в заданном
URL-адресе
вы можете настроить поиск вакансий в соответствии со своими предпочтениями с помощью параметров URL. Например, вы можете изменить«location=United%20States»
на выбранную вами страну, чтобы найти списки вакансий в этом конкретном месте. Точно так же вы можете изменить«keywords=Frontend%20Developer»
на любое другое интересующее вас название вакансии, что позволит вам искать работу по другим ключевым словам. Кроме того, вы можете настроить «pageNum=0» для навигации по различным страницам результатов поиска и поиска новых вакансий. Эти параметры позволяют гибко адаптировать поиск вакансии в соответствии с желаемыми критериями и предпочтениями.
Запустите код из командной строки или терминала с помощью следующей команды:
python3 scraper_linkedIn_jobs.py
Вы должны получить список вакансий с названием должности, компанией, где открыта вакансия, местом работы и ссылкой на вакансию. Ваши результаты должны выглядеть следующим образом:
…output omitted…
Title: Frontend Engineer
Company: Klarity
Location: San Francisco, CA
Job Link: https://www.linkedin.com/jobs/view/desenvolvedor-front-end-at-pasquali-solution-3671519424?refId=JN%2FeM862Wu7qnbJd96Eoww%3D%3D&trackingId=kTSLczKp1q4aurZ5rSzRPQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card
Title: Front-End Developer (Remote)
Company: Prevail Legal
Location: United States
Job Link: https://www.linkedin.com/jobs/view/desenvolvedor-front-end-at-pasquali-solution-3671519424?refId=JN%2FeM862Wu7qnbJd96Eoww%3D%3D&trackingId=kTSLczKp1q4aurZ5rSzRPQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card
…output omitted…
Скрейпинг LinkedIn Learning
Помимо скрейпинга списков вакансий, вы также можете выполнять скрейпинг страницы LinkedIn Learning.
Создайте новый файл с именем scraper_linkedIn_courses.py
и добавьте следующий код:
import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/learning/search?trk=content-hub-home-page_guest_nav_menu_learning'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
course_listings = soup.find_all('li', {'class':'results-list__item'})
for course in course_listings:
title = course.find('h3', {'class': 'base-search-card__title'}).text.strip()
created_by = course.find('h4', {'class': 'base-search-card__subtitle'}).text.strip()
duration = course.find('div', {'class': 'search-entity-media__duration'}).text.strip()
# Find the anchor tag containing the link
anchor_tag = course.find('a', class_='base-card__full-link')
# Extract the 'href' attribute value
if anchor_tag:
href_link = anchor_tag['href']
else:
print("Anchor tag not found.")
print(f"Title: {title}\nCreated By: {created_by}\nDuration: {duration}\nCourse Link: {href_link}\n")
else:
print("Failed to fetch course listings.")
Здесь вы используете сервис Requests
для доступа к странице LinkedIn Learning и BeautifulSoup
для ее парсинга. Вы ищете элементы li
в классе results-list__item
, который содержит списки курсов. Для каждого курса вы извлекаете и выводите название, автора, продолжительность и ссылку. Если первоначальный запрос не выполнен, вы выводите сообщение об ошибке.
Запустите код из командной строки или терминала с помощью следующей команды:
python3 scraper_linkedIn_courses.py
Вы должны получить список курсов с их названием, автором и ссылкой на курс. Ваши результаты будут выглядеть следующим образом:
…output omitted…
Title: Define general intelligence
Created By: From: Introduction to Artificial Intelligence
Duration: 3m
Course Link: https://www.linkedin.com/learning/introduction-to-artificial-intelligence/define-general-intelligence?trk=learning-serp_learning-search-card_search-card
Title: Shortcut menus and the Mini toolbar
Created By: From: Excel Essential Training (Microsoft 365)
Duration: 4m
Course Link: https://www.linkedin.com/learning/excel-essential-training-microsoft-365-17231101/shortcut-menus-and-the-mini-toolbar?trk=learning-serp_learning-search-card_search-card
Title: Learning Excel: Data Analysis
Created By: By: Curt Frye
Duration: 3h 16m
Course Link: https://www.linkedin.com/learning/learning-excel-data-analysis-18868618?trk=learning-serp_learning-search-card_search-card
…output omitted…
Скрейпинг LinkedIn Articles
Вы также можете получить данные статей со страницы LinkedIn Articles.
Для этого создайте новый файл с именем scraper_linkedIn_articles.py
и добавьте следующий код:
import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/pulse/topics/home/?trk=guest_homepage-basic_guest_nav_menu_articles'
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
article_listings = soup.find_all('div', {'class':'content-hub-entities'})
for article in article_listings:
title = article.find('h2', {'class': 'break-words'}).text.strip()
description = article.find('p', {'class': 'content-description'}).text.strip()
# Find the anchor tag containing the link
anchor_tag = article.find('a', class_='min-w-0')
# Extract the 'href' attribute value
if anchor_tag:
href_link = anchor_tag['href']
else:
print("Anchor tag not found.")
print(f"Title: {title}\nDescription: {description}\nArticle Link: {href_link}\n")
else:
print("Failed to fetch article listings.")
В этом коде вы используете сервис Requests
для получения страницы LinkedIn и BeautifulSoup
для ее парсинга. Вы ищете элементы div
с классом content-hub-entities
, в которых хранятся списки статей. Для каждой статьи вы извлекаете и выводите заголовок, описание и ссылку. Если первоначальный запрос не будет выполнен, будет выведено сообщение об ошибке.
Запустите код из командной строки или терминала с помощью следующей команды:
python3 scraper_linkedIn_articles.py
Вы получите список статей с их заголовком, описанием и ссылкой на статью. Ваши результаты должны выглядеть следующим образом:
…output omitted…
Title: What are some of the emerging leadership trends and theories that you should be aware of?
Description: Learn about the six emerging leadership styles and frameworks that can help you develop your leadership skills and potential in a changing and complex world.
Article Link: https://www.linkedin.com/advice/1/what-some-emerging-leadership-trends-theories
Title: What are the most effective strategies for handling a leadership transition?
Description: Learn six strategies to manage a leadership transition smoothly and successfully, from assessing the situation to planning for the future.
Article Link: https://www.linkedin.com/advice/0/what-most-effective-strategies-handling
Title: How do you combine quality assurance training with other learning initiatives?
Description: Learn some strategies and tips for integrating quality assurance training with other learning objectives and methods in your organization.
Article Link: https://www.linkedin.com/advice/0/how-do-you-combine-quality-assurance-training
…output omitted…
Весь код для этого руководства доступен в этом репозитории GitHub.
Что следует учитывать при скрейпинге LinkedIn
LinkedIn, как и многие другие веб-сайты, использует несколько методов для предотвращения автоматического скрейпинга его данных. Понимание этих методов поможет вам сориентироваться в них и обеспечить успех скрейпинга:
- Разбивка на страницы. LinkedIn отображает результаты поиска в разбитом на страницы формате. Убедитесь, что ваш скрипт скрейпинга обрабатывает разбиение на страницы для извлечения всех необходимых данных.
- Реклама. LinkedIn отображает рекламу в различных разделах. Убедитесь, что ваш скрипт скрейпинга нацелен на реальные данные и не извлекает рекламный контент.
- Ограничение количества запросов. LinkedIn отслеживает количество запросов, поступающих с IP-адреса в течение определенного периода времени. Если количество запросов превышает определенный лимит, LinkedIn может временно или навсегда заблокировать IP-адрес.
- Капча. LinkedIn может отобразить капчу, если обнаружит необычную активность с IP-адреса. Капча разработана таким образом, чтобы ее было легко разгадывать людям, но трудно ботам, что предотвращает автоматический скрейпинг.
- Требования к входу в систему. Некоторые данные в LinkedIn доступны только после входа в систему (например, профили пользователей и страницы компаний). Это означает, что любая попытка скрейпинга этих данных потребует автоматического входа в систему, которую LinkedIn может обнаружить и заблокировать.
- Динамический контент. LinkedIn использует JavaScript для динамической загрузки некоторого контента. Это может затруднить скрейпинг, поскольку данные могут отсутствовать в HTML при первоначальной загрузке страницы.
robots.txt
. Файл LinkedInrobots.txt
указывает, к каким частям сайта разрешен доступ веб-краулерам. Хотя это и не является исключительно профилактическим методом, игнорирование инструкций в этом файле может привести к блокировке вашего IP-адреса.
Помните, что, хотя эти способы защиты можно обойти технически, такой обход может нарушить условия обслуживания LinkedIn и привести к бану вашего аккаунта. Всегда следите за тем, чтобы ваши действия по скрейпингу были законными и этичными.
Лучший вариант — используйте Bright Data для скрейпинга LinkedIn
Хотя ручной веб-скрейпинг позволяет извлекать данные в небольшом объемах, в больших масштабах он отнимает много времени и становится неэффективным. У Bright Data есть более простая и эффективная альтернатива, позволяющая легко получать доступ к огромным объемам данных LinkedIn.
Bright Data предлагает два основных продукта для скрейпинга веб-страниц:
- Scraping Browser («Скрейпинг-браузер»). Scraping Browser — это браузерное решение, которое позволяет взаимодействовать с веб-сайтами так же, как с ними взаимодействует обычный пользователь. Он обрабатывает рендеринг JavaScript, запросы AJAX и преодолевает другие трудности, что делает его идеальным решением для скрейпинга динамических веб-сайтов, таких как LinkedIn.
- Наборы данных LinkedIn. Набор данных LinkedIn представляет собой предварительно собранный и структурированный набор данных, содержащий данные LinkedIn, включая списки вакансий, профили пользователей и информацию о компании. Вы можете получить доступ к данным и загрузить их непосредственно с платформы Bright Data.
Создание аккаунта Bright Data
Чтобы получить доступ к набору данных LinkedIn на платформе Bright Data, выполните следующие действия:
Создайте аккаунт на сайте Bright Data, нажав «Начать бесплатное опробование» и следуя инструкциям.
После входа в систему нажмите на значок кредитной карты на левой панели навигации, чтобы перейти на страницу «Выставление счетов» (Billing). Затем добавьте способ оплаты для активации аккаунта:
Затем нажмите на значок булавки, чтобы открыть страницу «Прокси-серверы и инфраструктура скрейпинга». Выберите «Scraping Browser» > «Начало работы»:
Присвойте своему решению имя и нажмите кнопку «Добавить»:
Выберите «Параметры доступа» и запишите свое имя пользователя, хост и пароль, которые понадобятся вам на следующем этапе:
Выполнив все эти шаги, вы можете перейти к следующему разделу.
Скрейпинг данных компании в LinkedIn с помощью Scraping Browser
Для скрейпинга данных компании с ее страницы компании в LinkedIn, создайте новый файл с именем scraper_linkedIn_bdata_company.py
и добавьте следующий код:
import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup
username='YOUR_BRIGHTDATA_USERNAME'
password='YOUR_BRIGHTDATA_PASSWORD'
auth=f'{username}:{password}'
host = 'YOUR_BRIGHTDATA_HOST'
browser_url = f'wss://{auth}@{host}'
async def main():
async with async_playwright() as pw:
print('connecting')
browser = await pw.chromium.connect_over_cdp(browser_url)
print('connected')
page = await browser.new_page()
print('goto')
await page.goto('https://www.linkedin.com/company/spacex/', timeout=120000)
print('done, evaluating')
# Get the entire HTML content
html_content = await page.evaluate('()=>document.documentElement.outerHTML')
# Parse the HTML with Beautiful Soup
soup = BeautifulSoup(html_content, 'html.parser')
# Extract the 'About us' description
description_element = soup.select_one('.core-section-container[data-test-id="about-us"] p[data-test-id="about-us__description"]')
description = description_element.text if description_element else None
print('Description:')
print(description)
# Extract the 'Company size'
company_size_element = soup.select_one('div[data-test-id="about-us__size"] dd')
company_size = company_size_element.text.strip() if company_size_element else None
print('Company size:')
print(company_size)
await browser.close()
# Run the async function
asyncio.run(main())
В этом коде вы используете Playwright для автоматизации браузера. Вы подключаетесь к браузеру Chromium через прокси-сервер, переходите на страницу компании SpaceX и извлекаете описание «О нас» и «Размер компании».
Чтобы получить HTML-контент, вы используете метод оценки Playwright, а затем анализируете его с помощью Beautiful Soup, чтобы найти нужные элементы и вывести извлеченную информацию. Вы используете асинхронные функции Playwright, определяя асинхронную функцию main ()
, и запускаете выполнение сценария с asyncio.run (main ())
.
Примечание: убедитесь, что вы заменили
YOUR_BRIGHTDATA_USERNAME
,YOUR_BRIGHTDATA_PASSWORD
иYOUR_BRIGHTDATA_HOST
правильными и конкретными учетными данными из вашего аккаунта BrightData. Этот шаг крайне важен для успешной аутентификации и доступа к вашему аккаунту.
Откройте оболочку или терминал и запустите код с помощью следующей команды:
python3 scraper_linkedIn_bdata_company.py
Результат должен выглядеть следующим образом:
…output omitted…
Description:
SpaceX designs, manufactures and launches the world's most advanced rockets and spacecraft. The company was founded in 2002 by Elon Musk to revolutionize space transportation, with the ultimate goal of making life multiplanetary.
SpaceX has gained worldwide attention for a series of historic milestones. It is the only private company ever to return a spacecraft from low-Earth orbit, which it first accomplished in December 2010. The company made history again in May 2012 when its Dragon spacecraft attached to the International Space Station, exchanged cargo payloads, and returned safely to Earth — a technically challenging feat previously accomplished only by governments. Since then Dragon has delivered cargo to and from the space station multiple times, providing regular cargo resupply missions for NASA.
For more information, visit www.spacex.com.
Company size:
1,001-5,000 employees
Первоначальный подход, который вы использовали для скрейпинга LinkedIn, может привести к проблемам, включая всплывающие окна и капчу типа reCAPTCHA, которые могут привести к блокировке выполнения кода. Однако использование Scraping Browser от Bright Data позволяет преодолеть эти препятствия, обеспечивая бесперебойный скрейпинг.
Набор данных LinkedIn от Bright Data
Другой альтернативный вариант ручного скрейпинга данных из LinkedIn — покупка наборов данных LinkedIn, которые предоставят вам доступ к ценным личным данным, включая профили пользователей и дополнительную информацию. Использование набора данных Bright Data LinkedIn устраняет необходимость ручного скрейпинга веб-страниц, экономит время и предоставляет структурированные данные, готовые к анализу.
Чтобы узнать, какие наборы данных доступны, перейдите на панель управления Bright Data, затем нажмите «Наборы данных и веб-скрейпер IDE» на левой панели навигации и выберите «Наборы данных профилей пользователей LinkedIn (общедоступные веб-данные)»:
Теперь вы можете применить фильтры для дальнейшего уточнения выбора и получения конкретных данных, соответствующих вашим критериям, а затем нажать «Варианты покупки», чтобы узнать, сколько они будут стоить.
Цены зависят от количества выбранных вами записей, что позволяет адаптировать покупку в соответствии с вашими потребностями и бюджетом. Выбрав эти наборы данных, вы значительно упростите рабочий процесс и избавитесь от необходимости вручную извлекать и собирать данные:
Заключение
Из этой статьи вы узнали, как вручную выполнять скрейпинг данных LinkedIn с помощью Python, и познакомились с решением Bright Data, которое упрощает и ускоряет процесс скрейпинга. Независимо от того, собираете ли вы данные для исследования рынка, привлечения талантов или анализа конкурентов, эти инструменты и методы помогут вам собрать необходимую информацию.
Помните: хотя ручной скрейпинг может быть мощным инструментом, Bright Data предлагает более простую и эффективную альтернативу. Scraping Browser и заранее подготовленный с помощью скрейпинга набор данных LinkedIn от Bright Data помогут вам сэкономить время и силы, а также сосредоточиться на том, что действительно важно, а именно на использовании данных для принятия обоснованных решений. Поговорите с экспертом по данным Bright Data, чтобы найти подходящее вам решение.
Кредитная карта не требуется