如何抓取 LinkedIn:2024 年指南

从人才发现、分析职业路径,到识别适合投资的公司、绘制新市场的竞争格局以及进行客户关系管理(CRM)强化,LinkedIn数据点对于公司创建更有针对性和有效的业务方法至关重要。
6 min read
如何抓取LinkedIn
  1. 使用 Python 抓取 LinkedIn
  2. 抓取 LinkedIn 时需要考虑的事项

在最简单的形式中,网络抓取涉及自动化收集网络上可用的信息,然后可以将这些信息存储、分析或用于决策过程。

现在,你可能会想,为什么要抓取 LinkedIn?作为一个专业的社交平台,LinkedIn 是一个数据宝库。它拥有关于专业人士、公司和工作机会的丰富信息。例如,招聘人员可以用它来寻找潜在候选人,销售团队可以用它来识别潜在客户,研究人员可以用它来进行劳动力市场分析。可能性是无穷无尽的。

在本教程中,你将学习如何使用抓取 LinkedIn 数据并利用Beautiful Soup。在学习了逐步抓取过程后,你还将了解 Bright Data 解决方案如何使 LinkedIn 抓取更快。

使用 Python 抓取 LinkedIn

在本教程中,你将使用 Python 创建一个网络抓取工具,使用免费的工具如 Beautiful Soup 和Requests。那么让我们开始吧!

请注意:本教程仅用于教育目的和演示技术能力。请注意,根据 LinkedIn 的用户协议,抓取 LinkedIn 的数据是严格禁止的。任何滥用此信息来抓取 LinkedIn 的行为可能会导致你的 LinkedIn 账户被永久禁止或其他潜在的法律后果。请自行承担风险并自行决定。

在开始之前,请确保你的系统上安装了Python 3.7.9或更高版本。

安装 Python 后,下一步是设置抓取所需的库。这里,你将使用requests来进行 HTTP 请求,使用BeautifulSoup(BS4)来解析 HTML 内容,并使用Playwright进行浏览器交互和任务自动化。打开你的 shell 或终端并运行以下命令:

pip3 install beautifulsoup4
pip3 install requests
pip3 install playwright

LinkedIn 的结构和数据对象

在开始抓取 LinkedIn 之前,以下部分将讨论该网站的结构并识别你将提取的数据对象。在本教程中,你将重点抓取工作列表、用户资料、文章和公司信息:

  • 工作列表包含职位名称、公司、地点和职位描述等详细信息。
  • 课程信息可以包括课程标题、讲师、时长和描述。
  • 公司数据可以包括公司名称、行业、规模、地点和描述。
  • 文章由专业人士撰写,涵盖职业发展和行业见解等主题。

例如,如果你想更好地了解 LinkedIn 的工作页面的 HTML 结构,请按照以下步骤操作:

  1. 访问LinkedIn 网站并登录你的账户。
  2. 点击顶部导航栏的工作图标。输入任何职位名称(如“前端开发人员”)并按回车键。
  3. 从列表中右键点击一个工作项目,然后点击检查以打开浏览器的开发者工具。
  4. 分析 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”以浏览搜索结果的不同页面,从而探索更多的工作机会。这些参数使你能够根据自己的标准和偏好定制工作搜索。

从 shell 或终端运行以下命令来运行代码:

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 学习

除了抓取工作列表,你还可以抓取 LinkedIn学习页面的课程。

创建一个名为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 的学习页面,并使用BeautifulSoup进行解析。你寻找具有results-list__item类的li元素,这些元素包含课程列表。对于每个课程,你提取并打印标题、创建者、时长和链接。如果初始请求失败,你将打印失败信息。

从 shell 或终端运行以下命令来运行代码:

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 文章

你还可以抓取 LinkedIn文章页面的文章数据。

为此,创建一个名为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来解析它。你正在寻找具有content-hub-entities类的div元素,这些元素包含文章列表。对于每篇文章,你提取并打印标题、描述和链接。如果初始请求失败,将打印失败信息。

从 shell 或终端运行以下命令来运行代码:

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 地址。
  • CAPTCHA:如果 LinkedIn 检测到某个 IP 地址的异常活动,可能会出现 CAPTCHA 挑战。CAPTCHA 设计为易于人类解决但难以为机器人解决,从而防止自动抓取。
  • 登录要求:LinkedIn 上的某些数据只有在登录时才可访问(例如用户资料和公司页面)。这意味着任何抓取这些数据的尝试都需要自动登录,这会被 LinkedIn 检测并阻止。
  • 动态内容:LinkedIn 使用 JavaScript 动态加载某些内容。这可能使抓取变得更困难,因为数据可能在页面初始加载时并不存在于 HTML 中。
  • robots.txtLinkedIn 的robots.txt文件指定了允许哪些部分的站点供网络爬虫访问。虽然这并不是严格的防御技术,但忽略该文件中的指令可能会导致你的 IP 被阻止。

记住,虽然在技术上可以绕过这些技术,但这样做可能违反 LinkedIn 的服务条款,并可能导致你的账户被封禁。始终确保你的抓取活动是合法和道德的。

更好的选择:使用 Bright Data 抓取 LinkedIn

虽然手动网络抓取适用于小规模数据提取,但在大规模上会变得耗时且低效。Bright Data 提供了一个更简单、更高效的替代方案,让你轻松访问大量的 LinkedIn 数据。

Bright Data 提供了两种主要的网络抓取产品:

  • 抓取浏览器:抓取浏览器 是一个基于浏览器的解决方案,可以让你像普通用户一样与网站交互。它处理 JavaScript 渲染、AJAX 请求和其他复杂问题,使其成为抓取 LinkedIn 等动态网站的理想选择。
  • LinkedIn 数据集:LinkedIn 数据集是一个预先收集和结构化的数据集,包含 LinkedIn 数据,包括工作列表、用户资料和公司信息。你可以直接从 Bright Data 平台访问和下载数据。

设置你的 Bright Data 账户

要访问 Bright Data 平台上的 LinkedIn 数据集,请按照以下步骤操作:

Bright Data 网站上创建一个账户,点击开始免费试用并按照说明进行操作。

登录后,点击左侧导航面板上的信用卡图标进入帐单页面。然后添加付款方式以激活你的账户:

支付方式

接下来,点击图钉图标打开代理和抓取基础设施页面。选择抓取浏览器 > 开始

代理和抓取基础设施

为你的解决方案命名,然后点击添加按钮:

添加按钮

选择访问参数并记下你的用户名、主机和密码,因为你将在下一步中需要它们:

访问参数

完成所有这些步骤后,你可以继续下一部分。

使用抓取浏览器抓取 LinkedIn 公司数据

要从 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_USERNAMEYOUR_BRIGHTDATA_PASSWORDYOUR_BRIGHTDATA_HOST替换为你的 Bright Data 账户的正确且特定的登录凭据。这一步对于成功认证和访问你的账户至关重要。

打开 shell 或终端并使用以下命令运行代码:

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 等挑战,导致 代码被阻止。然而,使用 Bright Data 抓取浏览器可以帮助你克服这些障碍,确保抓取不中断。

Bright Data LinkedIn 数据集

手动抓取 LinkedIn 数据的另一种替代方法是购买 LinkedIn 数据集,这将为你提供包括用户资料和其他信息在内的有价值的个人数据。使用 Bright Data LinkedIn 数据集可以消除手动网络抓取的需求,节省时间,并提供准备好分析的结构化数据。

要了解有哪些数据集可用,请转到你的 Bright Data 仪表板,然后从左侧导航栏中点击数据集和网络抓取 IDE并选择LinkedIn 人员资料数据集(公共网络数据)

LinkedIn个人资料数据集(公共网页数据)

现在,你可以应用过滤器进一步细化你的选择并获取符合你标准的特定数据,然后点击“购买选项”查看费用。

定价基于你选择的记录数量,使你可以根据需要和预算调整购买。通过选择购买这些数据集,你可以显著简化工作流程,避免数据提取和收集的手动操作:

数据提取和收集

结论

在本文中,你学习了如何使用 Python 手动抓取 LinkedIn 的数据,并介绍了 Bright Data,它可以简化和加速数据抓取过程。无论你是为了市场研究、人才招聘还是竞争分析而抓取数据,这些工具和技术都能帮助你收集所需的信息。

记住,虽然手动抓取可以是一种强大的工具,但 Bright Data 提供了一个更简单、更高效的替代方案。通过其抓取浏览器和预先抓取的LinkedIn 数据集,Bright Data 可以节省你的时间和精力,让你专注于真正重要的事情:使用数据做出明智的决策。