You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现LinkedIn职位爬取:控制滚动获取指定数量职位

精准爬取LinkedIn 500个职位的滚动控制方案

问题背景

需要爬取指定LinkedIn职位搜索页的500个职位,现有两种实现都有问题:

  • 第一种无限滚动逻辑会滚到第39页,最终生成1000个职位元素,远超目标
  • 第二种修改后会滚动到单页底部加载下一页,随后回到顶部重复滚动,无法精准控制数量

原代码片段:

url = 'https://www.linkedin.com/jobs/search?keywords=Python%20%28Programming%20Language%29&location=Canada&geoId=101174742&position=1&pageNum=0'
time.sleep(2)
no_of_jobs = 500

driver = 'location of driver'

driver.set_window_size(1024, 600)
driver.maximize_window()

driver.get(url)

SCROLL_PAUSE_TIME = 1.5

i = 2
while i <= int(no_of_jobs/25) + 1:
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(SCROLL_PAUSE_TIME)
        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height

    i = i + 1

    try:
        driver.find_element(By.XPATH, '/html/body/div[1]/div/main/section[2]/button').click()
        time.sleep(2)
    except:
        pass
        time.sleep(2)


    job_lists = driver.find_element(By.CLASS_NAME, 'jobs-search__results-list')
    jobs = job_lists.find_elements(By.TAG_NAME, 'li')  # return a list

    time.sleep(5)

此前尝试的简化代码:

i = 2
while i <= int(no_of_jobs/25)+1:
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    i = i+1
    try:
        driver.find_element(By.XPATH, '/html/body/div[1]/div/main/section[2]/button').click()
        time.sleep(2)
    except:
        pass
        time.sleep(2)

核心问题分析

原代码依赖按页数计算循环次数(no_of_jobs/25),但LinkedIn的动态加载存在三个问题:

  • 部分页面可能加载不全,实际职位数少于25个
  • 滚动加载时可能触发额外的职位加载,导致总数超标
  • 没有实时检查已加载的职位数量,无法提前终止循环

修正后的解决方案

核心思路是实时检查已加载的职位元素数量,一旦达到或超过目标数就终止循环,同时优化滚动逻辑确保每次加载完成:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'https://www.linkedin.com/jobs/search?keywords=Python%20%28Programming%20Language%29&location=Canada&geoId=101174742&position=1&pageNum=0'
target_jobs = 500
SCROLL_PAUSE_TIME = 1.5

# 初始化浏览器驱动(替换为你的驱动路径)
driver = webdriver.Chrome(executable_path='location of driver')
driver.set_window_size(1024, 600)
driver.maximize_window()
driver.get(url)
time.sleep(2)

while True:
    # 获取当前已加载的职位数量
    job_lists = driver.find_element(By.CLASS_NAME, 'jobs-search__results-list')
    jobs = job_lists.find_elements(By.TAG_NAME, 'li')
    current_count = len(jobs)
    
    # 达到目标数量就终止循环
    if current_count >= target_jobs:
        break
    
    # 滚动到底部加载更多
    last_height = driver.execute_script("return document.body.scrollHeight")
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_TIME)
    
    # 检查是否加载完成,若未加载则继续滚动
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        # 尝试点击"查看更多"按钮(如果存在)
        try:
            load_more_btn = driver.find_element(By.XPATH, '/html/body/div[1]/div/main/section[2]/button')
            if load_more_btn.is_displayed():
                load_more_btn.click()
                time.sleep(2)
        except:
            # 没有更多加载按钮,且滚动到底,退出循环
            break
        last_height = new_height

# 最后再确认一次职位列表,确保获取到足够数量
job_lists = driver.find_element(By.CLASS_NAME, 'jobs-search__results-list')
final_jobs = job_lists.find_elements(By.TAG_NAME, 'li')[:target_jobs]  # 只取前500个
print(f"最终获取职位数量:{len(final_jobs)}")

# 后续处理职位数据...
driver.quit()

关键优化点

  • 实时数量校验:每次滚动后检查已加载职位数,达到目标立即停止,避免过度加载
  • 滚动加载确认:判断滚动前后的页面高度,确保内容加载完成后再进行下一步
  • 容错处理:处理"查看更多"按钮的存在性,避免因按钮未出现导致报错
  • 结果截断:最后取前500个职位,防止因加载波动导致数量超标

内容的提问来源于stack exchange,提问作者user0703

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:30:53