运行Indeed职位爬取代码无提取数据,求排查与解决
问题分析与解决方法
问题原因
- User-Agent不完整:原请求头里的User-Agent字符串未闭合,缺少结尾的
)和双引号,导致请求被Indeed反爬机制拦截,返回的页面无有效内容 - URL格式错误:原URL里的分页参数
{page}未用f-string语法解析,还错误携带了单个职位的vjk参数,无法正确跳转分页 - 分页调用错误:循环中每次固定传
10给extract函数,未使用循环变量i,相当于重复爬取同一错误页面 - 异常处理逻辑错误:
try-finally会强制清空薪资内容,哪怕try块成功获取到薪资,也会被finally覆盖为空字符串,应改用try-except - 元素选择器过时:Indeed页面结构已更新,原有的
jobsearch-SerpJobCard、company、salarytext等类名不再生效,无法定位目标元素
修复后的完整代码
import requests from bs4 import BeautifulSoup import pandas as pd def extract(page): # 补全并修正User-Agent 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" } # 修正URL,使用start参数分页,移除无效的vjk参数 url = f"https://www.indeed.com/jobs?q=Data&l=United+States&sc=0kf%3Ajt%28internship%29%3B&start={page}" r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, "html.parser") return soup def transform(soup): # 使用当前Indeed的职位卡片选择器 job_cards = soup.find_all("div", class_="job_seen_beacon") for card in job_cards: # 提取职位名称,移除"new"标签 title = card.find("h2", class_="jobTitle").text.strip().replace("new", "").strip() # 提取公司名称 company = card.find("span", class_="companyName").text.strip() # 提取薪资(处理不存在的情况) salary = "" try: salary = card.find("div", class_="salary-snippet").text.strip() except AttributeError: pass # 提取职位摘要,清理换行符 summary = card.find("div", class_="job-snippet").text.strip().replace("\n", " ") job = { "title": title, "company": company, "salary": salary, "summary": summary } joblist.append(job) joblist = [] # 循环传递正确的分页参数,每次偏移10条数据 for i in range(0, 40, 10): print(f'Getting page, {i}') soup = extract(i) transform(soup) df = pd.DataFrame(joblist) print(df.head()) df.to_csv('indeed_data_internships.csv', index=False)
关键修改说明
- 补全User-Agent:确保请求头符合浏览器标准,避免被反爬机制识别为爬虫
- 修正URL结构:用
start={page}实现分页,移除无效的vjk参数,保证分页链接正确 - 正确传递分页参数:循环中把
i传给extract函数,实现多页数据爬取 - 修复异常处理:改用
try-except捕获薪资不存在的情况,保留成功获取到的薪资数据 - 更新元素选择器:适配Indeed当前的页面结构,替换为有效的类名定位目标元素
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

