基于Puppeteer的谷歌流量自动化机器人开发需求及代码完善
完善后的Puppeteer流量自动化机器人代码
以下是实现随机滚动、随机内链跳转功能的完整代码:
const puppeteer = require('puppeteer'); const { scrollPageToBottom } = require('puppeteer-autoscroll-down'); // 生成指定范围内的随机整数 function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // 模拟用户随机上下滚动页面 async function randomScroll(page) { const scrollDuration = getRandomInt(5000, 15000); // 滚动总时长5-15秒 const startTime = Date.now(); while (Date.now() - startTime < scrollDuration) { // 随机滚动距离:-500到500px(上下滚动) const scrollDistance = getRandomInt(-500, 500); await page.evaluate((distance) => { window.scrollBy(0, distance); }, scrollDistance); // 每次滚动后随机等待100-500毫秒 await page.waitForTimeout(getRandomInt(100, 500)); } } // 获取页面内的所有内部链接(同域名) async function getInternalLinks(page) { const currentUrl = new URL(page.url()); const currentDomain = currentUrl.hostname; return page.$$eval('a[href]', (links, domain) => { return links .map(link => link.href) .filter(href => { try { const url = new URL(href); // 只保留同域名的http/https链接,排除锚点、mailto、tel等 return url.hostname === domain && url.protocol.startsWith('http'); } catch (e) { // 处理相对路径 return href.startsWith('/') && !href.startsWith('//'); } }); }, currentDomain); } async function runBot() { // 启动浏览器,模拟真实浏览器环境 const browser = await puppeteer.launch({ headless: false, defaultViewport: { width: 1920, height: 1080 }, args: ['--start-maximized'] }); const page = await browser.newPage(); // 设置随机User-Agent,避免被识别为爬虫 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); try { // 访问谷歌搜索 await page.goto('https://www.google.com', { waitUntil: 'networkidle2' }); // 搜索目标关键词 await page.waitForSelector('#APjFqb', { visible: true }); await page.click('#APjFqb'); await page.type('#APjFqb', 'krc seo tools', { delay: getRandomInt(200, 600) }); // 随机输入延迟 await page.keyboard.press('Enter'); await page.waitForNavigation({ waitUntil: 'networkidle2' }); // 点击搜索结果中的目标网站 await page.waitForSelector('.yuRUbf a', { visible: true }); const targetLink = await page.$eval('.yuRUbf a', el => el.href); await page.goto(targetLink, { waitUntil: 'networkidle2' }); // 最多跳转3-4次页面 const maxNavigations = getRandomInt(3, 4); for (let i = 0; i < maxNavigations; i++) { // 随机滚动当前页面 await randomScroll(page); // 随机等待2-5秒再点击链接 await page.waitForTimeout(getRandomInt(2000, 5000)); // 获取当前页面的内部链接 const internalLinks = await getInternalLinks(page); if (internalLinks.length === 0) { break; // 没有内链则提前结束 } // 随机选择一个内链跳转 const randomLink = internalLinks[getRandomInt(0, internalLinks.length - 1)]; await page.goto(randomLink, { waitUntil: 'networkidle2' }); } // 最后一次滚动 await randomScroll(page); } catch (error) { console.error('机器人运行出错:', error); } finally { // 随机等待后关闭浏览器 await page.waitForTimeout(getRandomInt(3000, 8000)); await browser.close(); } } runBot();
关键功能说明
- 随机滚动函数:
randomScroll模拟用户上下滚动的行为,总时长5-15秒,每次滚动距离随机,间隔100-500毫秒,避免机械滚动被检测。 - 内部链接过滤:
getInternalLinks只提取当前域名下的有效链接,排除外部域名、锚点及非HTTP链接,确保跳转在目标网站内部进行。 - 随机跳转逻辑:循环执行3-4次跳转,每次跳转前随机等待2-5秒,从可用内链中随机选择一个,无内链时提前终止。
- 真实行为模拟:使用随机输入延迟、随机User-Agent、最大化窗口等设置,降低被谷歌或目标网站识别为爬虫的概率。
- 可靠导航处理:用
waitUntil: 'networkidle2'代替固定超时,确保页面加载完成后再执行下一步操作。
注意事项
- 谷歌搜索结果的选择器可能会随页面更新变化,若
.yuRUbf a失效,需检查当前页面的DOM结构调整选择器。 - 频繁运行此类工具可能违反谷歌的服务条款及目标网站的robots.txt规则,使用前请确认合规性。
- 可根据需求调整随机参数范围(如滚动时长、等待时间、跳转次数),进一步贴近真实用户行为。
内容的提问来源于stack exchange,提问作者Julian Singh
相关产品推荐
相关产品推荐

