使用Python爬取Indeed数据无结果问题排查与解决求助
问题描述
在Python 3.10.6 IDLE中运行以下Indeed数据爬取代码,期望提取职位标题、公司、薪资、摘要信息,但运行后仅输出页码提示,得到空DataFrame,无任何目标数据返回。
原代码:
#Indeed data import requests from bs4 import BeautifulSoup import pandas as pd def extract(page): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko"} url = "https://www.indeed.com/jobs?q=Data&l=United+States&sc=0kf%3Ajt%28internship%29%3B&vjk=a2f49853f01db3cc={page}" r = requests.get(url,headers) soup = BeautifulSoup(r.content, "html.parser") return soup def transform(soup): divs = soup.find_all("div", class_ = "jobsearch-SerpJobCard") for item in divs: title = item.find ("a").text.strip() company = item.find("span", class_="company").text.strip() try: salary = item.find("span", class_ = "salarytext").text.strip() finally: salary = "" summary = item.find("div",{"class":"summary"}).text.strip().replace("\n","\n") job = { "title":title, "company":company, 'salary':salary, "summary":summary } joblist.append(job) joblist = [] for i in range(0,40,10): print(f'Getting page, {i}') c = extract(10) transform(c) df = pd.DataFrame(joblist) print(df.head()) df.to_csv('jobs.csv')
运行输出:
Getting page, 0 Getting page, 10 Getting page, 20 Getting page, 30 Empty DataFrame Columns: [] Index: []
问题原因分析
- URL构造错误:
- User-Agent字符串未闭合,缺少结尾的
")",请求头格式无效,易被Indeed反爬拦截。 - URL未用f-string格式化,
{page}无法替换为实际页码;且Indeed分页参数应为start(如start=0、start=10),原URL分页逻辑完全错误。
- User-Agent字符串未闭合,缺少结尾的
- 分页调用参数错误:循环中固定调用
extract(10),而非传入循环变量i,导致重复爬取同一页,且该页可能无有效数据。 - 页面元素定位失效:Indeed页面结构已更新,原代码使用的
jobsearch-SerpJobCard、company等class名称已失效,无法匹配任何元素,divs为空列表,无数据写入joblist。 - 异常处理逻辑错误:用
try-finally处理薪资提取,无论是否找到元素都会将salary设为空;且find返回None时调用.text会直接抛出异常,中断循环。
修正后的代码
# Indeed数据爬取 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" } # 使用正确分页参数start,用f-string格式化URL url = f"https://www.indeed.com/jobs?q=Data&l=United+States&sc=0kf%3Ajt%28internship%29%3B&start={page}" try: r = requests.get(url, headers=headers) r.raise_for_status() # 检查请求是否成功 soup = BeautifulSoup(r.content, "html.parser") return soup except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return None def transform(soup): if not soup: return # 更新为当前Indeed的职位卡片class divs = soup.find_all("div", class_="job_seen_beacon") for item in divs: job = {} # 标题提取,容错处理 title_tag = item.find("h2", class_="jobTitle") job["title"] = title_tag.text.strip() if title_tag else "无标题" # 公司名称提取,容错处理 company_tag = item.find("span", class_="companyName") job["company"] = company_tag.text.strip() if company_tag else "无公司名" # 薪资提取,改用try-except容错 try: salary_tag = item.find("div", class_="salary-snippet-container") job["salary"] = salary_tag.text.strip() if salary_tag else "" except: job["salary"] = "" # 摘要提取,容错处理 summary_tag = item.find("div", class_="job-snippet") job["summary"] = summary_tag.text.strip().replace("\n", " ") if summary_tag else "无摘要" joblist.append(job) joblist = [] # 传入正确分页参数i,实现多页爬取 for i in range(0, 40, 10): print(f'获取第{i//10 + 1}页数据...') soup = extract(i) transform(soup) df = pd.DataFrame(joblist) print(df.head()) df.to_csv('indeed_jobs.csv', index=False)
修改说明:
- 修复User-Agent格式,降低被反爬拦截概率。
- 调整URL分页参数为
start,用f-string正确格式化页码。 - 更新页面元素class名称,适配当前Indeed页面结构。
- 为每个元素提取添加容错处理,避免异常中断循环。
- 捕获请求错误并给出提示,优化异常处理逻辑。
- 循环传入正确分页参数,实现有效多页爬取。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

