如何使用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
相关产品推荐
相关产品推荐

