如何使用Python抓取LinkedIn数据 - Apify博客
在本文中,您将学习如何使用Python构建一个简单的抓取器,提取LinkedIn上的职位、公司、工作网址和位置等有价值的信息。同时,我们还将探讨在抓取LinkedIn数据时可能遇到的复杂性以及如何应对这些挑战。
先决条件和环境准备
在开始之前,请确保您具备以下条件:
- 基本的Python编程知识。
- 已安装Python环境(建议使用Python 3.7或更高版本)。
- 对网络抓取技术有一定了解,包括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上抓取职位数据有两种方法:
- 高级搜索(使用Cookie):需要提供LinkedIn账户的Cookie,适用于经过身份验证的用户。
- 基本搜索(不含Cookie):以访客身份抓取数据,不需要登录,支持代理轮换以提高抓取效率。
本文将重点介绍第二种方法。
数据提取步骤
- 访问LinkedIn求职页面:以访客身份打开LinkedIn的求职页面。
- 设置筛选条件:例如,搜索“美国”地区的“软件开发人员”职位。
- 复制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等)。
常见问题解答
-
抓取LinkedIn数据是否合法?
抓取公开信息通常是合法的,但需避免侵犯隐私或违反网站的使用条款。
-
为什么不直接使用LinkedIn API?
LinkedIn API的限制较多,例如费率限制和数据范围有限,可能无法满足所有项目需求。
总结
本文详细介绍了如何使用Python和Apify构建LinkedIn职位抓取器。通过学习,您可以掌握从页面结构分析到数据清理和导出的完整流程。LinkedIn作为一个重要的数据来源,其职位信息可用于招聘、市场研究等多种应用场景。希望本文能为您的项目提供帮助!
原文链接: https://blog.apify.com/scrape-linkedin-with-python/
最新文章
- Java API 如何支持现代软件开发 – Brilworks
- 如何使用Python抓取LinkedIn数据 – Apify博客
- 如何使用Postman自动化API测试 – LogRocket博客
- 如何让 Python 写的 API 接口同时支持 Session 和 Token 认证?
- Golang做API开发时,如何设计可靠的签名验证机制?
- 非技术背景用户如何轻松使用天工大模型API
- 医疗API解决方案改善患者结果
- SOAP 和 REST API 的区别是什么?
- 发现啤酒世界的宝藏:开放啤酒数据库API助你探索全球精酿
- 如何获取讯飞星火 API Key 密钥(分步指南)
- API 安全最佳实践指南
- 如何使用Postman高效测试RESTful APIs:真实案例解析