如何使用Selenium Python稳定滚动谷歌职位页面至底部
如何稳定滚动Google职位搜索页面到底部?
我之前也踩过这个坑——用html.send_keys(Keys.END)确实不稳定,毕竟Google Jobs是动态加载内容的:只有当你滚动到列表接近底部时,它才会加载新的职位卡片,直接跳到底部经常会让页面来不及触发加载逻辑,导致停在半路上。
分享几个亲测有效的稳定方案,按推荐程度排序:
方案1:循环滚动+检查页面高度(最可靠)
这个方法的核心是:每次滚动到底部后,等待新内容加载,然后对比页面高度——如果高度不再变化,说明已经加载完所有内容了。
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.google.com/search?q=upsc+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=N1_BNfzt8n8auXjGAAAAAA%3D%3D") # 初始化页面高度 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 用JavaScript滚动到当前页面底部(比send_keys更可靠) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载,时间可以根据你的网络情况调整(2-5秒都可以) time.sleep(3) # 获取更新后的页面高度 new_height = driver.execute_script("return document.body.scrollHeight") # 如果高度没有变化,说明已经到底了,退出循环 if new_height == last_height: break # 更新高度,继续循环 last_height = new_height
方案2:直接滚动职位列表容器(更精准)
有时候Google Jobs的滚动区域是独立的列表容器,不是整个页面。你可以直接定位到这个容器,滚动它的内部:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.google.com/search?q=upsc+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=N1_BNfzt8n8auXjGAAAAAA%3D%3D") # 定位职位列表的容器(selector可能会变,建议用浏览器开发者工具确认) job_list_container = driver.find_element_by_css_selector("div[aria-label='Jobs list']") last_container_height = driver.execute_script("return arguments[0].scrollHeight", job_list_container) while True: # 滚动容器到底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", job_list_container) time.sleep(3) new_container_height = driver.execute_script("return arguments[0].scrollHeight", job_list_container) if new_container_height == last_container_height: break last_container_height = new_container_height
方案3:结合显式等待(更智能)
用固定的time.sleep()不够灵活,换成显式等待可以让代码根据页面加载状态自动调整等待时间,网络快的时候更快,网络慢的时候也不会提前结束:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait driver = webdriver.Chrome() driver.get("https://www.google.com/search?q=upsc+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=N1_BNfzt8n8auXjGAAAAAA%3D%3D") wait = WebDriverWait(driver, 10) # 最多等待10秒 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") try: # 等待页面高度增加(说明新内容加载完成) wait.until(lambda d: driver.execute_script("return document.body.scrollHeight") > last_height) except: # 超时说明没有新内容了,退出循环 break last_height = driver.execute_script("return document.body.scrollHeight")
小提示
- 不要把等待时间设得太短,否则可能触发Google的反爬机制,也会导致内容加载不充分。
- 如果selector失效了,打开浏览器开发者工具,重新定位职位列表容器的元素即可。
内容的提问来源于stack exchange,提问作者Biki
相关产品推荐
相关产品推荐

