如何使用API和Node.js抓取Google新闻?

news.google.com可能是查找新闻文章的最佳地点!谷歌新闻汇集了实时的、经过验证的新闻,是互联网用户最信赖和喜爱的平台之一。

出于同样的原因,抓取谷歌新闻可以用来收集最新的新闻文章、热门话题和相关的元数据,用于数据分析、研究或简单的新闻阅读。如果你想更进一步,抓取谷歌新闻还可以帮助你通过实时的网页抓取构建你自己的个性化新闻应用程序。

在这篇博文中,我们将探讨如何使用Node.JS和谷歌新闻API从谷歌新闻收集相关数据。

为什么我们要抓取谷歌新闻结果?

无论行业如何,从谷歌新闻抓取数据都能极大地促进组织的发展:

让我们以一家旅游或酒店行业的公司为例。收集有关旅游策略、安全措施和旅游趋势的信息可以帮助公司预测入住率的变化并相应地制定行动计划。他们还可以利用这些信息调整营销策略,使其更有效并吸引新客户。

另一方面,投资公司可以使用财经新闻来收集有关市场发展、监管变化和经济预测的数据。正确使用这些数据可以帮助他们更有效地管理风险,并为客户提供更准确的建议。这可以提高他们的投资组合业绩和客户满意度。

谷歌新闻抓取工具收集哪些数据?

📰 文章元数据

  • 标题: 新闻文章的标题。
  • 来源: 出版商或新闻机构(例如,BBC、CNN)。
  • 发布时间: 文章发布时间。
  • 作者:记者或投稿人的姓名。
  • 摘要/摘要: 文章的简短描述或摘录。
  • 网址:完整文章的链接。

✍️ 内容数据

  • 全文: 新闻文章的主体(需要访问源网站)。
  • 图片/媒体: 文章中嵌入的图片、视频或其他媒体。
  • 关键词/主题: 与文章相关的标签或类别(例如,"政治"、"科技")。

📊 热门趋势和流行度数据

  • 热门话题: 谷歌新闻上当前流行的话题或故事。
  • 头条新闻: 针对特定类别或地区的重点新闻文章。
  • 搜索趋势: 与新闻主题相关的热门搜索词。

🧭 地理和人口统计数据

  • 基于位置的新闻: 为特定地区或国家/地区定制的新闻文章。
  • 语言: 文章的书写语言。

🧐 分析和见解

  • 情感分析: 文章的语气或情感(正面、负面、中性)。
  • 主题聚类: 按类似主题或主题对文章进行分组。
  • 时间分析: 追踪新闻故事如何随着时间的推移而发展。

使用 Node.js 构建您的 Google 新闻抓取工具 | 分步指南

环境准备

我们需要将以下库导入 Node 项目。

ini 复制代码
const axios = require('axios');
const fs = require('fs');

现在,让我们创建一个函数来抓取谷歌新闻的一些结果:

vbnet 复制代码
async function getNewsData() {
  const headers = {
    "User-Agent":
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36",
  };

  try {
    const response = await axios.get(
      "https://news.google.com/home?hl=en-US&gl=US",
      { headers }
    );
    const html = response.data;
  } catch (error) {
    console.error("Error:", error.message);
  }
}

现在,我们设置 Header 的 User-Agent,这允许我们自然地访问 Google。然后我们使用 request 库发出请求。

现在,我们需要从返回的数据中找到所需的数据。

如果你搜索查询,你会发现每个结果或新闻都存在于页面上。因此,我们需要使用正则表达式来匹配所需的数据,然后进行处理。

ini 复制代码
const regex = /data:([.*?]), sideChannel/s;
const match = html.match(regex);

抓取 Google 新闻数据

提取的数据组中的特定信息以数组的形式存储。此时,需要对比页面上的具体信息,筛选出对应具体数据的下标。

ini 复制代码
let resp = [];
const data = JSON.parse(match[1]);
for (const section of data[1][3][1]) {
    if (Array.isArray(section[0])) {
        for (const item of section[0]) {
            const utcTime = new Date(item[4][0] * 1000).toISOString();
            console.log(utcTime)
            resp.push({
                title: item[2],
                source: {
                    name: item[10][2],
                    icon: item[10][22]?.[0] || null,
                    authors: item[item.length - 1]?.[0] || []
                },
                link: item[38],
                thumbnail: item[8]?.[0]?.[13] || null,
                thumbnail_small: item[8]?.[0]?.[0] || null,
                date: utcTime
            });
            break;
        }
    }
}

最后,我们提取了所有需要的数据。

完整代码

ini 复制代码
const axios = require('axios');
const fs = require('fs');

async function getNewsData() {
    const headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
    };

    try {
        const response = await axios.get("https://news.google.com/home?hl=en-US&gl=US", { headers });
        const html = response.data;

        const regex = /data:([.*?]), sideChannel/s;
        const match = html.match(regex);
        if (!match || !match[0]) {
            throw new Error('No valid JSON data found');
        }
        let resp = [];
        const data = JSON.parse(match[1]);
        for (const section of data[1][3][1]) {
            if (Array.isArray(section[0])) {
                for (const item of section[0]) {
                    const utcTime = new Date(item[4][0] * 1000).toISOString();
                    resp.push({
                        title: item[2],
                        source: {
                            name: item[10][2],
                            icon: item[10][22]?.[0] || null, // Safe access to nested properties
                            authors: item[item.length - 1]?.[0] || []
                        },
                        link: item[38],
                        thumbnail: item[8]?.[0]?.[13] || null,
                        thumbnail_small: item[8]?.[0]?.[0] || null,
                        date: utcTime
                    });
                    break;
                }
            }
        }
        return resp;
    } catch (error) {
        console.error('Error:', error.message);
    }
}

// Execute function
getNewsData().then(data => {
    console.log(data);
});

抓取结果

现在,让我们查看终端中运行代码的结果:

但是,为了在一个更安全的地方保存数据,我们需要做一些优化:

javascript 复制代码
const fs = require('fs');

fs.writeFileSync('data.json', JSON.stringify(resp, null, 2), 'utf8');

最终文件内容如下:

使用 Scrapeless Deep SerpApi轻松抓取 Google 新闻

我们的 Google 新闻 API 允许您抓取 Google 新闻搜索页面的结果。可以通过以下端点访问 API:"engine": "google_news"。您可以使用 APIDog 完成数据抓取,网址为apidocs.scrapeless.com/api-1458167... Deep SerpApi Playground**](app.scrapeless.com/dashboard/p...%25E8%25A7%2582%25E7%259C%258B%25E4%25BA%25A4%25E4%25BA%2592%25E5%25BC%258F%25E6%25BC%2594%25E7%25A4%25BA%25E3%2580%2582 "https://app.scrapeless.com/dashboard/products/serpapi?utm_source=official&utm_medium=blog&utm_campaign=google-news)%E8%A7%82%E7%9C%8B%E4%BA%A4%E4%BA%92%E5%BC%8F%E6%BC%94%E7%A4%BA%E3%80%82")

为什么我们要使用 API?

  • 无需从头创建解析器并维护它。
  • 绕过 Google 的阻止:可以自动解决反机器人或解决 IP 阻止问题。
  • 无需额外支付代理和网页解锁器费用。
  • 无需使用浏览器自动化。

Scrapeless Google 新闻 API 可以轻松处理上述所有问题,每个请求的响应时间很短,为 ~2.33 秒(~1.47 秒非常快)。用户只需一次 API 调用即可获得准确的抓取数据,我们使用结构良好的 JSON 显示这些数据。

加入我们的社区并获得 50 万次免费使用!

使用步骤

  • 步骤 1. 登录到Scrapeless Playground
  • 步骤 2. 找到Google 新闻参与者并单击。
  • 步骤 3. 配置查询参数。
  • 步骤 4. 单击开始搜索并获取结果。

进一步阅读

底线

本文讨论了使用 Node.js 抓取 Google 新闻的两种方法。想要拥有独立抓取工具并希望在抓取数据时保持一定灵活性的数据收集者可以使用 Node.js 作为与网页交互的替代方法。按照我们的步骤轻松构建您的抓取工具。

此外,Google 新闻 API 是一种简单的解决方案,可以快速提取和清理从网页获得的原始数据,并将其以结构化的 JSON 格式呈现。只需简单的参数配置即可快速完成数据收集。

立即免费试用!

常见问题解答

抓取 Google 新闻合法吗?

是的,抓取 Google 新闻是合法的,因为它属于公共信息。但是,您应该了解有关版权和个人数据的当地和区域法律。

Google 会删除非法内容吗?

是的。通常情况下,Google 只会在内容被认为非法的国家/地区删除或限制对该内容的访问。

Google 会阻止网页抓取工具吗?

Google 的条款和条件明确禁止抓取其服务,包括搜索结果。违反这些条款可能会导致 Google 服务阻止您的 IP 地址。因此,您可能需要配备强大的网页解锁器解决方案。

相关推荐
GISer_Jing3 小时前
Monorepo+Pnpm+Turborepo
前端·javascript·ecmascript
天涯学馆3 小时前
前端开发也能用 WebAssembly?这些场景超实用!
前端·javascript·面试
我在北京coding4 小时前
TypeError: Cannot read properties of undefined (reading ‘queryComponents‘)
前端·javascript·vue.js
海天胜景5 小时前
vue3 获取选中的el-table行数据
javascript·vue.js·elementui
翻滚吧键盘5 小时前
vue绑定一个返回对象的计算属性
前端·javascript·vue.js
苦夏木禾5 小时前
js请求避免缓存的三种方式
开发语言·javascript·缓存
超级土豆粉5 小时前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
乆夨(jiuze)6 小时前
记录H5内嵌到flutter App的一个问题,引发后面使用fastClick,引发后面input输入框单击无效问题。。。
前端·javascript·vue.js
小彭努力中6 小时前
141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
前端·javascript·vue.js·交互