Python爬取Indeed.nl多页招聘数据出现重复和缺失问题求解
问题原因
- 分页参数逻辑错误:Indeed的
start参数代表的是岗位偏移量,而非页码。单页展示15个岗位的情况下,第1页对应start=0,第2页对应start=15,以此类推。你当前代码中start直接取页码1-6,相当于每次只偏移1个岗位,请求返回的内容几乎都是第一页的结果,自然会出现大量重复、遗漏岗位的问题。 - 未配置请求头:Indeed对无UA标识的请求会触发反爬机制,大概率会重复返回默认的第一页内容,进一步加重数据重复的问题。
- 缺少去重逻辑:即使分页正确,Indeed的搜索结果本身也可能出现跨页重复的推广岗位,需要额外的去重校验。
修复方案
修正后的代码
import requests from bs4 import BeautifulSoup import json jobs_NL = [] # 用于去重的集合,存储岗位唯一标识(标题+公司+地点组合足够判断唯一) seen_jobs = set() # 配置请求头,模拟浏览器访问,避免反爬 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" } for page_num in range(6): # 计算正确的偏移量:页码*单页岗位数15 offset = page_num * 15 url = f"https://nl.indeed.com/vacatures?q=junior+ux+designer&l=Nederland&start={offset}" print("正在获取第", page_num+1, "页") page = requests.get(url, headers=headers) # 可选:加个响应状态码判断,避免请求失败导致后续报错 if page.status_code != 200: print(f"第{page_num+1}页请求失败,状态码:{page.status_code}") continue html = BeautifulSoup(page.content, "html.parser") job_cards = html.find_all("table", class_="jobCard_mainContent") for item in job_cards: title = item.find("h2").get_text() company = item.find("span", class_="companyName").get_text() location = item.find("div", class_="companyLocation").get_text() if item.find("div", class_="salary-snippet") != None: salary = item.find("div", class_="heading6 tapItem-gutter metadataContainer").get_text() else: salary = "未找到薪资信息" # 去重判断 job_key = (title, company, location) if job_key not in seen_jobs: seen_jobs.add(job_key) vacancy = { "title": title, "company": company, "location": location, "salary": salary } jobs_NL.append(vacancy) # 导出数据 with open("indeed_junior_ux_jobs.json", "w", encoding="utf-8") as f: json.dump(jobs_NL, f, ensure_ascii=False, indent=2) print(f"爬取完成,共获取{len(jobs_NL)}条有效不重复岗位数据")
额外说明
- 如果仍存在数据缺失,可以在每次请求之间加1-3秒的随机延迟,进一步降低反爬触发概率
- 若后续网站页面结构更新,需要同步调整元素选择的class属性值
内容的提问来源于stack exchange,提问作者Lea
相关产品推荐
相关产品推荐

