如何使用Python抓取LinkedIn数据 - Apify博客

作者:API传播员 · 2025-12-26 · 阅读时间:6分钟

在本文中,您将学习如何使用Python构建一个简单的抓取器,提取LinkedIn上的职位、公司、工作网址和位置等有价值的信息。同时,我们还将探讨在抓取LinkedIn数据时可能遇到的复杂性以及如何应对这些挑战。


先决条件和环境准备

在开始之前,请确保您具备以下条件:

  1. 基本的Python编程知识。
  2. 已安装Python环境(建议使用Python 3.7或更高版本)。
  3. 对网络抓取技术有一定了解,包括HTML结构解析和HTTP请求。

LinkedIn作为一个流量较大的平台,使用动态加载页面和JavaScript技术,这使得抓取变得更具挑战性。为了成功抓取数据,您需要采取一些措施,例如:

  • 使用轮换代理和限速技术。
  • 遵守robots.txt文件的规定。
  • 实现IP轮换以避免被检测和阻止。

使用Apify模板快速开始

模板中包含的库

Apify模板提供了以下关键工具:

  • Beautiful Soup:一个Python库,用于从HTML和XML文件中提取数据,适合处理基本的抓取任务。
  • HTTPX:一个功能强大的HTTP请求库,支持同步和异步编程。

本地运行Actor

要开始使用Apify模板构建项目,请运行以下命令:

apify create python-actor-example -t python-start

此命令将创建一个名为python-actor-example的文件夹,并自动安装所需的依赖库。项目的文件结构如下:

├───.actor
│ └───actor.json
│ └───Dockerfile
│ └───input_schema.json
├───src
│ └───__main__.py
│ └───main.py
└───storage
├───datasets
├───key_value_stores
│ └───default
│ └───INPUT.json
└───request_queues

要运行Actor,请进入项目目录并执行以下命令:

cd python-actor-example
apify run

抓取LinkedIn职位数据

方法选择

在LinkedIn上抓取职位数据有两种方法:

  1. 高级搜索(使用Cookie):需要提供LinkedIn账户的Cookie,适用于经过身份验证的用户。
  2. 基本搜索(不含Cookie):以访客身份抓取数据,不需要登录,支持代理轮换以提高抓取效率。

本文将重点介绍第二种方法。

数据提取步骤

  1. 访问LinkedIn求职页面:以访客身份打开LinkedIn的求职页面。
  2. 设置筛选条件:例如,搜索“美国”地区的“软件开发人员”职位。
  3. 复制URL:将筛选后的页面URL复制下来。

使用Chrome DevTools分析页面结构

按下F12或右键单击页面选择“检查”,打开Chrome DevTools。通过观察页面结构,可以提取以下关键信息:

  • 职位名称:$(".base-search-card__title").textContent.trim()
  • 公司名称:$(".hidden-nested-link").textContent.trim()
  • 职位URL:$(".base-card__full-link").getAttribute("href")
  • 工作地点:$(".job-search-card__location").textContent.trim()
  • 发布日期:$(".job-search-card__listdate--new").textContent.trim()

处理无限滚动

LinkedIn的职位页面采用了无限滚动机制。通过DevTools的“网络”选项卡,可以找到加载更多职位数据的请求URL,并分析其分页参数(如start=0)。


编写抓取器代码

INPUT.json文件中设置目标URL,例如:

{
  "url": "https://www.linkedin.com/jobs/search?keywords=Software%20Developer&location=United%20States"
}

以下是抓取器的核心代码示例:

import asyncio
from bs4 import BeautifulSoup
from apify_client import ApifyClient

async def main():
    client = ApifyClient()
    url = "https://www.linkedin.com/jobs/search?keywords=Software%20Developer&location=United%20States"
    response = await client.get(url, follow_redirects=True)
    soup = BeautifulSoup(response.content, 'html.parser')    jobs = []
    for job_card in soup.find_all("div", class_="base-card"):
        job_details = {
            "title": job_card.find("h3", class_="base-search-card__title").text.strip() if job_card.find("h3") else None,
            "company": job_card.find("a", class_="hidden-nested-link").text.strip() if job_card.find("a") else None,
            "job_url": job_card.find("a", class_="base-card__full-link")["href"] if job_card.find("a") else None,
            "location": job_card.find("span", class_="job-search-card__location").text.strip() if job_card.find("span") else None,
            "date_posted": job_card.find("time", class_="job-search-card__listdate--new").text.strip() if job_card.find("time") else None
        }
        jobs.append(job_details)    await client.push_data(jobs)

运行抓取器:

python src/__main__.py

数据导出与清理

将抓取的数据导出为CSV文件:

import csv

with open("linkedin_jobs.csv", "w", newline="", encoding="utf-8") as csvfile:
    fieldnames = ["title", "company", "job_url", "location", "date_posted"]
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(jobs)

在导出前,可以使用正则表达式清理数据,确保其一致性和可读性。


绕过反抓取检测

为了避免被LinkedIn检测和阻止,建议采取以下措施:

  • 尊重robots.txt:遵守网站的抓取规则。
  • 使用代理轮换:避免频繁使用同一IP。
  • 配置真实用户代理:模拟真实用户的浏览行为。
  • 使用无头浏览器:如Puppeteer或Playwright,模拟完整的浏览器环境。

部署到Apify云

完成本地测试后,可以将抓取器部署到Apify云。运行以下命令登录并部署:

apify login
apify push

部署后,您可以通过Apify平台管理抓取器,并将数据导出为多种格式(如JSON、CSV、XML等)。


常见问题解答

  1. 抓取LinkedIn数据是否合法?

    抓取公开信息通常是合法的,但需避免侵犯隐私或违反网站的使用条款。

  2. 为什么不直接使用LinkedIn API?

    LinkedIn API的限制较多,例如费率限制和数据范围有限,可能无法满足所有项目需求。


总结

本文详细介绍了如何使用Python和Apify构建LinkedIn职位抓取器。通过学习,您可以掌握从页面结构分析到数据清理和导出的完整流程。LinkedIn作为一个重要的数据来源,其职位信息可用于招聘、市场研究等多种应用场景。希望本文能为您的项目提供帮助!

原文链接: https://blog.apify.com/scrape-linkedin-with-python/