Python实现Indeed爬虫问题:无法获取职位信息+位置覆盖失效
针对Indeed爬虫问题的解决方案
问题1:位置无法被代码设置覆盖
Indeed的自动填充通常来自浏览器表单记忆或页面JS补全,可通过以下方式解决:
- 启动Chrome时禁用自动填充功能:
from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_experimental_option("prefs", { "credentials_enable_service": False, "profile.password_manager_enabled": False, "autofill.enabled": False }) driver = webdriver.Chrome(options=chrome_options) - 定位位置输入框后,强制清空再输入:
location_input = driver.find_element(By.ID, "text-input-where") # 先清空原有内容 location_input.clear() # 若仍有自动填充残留,用JS强制重置输入框值 driver.execute_script("arguments[0].value = '';", location_input) location_input.send_keys("你的目标地点") - 确认定位的是正确输入框:如果
text-input-where这个ID失效,可改用By.NAME="l"或By.CSS_SELECTOR="input[aria-label='Location']"定位。
问题2:无法抓取职位标题和公司名称
核心原因多为元素定位错误或页面未加载完全,解决方案如下:
- 使用
WebDriverWait等待页面元素加载,避免提前查找导致失败:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待职位列表区域加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.job_seen_beacon")) ) # 遍历职位卡片提取信息 job_cards = driver.find_elements(By.CSS_SELECTOR, "div.job_seen_beacon") for card in job_cards: # 捕获可能的元素查找失败,避免脚本中断 try: job_title = card.find_element(By.CSS_SELECTOR, "h2.jobTitle a").text except: job_title = "无标题" try: company_name = card.find_element(By.CSS_SELECTOR, "span.companyName").text except: company_name = "无公司名" print(f"职位:{job_title},公司:{company_name}") - 验证选择器有效性:打开Indeed页面按F12,查看当前职位标题、公司名称的实际HTML结构,替换失效的选择器(Indeed会不定期更新页面结构,旧代码的选择器可能已失效)。
- 分页内容需额外处理:若要抓取多页数据,需定位下一页按钮,等待按钮加载完成后点击,重复上述抓取逻辑。
完整修改示例片段
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置Chrome禁用自动填充 chrome_options = Options() chrome_options.add_experimental_option("prefs", { "credentials_enable_service": False, "profile.password_manager_enabled": False, "autofill.enabled": False }) driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.indeed.com/") # 输入职位名称 job_input = driver.find_element(By.ID, "text-input-what") job_input.clear() job_input.send_keys("Python Developer") # 输入目标地点,覆盖自动填充 location_input = driver.find_element(By.ID, "text-input-where") location_input.clear() driver.execute_script("arguments[0].value = '';", location_input) location_input.send_keys("New York") # 点击搜索按钮 search_btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit']") search_btn.click() # 等待职位列表加载并抓取信息 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.job_seen_beacon")) ) job_cards = driver.find_elements(By.CSS_SELECTOR, "div.job_seen_beacon") for idx, card in enumerate(job_cards, 1): job_title = card.find_element(By.CSS_SELECTOR, "h2.jobTitle a").text company_name = card.find_element(By.CSS_SELECTOR, "span.companyName").text print(f"第{idx}个职位:") print(f"标题:{job_title}") print(f"公司:{company_name}\n") driver.quit()
注意:运行前确保安装对应版本的ChromeDriver,且selenium为最新版本(执行pip install --upgrade selenium更新)。
内容的提问来源于stack exchange,提问作者Stephen Olivas
相关产品推荐
相关产品推荐

