首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python实战-用海外代理IP抓LinkedIn热门岗位数据

python实战-用海外代理IP抓LinkedIn热门岗位数据

原创
作者头像
阿秋数据采集
修改2025-11-28 10:07:24
修改2025-11-28 10:07:24
50
举报

在当今全球化的职场环境中,职业竞争日益激烈,远程工作的兴起进一步模糊了地域界限。求职者不再满足于本地岗位信息,而是需要更精细、更全面的岗位情报来指导职业规划。

最近我身边也有个小伙伴在做全球热门岗位趋势分析,想看看LinkedIn 上美国、德国这些国家都在招啥?技术岗多还是市场岗?到底啥技能最吃香?

传统找工作更多是“看到什么投什么”,但如果你想系统地回答这些问题:

  • 哪些城市/国家,某个方向岗位最多?
  • Python / Go / 数据分析 / AI Agent 之类的技能,在哪些地区需求正在上升?
  • 远程岗位更集中在哪些时区?

就需要对岗位数据做更精细的采集与分析。

所以今天我们就实战一把:用 Python + 海外代理 IP,搞定 LinkedIn 热门岗位数据采集,并顺存成表格分析热门岗位与技能趋势。通过这种方式,我们可以从更广阔的视角洞察全球职场动态,从而提前布局。

1 为什么海外代理 IP 对求职洞察很重要?

类似我小伙伴一样,很多人打开LinkedIn准备大干一场的时候,立马踩坑:

一访问就跳登录页——同一IP频繁切换地址,网站做出的自我保护机制; “怎么感觉国外也没那么多 Python 岗位啊?”——看到的是“本地化 + 个性化”的一小块视图,而不是不同地区的“原生视角”; 访问频率一高就提示“请求异常”在同一IP下大量高频搜索,很快就会触发人机校验。

这时候,海外代理IP就变成一个绕不开的话题,海外代理IP允许分散请求,模拟自然用户行为;而且此类平台的供需也非常具有地区差异,例如北美岗位更注重科技技能,而欧洲可能强调可持续发展主题。使用海外代理可以访问特定地区的本地化数据,可以让我们更全面地触达这些需求。

2 准备工作

2.1 先装好环境,主角是 requests + BeautifulSoup

代码语言:bash
复制
pip install requests beautifulsoup4 pandas

2.2 再准备一些代理 IP(可以临时拿测试 IP,看自己用的顺手的,比如我用的就是青果网络的):

代码语言:python
复制
# 功能:发送带青果网络海外代理IP的请求
def get_proxy():
proxy_url = "https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false" # 青果网络海外代理IP API地址" 

2.3 页面结构快速看一眼

随便搜一下 data analyst,跳转到这个 URL:

代码语言:bash
复制
https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=United%20States&start=0

参数拆一下:

参数名

含义

keywords

搜索关键词(可 URL 编码)

location

地点,比如 United States

start

分页,从 0 开始,每页 25 条

这玩意就一“拼 URL 模板”的事儿,后续我们一页页改 start=25、50、75… 去翻页就行。

3 实战环节

3.1 初始化配置(关键词、页数、输出文件)

代码语言:bash
复制
KEYWORD = "data analyst"
LOCATION = "United States"
PAGES = 3
OUTPUT = "linkedin_jobs.csv"

3.2 随机选择代理 + 请求头设置

代码语言:python
复制
import random

def get_proxy():
    return random.choice(proxies_list)

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}

记得设置 UA,不然容易被判定成脚本行为。

3.3 主函数:爬取岗位数据

代码语言:python
复制
import requests
from bs4 import BeautifulSoup
import pandas as pd
import random
import time
import os

# ========== 可配置区域 ==========
KEYWORD = "data analyst"
LOCATION = "United States"
PAGES = 5
OUTPUT_FILE = "linkedin_jobs_usa.csv"

# 带青果网络海外代理IP的请求
def get_proxy():
proxy_url = "https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false" # 青果网络海外代理IP API地址" 

USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
    "Mozilla/5.0 (X11; Linux x86_64)"
]

# ========== 工具函数 ==========
def get_proxy():
    return random.choice(proxies_list)

def get_headers():
    return {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept-Language": "en-US,en;q=0.9"
    }

# ========== 主爬虫函数 ==========
def scrape_jobs(keyword, location, pages):
    results = []

    for page in range(pages):
        start = page * 25
        url = f"https://www.linkedin.com/jobs/search/?keywords={keyword}&location={location}&start={start}"
        print(f"\n➡️ 正在抓取第 {page + 1} 页: {url}")

        retry = 0
        while retry < 3:
            try:
                proxy = get_proxy()
                headers = get_headers()
                print(f"使用代理: {proxy['http']},UA: {headers['User-Agent']}")
                resp = requests.get(url, headers=headers, proxies=proxy, timeout=10)
                resp.raise_for_status()
                soup = BeautifulSoup(resp.text, "html.parser")
                jobs = soup.select("div.base-card")

                for job in jobs:
                    try:
                        title = job.select_one("h3").get_text(strip=True) if job.select_one("h3") else ""
                        company = job.select_one("h4").get_text(strip=True) if job.select_one("h4") else ""
                        location = job.select_one(".job-search-card__location").get_text(strip=True) if job.select_one(".job-search-card__location") else ""
                        link = job.select_one("a")["href"].split("?")[0] if job.select_one("a") else ""

                        results.append({
                            "Title": title,
                            "Company": company,
                            "Location": location,
                            "Link": link
                        })
                    except Exception as parse_err:
                        print("⚠️ 单条解析失败,已跳过")

                break  # 成功就跳出 retry
            except Exception as e:
                retry += 1
                wait = 2 ** retry
                print(f"❌ 抓取失败(第 {retry} 次):{e},{wait} 秒后重试...")
                time.sleep(wait)

        time.sleep(random.uniform(3, 6))

    return results

# ========== 启动爬虫 ==========
if __name__ == '__main__':
    data = scrape_jobs(KEYWORD, LOCATION, PAGES)
    df = pd.DataFrame(data)
    df.drop_duplicates(inplace=True)
    df.to_csv(OUTPUT_FILE, index=False)
    print(f"\n✅ 共抓取 {len(df)} 条岗位信息,保存到:{os.path.abspath(OUTPUT_FILE)}")

3.4 保存到 CSV

代码语言:python
复制
import pandas as pd

data = scrape_jobs(KEYWORD, LOCATION, PAGES)
df = pd.DataFrame(data)
df.drop_duplicates(inplace=True)
df.to_csv(OUTPUT, index=False)
print(f"✅ 一共抓到 {len(df)} 条,已保存到 {OUTPUT}")

4 运行效果

运行后你会看到这样一批数据(CSV 可直接丢到 Excel 分析):

Title

Company

Location

Link

Data Analyst

Netflix

California

BI Engineer

Amazon

New York

5 清洗数据

有了原始数据,并不代表你已经能直接分析了。通常还需要几步加工。

比如:岗位标题是个非常“自由”的字段:

  • Senior Python Developer
  • Python Engineer
  • Backend Engineer (Python)
  • Fullstack Developer (Python, React)

你如果直接按标题分组统计,会发现每个城市的“Top 岗位”都是一大堆看起来类似但名字不一样的东西。

所以我们可以将标题归一化:

  • 把标题转小写,去掉公司花字、标点;
  • 识别出核心词汇:python + developer/engineer/backend/fullstack
  • 映射到内部定义的“标准岗位族”:
    • 全部归到 Python Backend Developer 或更粗粒度的 Python Developer

还可以根据地区、时间序列进行分析,技术需求是涨了还是少了,加入薪资、福利等字段,然后制作成图表。

6 写在最后

如果只从技术的角度看,python加上海外代理IP可以玩出很多花样,具体就要看整体的采集思路是否正确。而且优质的代理IP是根本,不然你代码写得再好看,没毛病,也是无法走通的。海外代理IP服务选择时,可以重点关注是否有合规说明,别用一办,直接跑路了,类似青果这种:

以及,国人的产品还是会比海外的好使一点,毕竟交流沟通无障碍,不然等老外那个时差邮件来回倒腾,黄花菜都凉了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 为什么海外代理 IP 对求职洞察很重要?
  • 2 准备工作
  • 3 实战环节
    • 3.1 初始化配置(关键词、页数、输出文件)
    • 3.2 随机选择代理 + 请求头设置
    • 3.3 主函数:爬取岗位数据
    • 3.4 保存到 CSV
  • 4 运行效果
  • 5 清洗数据
  • 6 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档