You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:03:06