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

使用BeautifulSoup爬取Indeed职位卡片仅能获取单条数据是什么原因

爬取Indeed职位卡片问题修复方案

核心问题点

  • 元素定位逻辑错误:直接匹配全页面a标签会匹配大量非职位类超链接,无法精准筛选职位卡片,需要先定位职位专属的外层容器
  • 反爬拦截:直接发送无请求头的请求会被Indeed识别为爬虫,返回的页面结构缺失,无法匹配到全部职位数据
  • URL拼接规则可优化:薪资参数建议补充对应的前缀标识,提高搜索准确性

修正后可运行代码

import pandas as pd
from datetime import datetime
import requests
from bs4 import BeautifulSoup
import time

def get_url(job_role, minimum_salary, location):
    # 生成Indeed搜索URL,薪资参数添加£符号匹配平台规则
    template = 'https://uk.indeed.com/jobs?q={}+%C2%A3{}&l={}'
    url = template.format(job_role.replace(' ', '+'), minimum_salary, location)
    return url

# 配置请求头模拟浏览器,避免反爬拦截
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept-Language': 'en-GB,en;q=0.9'
}

url = get_url('Graduate Engineer', '20000','guildford')
response = requests.get(url, headers=headers)
# 增加状态码校验,确保请求成功
if response.status_code != 200:
    print(f"请求失败,状态码:{response.status_code}")
    exit()

soup = BeautifulSoup(response.text,'html.parser')
# 精准定位所有职位卡片的外层容器
cards = soup.find_all('div', class_='job_seen_beacon')
print(f"共获取到{len(cards)}条职位数据")

# 遍历提取单条职位信息
job_list = []
for card in cards:
    job_info = {}
    # 职位名称
    title_tag = card.find('a', class_='jcs-JobTitle')
    job_info['职位名称'] = title_tag.text.strip() if title_tag else '无'
    # 职位详情链接
    job_info['详情链接'] = 'https://uk.indeed.com' + title_tag['href'] if title_tag else '无'
    # 公司名称
    company_tag = card.find('span', {'data-testid': 'company-name'})
    job_info['公司名称'] = company_tag.text.strip() if company_tag else '无'
    # 工作地点
    location_tag = card.find('div', {'data-testid': 'text-location'})
    job_info['工作地点'] = location_tag.text.strip() if location_tag else '无'
    # 薪资信息
    salary_tag = card.find('div', {'data-testid': 'attribute_snippet_testid'})
    job_info['薪资'] = salary_tag.text.strip() if salary_tag else '未公布'
    job_list.append(job_info)
    print(job_info)

# 可导出为csv
# pd.DataFrame(job_list).to_csv('indeed_jobs.csv', index=False, encoding='utf-8-sig')

# 多页爬取示例(可选)
# for page in range(0, 5): # 爬前5页
#     page_url = url + f'&start={page*10}'
#     response = requests.get(page_url, headers=headers)
#     # 后续解析逻辑和单页一致
#     time.sleep(2) # 每次请求间隔2秒,避免被封

注意事项

  • 平台页面结构会不定期更新,若匹配不到元素可打开浏览器调试工具,重新查看职位卡片对应的class或属性,调整匹配规则即可
  • 爬取频率不宜过高,单页请求间隔至少2秒,避免IP被临时封禁
  • 若需要更多字段,可自行扩展解析逻辑,从卡片对象中提取对应元素即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:06:01