如何使用Python Selenium提取Google Jobs页面via后标注的所有公司名称

代码问题分析与修正方案
原代码存在3个核心问题导致只能提取到2条记录:
- 使用全局XPath提取公司信息,没有绑定当前滚动到的职位条目,每次获取的都是页面第一个符合条件的元素内容
- Google Jobs列表为懒加载机制,没有判断所有条目是否加载完成的逻辑,异常捕获范围太粗很容易提前终止循环
- 没有处理条目切换后右侧详情区的加载延迟,可能拿到上一个职位的信息
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 需提前完成driver初始化配置,此处省略初始化逻辑 driver.get("https://www.google.com/search?q=bank+jobs+in+india&rlz=1C1CHBF_enIN869IN869&oq=upsc+jo&aqs=chrome.1.69i57j0i433i512j0i131i433i512j0i512l3j0i131i433i512l2j0i512j0i433i512&sourceid=chrome&ie=UTF-8&ibp=htl;jobs&sa=X&sqi=2&ved=2ahUKEwjR27GN_qPzAhX4ppUCHb_0B_QQkd0GegQIORAB#fpstate=tldetail&sxsrf=AOaemvIxuJXh3if0tw7ezZfjkXRe5DSxsA:1632911697417&htivrt=jobs&htidocid=hr3yUBTZAssve05hAAAAAA%3D%3D") name = [] # 先等待职位列表加载完成 WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@role='treeitem']"))) last_cnt = 0 # 连续2次拿到的条目数量一致则判定所有内容加载完成 same_cnt_times = 0 while same_cnt_times < 2: elements = driver.find_elements(By.XPATH, "//div[@role='treeitem']") current_cnt = len(elements) # 判断是否没有新加载的条目 if current_cnt == last_cnt: same_cnt_times +=1 else: same_cnt_times = 0 last_cnt = current_cnt # 遍历处理当前批次的条目 for cnt in range(last_cnt - (current_cnt - last_cnt) if current_cnt != last_cnt else 0, current_cnt): # 滚动到当前条目居中显示 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", elements[cnt]) # 点击条目触发右侧详情区刷新 elements[cnt].click() try: # 等待右侧详情的公司信息加载完成再提取 nam_ele = WebDriverWait(driver, 3).until( EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'oNwCmf') and contains(text(), 'via ')]")) ) nam = nam_ele.text company = nam.split("via ")[1].split("\n")[0].strip() if company not in name: # 新增去重逻辑避免重复收录 name.append(company) except: name.append("") time.sleep(0.5) # 滚动到列表底部触发加载更多内容 driver.execute_script("arguments[0].scrollIntoView(true);", elements[-1]) time.sleep(2) # 输出所有提取到的公司名称 print(name)
调整点说明
- 新增懒加载判定逻辑,连续2次获取的职位条目数量一致就判定所有内容加载完成,不会意外终止循环
- 每次滚动到对应职位后增加点击操作,触发右侧详情区刷新,等待对应元素加载完成后再提取内容,避免拿到旧数据
- 优化提取逻辑,新增去重处理防止重复抓取相同公司
- 适配新版本Selenium的元素定位语法,替换了已弃用的
find_elements_by_xpath写法
内容的提问来源于stack exchange,提问作者Biki
相关产品推荐
相关产品推荐

