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

