如何使用Puppeteer滚动Google Jobs页面左侧职位列表?
解决Puppeteer滚动Google Jobs左侧职位列表的问题
Google Jobs的左侧职位列表是独立的滚动容器,并非整个页面滚动,所以直接调用全局滚动方法(比如window.scrollTo)不会生效。以下是可行的解决思路和代码实现:
核心思路
找到左侧列表的专属滚动容器元素,直接操作该元素的滚动属性,同时配合等待新内容加载的逻辑,确保能加载出所有职位。
具体实现步骤
1. 定位滚动容器
先通过浏览器开发者工具确认左侧列表的滚动容器选择器,通常可用以下选择器之一(根据页面实际结构调整):
div.gws-plugins-horizon-jobs__jldiv[role='listbox']#tl_ditc > div
2. 滚动容器并等待内容加载
通过page.evaluate()在页面上下文内操作容器的scrollTop属性,每次滚动后等待新职位加载,重复直到无法加载更多内容。
示例代码:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.goto('你的Google Jobs目标链接', { waitUntil: 'networkidle2' }); // 定义滚动加载函数 const scrollJobList = async () => { let previousHeight = 0; let currentHeight = 0; do { previousHeight = currentHeight; // 滚动容器到底部 currentHeight = await page.evaluate(() => { const jobListContainer = document.querySelector('div.gws-plugins-horizon-jobs__jl'); if (!jobListContainer) return 0; jobListContainer.scrollTop = jobListContainer.scrollHeight; return jobListContainer.scrollHeight; }); // 等待新内容加载(可根据网络情况调整等待时间) await page.waitForTimeout(2000); // 检查是否有"查看更多"按钮,存在则点击 const hasMoreButton = await page.$eval('button[aria-label="查看更多职位"]', el => !!el).catch(() => false); if (hasMoreButton) { await page.click('button[aria-label="查看更多职位"]'); await page.waitForTimeout(2000); } } while (currentHeight > previousHeight); // 滚动高度不再变化时停止 }; await scrollJobList(); // 抓取职位信息示例 const jobs = await page.evaluate(() => { const jobItems = document.querySelectorAll('div.gws-plugins-horizon-jobs__job-listing'); return Array.from(jobItems).map(item => { const title = item.querySelector('h3').textContent.trim(); const company = item.querySelector('div.gws-plugins-horizon-jobs__company-name').textContent.trim(); return { title, company }; }); }); console.log(jobs); await browser.close(); })();
3. 备选方案:模拟鼠标滚轮滚动
如果直接操作scrollTop无效,可以模拟在容器内滚动鼠标滚轮:
await page.evaluate(() => { const jobListContainer = document.querySelector('div.gws-plugins-horizon-jobs__jl'); if (jobListContainer) { // 模拟滚轮向下滚动300px jobListContainer.dispatchEvent(new WheelEvent('wheel', { deltaY: 300, bubbles: true })); } });
将这段代码放到循环中,配合等待逻辑重复执行即可。
注意事项
- Google页面结构可能会更新,需定期检查选择器是否有效;
- 滚动间隔和等待时间要根据网络情况调整,避免触发反爬机制;
- 可添加随机延迟,模拟人类操作行为。
内容的提问来源于stack exchange,提问作者Sumanth Jois
相关产品推荐
相关产品推荐

