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

如何使用Node.js向其他网站提交数据以获取数据

用Node.js模拟网页提交请求并获取结果(以谷歌搜索为例)

嘿,这个场景我太熟悉了!之前做爬虫工具的时候经常折腾这类需求。其实核心就是模拟浏览器的HTTP请求,或者直接用无头浏览器复刻用户操作,咱们分两种常用方案来聊:

方案一:直接发送HTTP请求(轻量快速)

这种方法适合目标网站的请求逻辑简单、没有强反爬的情况,比如谷歌的基础搜索。

步骤1:分析请求结构

先打开浏览器开发者工具(F12),在谷歌搜索"stackoverflow"后,看「网络」面板里的GET请求——你会发现搜索请求的URL大概是这样的:
https://www.google.com/search?q=stackoverflow
核心参数就是q=后面的关键词,另外记得带上必要的请求头,不然谷歌会直接拦截你的请求(识别为非浏览器请求)。

步骤2:用Axios发送请求+Cheerio解析结果

咱们用axios发请求,cheerio解析HTML(语法和jQuery几乎一样,上手快)。

首先安装依赖:

npm install axios cheerio

然后写代码:

const axios = require('axios');
const cheerio = require('cheerio');

async function googleSearch(keyword) {
  try {
    // 构造请求URL和请求头(关键是User-Agent,模拟浏览器)
    const url = `https://www.google.com/search?q=${encodeURIComponent(keyword)}`;
    const headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    };

    // 发送GET请求
    const response = await axios.get(url, { headers });
    const $ = cheerio.load(response.data);

    // 提取搜索结果(根据谷歌页面的DOM结构,可能会随时间变化,需要自己验证)
    const results = [];
    $('.g').each((index, element) => {
      const title = $(element).find('.yuRUbf h3').text();
      const link = $(element).find('.yuRUbf a').attr('href');
      if (title && link) {
        results.push({ title, link });
      }
    });

    return results;
  } catch (error) {
    console.error('搜索出错:', error.message);
    return [];
  }
}

// 调用测试
googleSearch('stackoverflow').then(results => {
  console.log('搜索结果:');
  results.forEach((item, index) => {
    console.log(`${index+1}. ${item.title}`);
    console.log(`   链接:${item.link}\n`);
  });
});

注意事项

  • 谷歌的页面DOM结构可能会更新,如果你发现提取不到结果,记得重新检查选择器。
  • 如果遇到验证码或者403错误,说明被反爬了,这时候就得用下面的方案。

方案二:用无头浏览器模拟真实用户操作(应对反爬)

如果目标网站有强反爬(比如验证码、动态渲染内容),直接发HTTP请求就不好使了,这时候用puppeteer(无头Chrome)模拟真实用户的输入、点击操作最靠谱。

步骤1:安装Puppeteer

npm install puppeteer

步骤2:写模拟搜索代码

const puppeteer = require('puppeteer');

async function simulateGoogleSearch(keyword) {
  let browser;
  try {
    // 启动无头浏览器(如果要看到可视化界面,把headless设为false)
    browser = await puppeteer.launch({ headless: 'new' });
    const page = await browser.newPage();

    // 设置浏览器UA,模拟真实Chrome
    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');

    // 打开谷歌首页
    await page.goto('https://www.google.com');

    // 在搜索框输入关键词(谷歌搜索框的选择器是input[name="q"])
    await page.type('input[name="q"]', keyword, { delay: 100 }); // delay模拟真实输入速度

    // 点击搜索按钮或者按回车键
    await page.keyboard.press('Enter');
    await page.waitForNavigation({ waitUntil: 'networkidle2' }); // 等待页面加载完成

    // 提取搜索结果
    const results = await page.evaluate(() => {
      const items = [];
      document.querySelectorAll('.g').forEach(element => {
        const title = element.querySelector('.yuRUbf h3')?.textContent;
        const link = element.querySelector('.yuRUbf a')?.href;
        if (title && link) {
          items.push({ title, link });
        }
      });
      return items;
    });

    return results;
  } catch (error) {
    console.error('模拟搜索出错:', error.message);
    return [];
  } finally {
    if (browser) {
      await browser.close(); // 关闭浏览器
    }
  }
}

// 调用测试
simulateGoogleSearch('stackoverflow').then(results => {
  console.log('模拟搜索结果:');
  results.forEach((item, index) => {
    console.log(`${index+1}. ${item.title}`);
    console.log(`   链接:${item.link}\n`);
  });
});

优势

  • 完全模拟真实用户的浏览器行为,几乎不会被普通反爬机制拦截。
  • 能处理动态渲染的页面(比如需要JS加载的内容)。

总结

  • 简单场景用Axios+Cheerio,速度快、资源占用低。
  • 复杂反爬或动态页面用Puppeteer,兼容性强但资源消耗稍大。

内容的提问来源于stack exchange,提问作者NetLuis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:59:08