使用BeautifulSoup爬取Indeed职位卡片仅能获取单条数据是什么原因
爬取Indeed职位卡片问题修复方案
核心问题点
- 元素定位逻辑错误:直接匹配全页面a标签会匹配大量非职位类超链接,无法精准筛选职位卡片,需要先定位职位专属的外层容器
- 反爬拦截:直接发送无请求头的请求会被Indeed识别为爬虫,返回的页面结构缺失,无法匹配到全部职位数据
- URL拼接规则可优化:薪资参数建议补充对应的前缀标识,提高搜索准确性
修正后可运行代码
import pandas as pd from datetime import datetime import requests from bs4 import BeautifulSoup import time def get_url(job_role, minimum_salary, location): # 生成Indeed搜索URL,薪资参数添加£符号匹配平台规则 template = 'https://uk.indeed.com/jobs?q={}+%C2%A3{}&l={}' url = template.format(job_role.replace(' ', '+'), minimum_salary, location) return url # 配置请求头模拟浏览器,避免反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept-Language': 'en-GB,en;q=0.9' } url = get_url('Graduate Engineer', '20000','guildford') response = requests.get(url, headers=headers) # 增加状态码校验,确保请求成功 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") exit() soup = BeautifulSoup(response.text,'html.parser') # 精准定位所有职位卡片的外层容器 cards = soup.find_all('div', class_='job_seen_beacon') print(f"共获取到{len(cards)}条职位数据") # 遍历提取单条职位信息 job_list = [] for card in cards: job_info = {} # 职位名称 title_tag = card.find('a', class_='jcs-JobTitle') job_info['职位名称'] = title_tag.text.strip() if title_tag else '无' # 职位详情链接 job_info['详情链接'] = 'https://uk.indeed.com' + title_tag['href'] if title_tag else '无' # 公司名称 company_tag = card.find('span', {'data-testid': 'company-name'}) job_info['公司名称'] = company_tag.text.strip() if company_tag else '无' # 工作地点 location_tag = card.find('div', {'data-testid': 'text-location'}) job_info['工作地点'] = location_tag.text.strip() if location_tag else '无' # 薪资信息 salary_tag = card.find('div', {'data-testid': 'attribute_snippet_testid'}) job_info['薪资'] = salary_tag.text.strip() if salary_tag else '未公布' job_list.append(job_info) print(job_info) # 可导出为csv # pd.DataFrame(job_list).to_csv('indeed_jobs.csv', index=False, encoding='utf-8-sig') # 多页爬取示例(可选) # for page in range(0, 5): # 爬前5页 # page_url = url + f'&start={page*10}' # response = requests.get(page_url, headers=headers) # # 后续解析逻辑和单页一致 # time.sleep(2) # 每次请求间隔2秒,避免被封
注意事项
- 平台页面结构会不定期更新,若匹配不到元素可打开浏览器调试工具,重新查看职位卡片对应的class或属性,调整匹配规则即可
- 爬取频率不宜过高,单页请求间隔至少2秒,避免IP被临时封禁
- 若需要更多字段,可自行扩展解析逻辑,从卡片对象中提取对应元素即可
内容的提问来源于stack exchange,提问作者seangoulding
相关产品推荐
相关产品推荐

