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

Indeed职位卡片爬取数据为空,请求排查代码问题

问题定位与修复方案

核心问题分析

你的代码存在三个关键问题,导致提取数据失败:

  • 参数类型完全不匹配:scrape_job_card函数注释标注需要传入Selenium元素对象,但你实际传入的是make_indeed_url生成的字符串URL,字符串没有find()方法,所有提取逻辑都会触发except分支返回默认值。
  • 缺少页面请求与解析步骤:没有向生成的URL发送HTTP请求获取页面HTML,也未用BeautifulSoup解析页面,直接操作URL字符串自然无法提取任何DOM元素数据。
  • 元素定位器可能失效:Indeed的页面class名称会不定期更新,你使用的部分class可能已过时。

修复后的完整代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import datetime as dt
import sqlite3

search_job = 'Data analyst'
search_location = 'New York, NY'
job_age = 7

def make_indeed_url(search_job, search_location, job_age):
    '''
    生成Indeed职位搜索URL
    input:
        search_job (str): 职位名称
        search_location (str): 城市/地区
        job_age (int): 发布天数上限(3/7等)
    output:
        indeed_job_url (str): 拼接完成的搜索URL
    '''
    job = search_job.replace(' ', '+')
    location = search_location.replace(',', '%2C').replace(' ', '+')
    # 移除固定的vjk参数(该参数是单个职位的标识,不需要放在搜索列表URL里)
    indeed_job_url = f'https://www.indeed.com/jobs?q={job}&l={location}&fromage={job_age}'
    return indeed_job_url

def scrape_job_card(job_card):
    '''
    从单个职位卡片元素中提取信息
    input: 
        job_card (BeautifulSoup Tag对象): 单个职位卡片的DOM元素
    output: 
        职位名称、公司名、地点、预估薪资的字符串元组
    '''
    try:
        # 修正职位标题的定位器(当前Indeed列表页的职位标题class)
        job_title = job_card.find('h2', class_='jobTitle').get_text(strip=True).replace('new', '')
    except:
        job_title = 'No job title found'
    try:
        company_name = job_card.find('span', class_='companyName').get_text(strip=True)
    except:
        company_name = 'No Company Name'
    try:
        company_location = job_card.find('div', class_='companyLocation').get_text(strip=True)
    except:
        company_location = 'No Location'
    try:
        estimated_salary = job_card.find('div', class_='salary-snippet').get_text(strip=True)
    except:
        estimated_salary = 'No Estimated Salary'
    return job_title, company_name, company_location, estimated_salary

# 主逻辑:请求页面、解析、提取所有职位数据
def main():
    # 生成URL
    job_url = make_indeed_url(search_job, search_location, job_age)
    # 添加请求头模拟浏览器,避免被反爬拦截
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    # 请求页面
    response = requests.get(job_url, headers=headers)
    # 解析HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    # 定位所有职位卡片元素(当前Indeed列表页的职位卡片容器class)
    job_cards = soup.find_all('div', class_='job_seen_beacon')
    
    # 遍历提取数据
    job_data = []
    for card in job_cards:
        job_info = scrape_job_card(card)
        job_data.append(job_info)
    
    # 转换为DataFrame查看结果
    df = pd.DataFrame(job_data, columns=['Job Title', 'Company Name', 'Location', 'Estimated Salary'])
    print(df)

if __name__ == '__main__':
    main()

关键修改说明

  1. 移除固定vjk参数:原URL中的vjk=d75084593b7d8230是单个职位的唯一标识,放在搜索列表URL里会强制跳转到单个职位页面,而非职位列表,这也是你无法获取多个职位卡片的原因之一。
  2. 补充请求头:添加User-Agent模拟浏览器请求,避免被Indeed的反爬机制直接拦截。
  3. 修正元素定位器:更新了职位标题、薪资等元素的class名称,适配当前Indeed的页面结构。
  4. 新增主逻辑:补充了页面请求、解析、遍历所有职位卡片的流程,让数据提取逻辑能真正作用于DOM元素。
  5. 类型匹配:scrape_job_card现在接收BeautifulSoup的Tag对象(单个职位卡片),与函数的实际功能匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:05:17