如何抓取必应新闻
Advanced Data Extraction Specialist
TL;DR:
- Bing新闻结果位于
.news-card元素中,干净的数据在属性中,而不是文本中。 每个卡片包含data-title、url属性和data-author(出版者)— 读取这些而不是抓取渲染的文本,因为它混合了时间戳。 - 页面在客户端渲染,因此需要一个真实的浏览器。 Bing使用JavaScript在初始加载后构建新闻网格;普通的HTTP请求返回的是框架,而不是卡片。
- 分页是URL中的偏移。 追加
&first=11、&first=21等以获取更深的结果页面——没有“下一页”按钮可供点击,只有偏移。 - 从
title属性中获取摘要。.snippet在屏幕上显示截断文本,但在其title属性中存储完整的摘要。 - 将美国住宅出口固定以获得稳定结果。 Bing根据IP进行本地化和速率限制;稳定的美国住宅会话保持结果集和标记的可预测性。
- 免费开始。 新的Scrapeless账户包括免费的抓取浏览器运行时——在app.scrapeless.com注册。
引言:将Bing新闻转换为结构化Feed
Bing新闻搜索页面是一个实时的、基于查询的Feed——任何您给定主题的标题、发布者、时间戳和摘要。这使它对品牌监控、市场研究和向AI代理提供新文章非常有用。问题是,其中没有任何内容以干净的HTML格式到达您可以grep处理。
网格在浏览器中构建。使用普通HTTP客户端加载bing.com/news/search,您将获得页面框架,而不是故事——只有在JavaScript运行后卡片才会出现。一旦渲染,屏幕上的文本将出版者和相对时间混合在一起(“在MSN上15小时”),因此读取innerText会给您带来需要解开的数据。
本指南在Scrapeless抓取浏览器上运行Bing新闻抓取程序——一个连接到Puppeteer的反检测云浏览器——并读取Bing已经附加到每个卡片的结构化属性。下面的每个片段都是针对实时搜索运行的。仅限公开结果。
您可以用它做什么
- 构建主题Feed —— 拉取搜索词的每个标题、发布者、链接和摘要。
- 监控品牌或产品,通过定期重新运行相同的查询并对比结果。
- 收集文章URL,以便交给下游的全文爬虫。
- 深入访问结果页面,使用
first=偏移收集远远超过第一屏的内容。 - 向AI代理提供一组干净、结构化的新闻集,而不是原始HTML。
为什么选择Scrapeless抓取浏览器
Scrapeless抓取浏览器是一个可定制的、反检测的云浏览器,专为网络爬虫和AI代理设计。针对Bing新闻,它提供:
- 自开发的Chromium —— 渲染构建新闻网格的JavaScript,因此卡片实际上存在于DOM中。
- 反检测指纹识别 —— 会话显示为真实浏览器,因此结果页面正常服务。
- 195+个国家的住宅代理 —— 固定美国出口,以便Bing返回一致的本地化结果集。
- 会话持久性 —— 在分页请求之间保持一个会话活跃。
- 标准的Puppeteer连接 ——
Puppeteer.connect()返回一个正常的Browser;您的提取代码是普通Puppeteer。
在app.scrapeless.com的免费计划中获取您的API密钥。
先决条件
- Node.js 18或更高版本
- Scrapeless账户和API密钥 —— 在app.scrapeless.com注册
- 对Puppeteer的基本熟悉
安装
bash
npm install @scrapeless-ai/sdk puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
第一步 — 连接并加载搜索
连接到云浏览器,固定美国出口,打开您的查询的新闻搜索URL。查询放在q参数中:
javascript
import { Puppeteer } from '@scrapeless-ai/sdk';
const browser = await Puppeteer.connect({
apiKey: process.env.SCRAPELESS_API_KEY,
sessionName: 'bing-news',
proxyCountry: 'US',
sessionTTL: 300,
});
const page = await browser.newPage();
const query = 'openai';
await page.goto(`https://www.bing.com/news/search?q=${encodeURIComponent(query)}`, {
waitUntil: 'networkidle2',
timeout: 60000,
});
console.log(await page.title());
// 'openai - 搜索新闻'
networkidle2会等待结果请求完成,因此在读取卡片之前,它们已经在DOM中。
第二步 — 从属性中提取卡片
每个结果都是一个.news-card。与其解析渲染文本,不如读取Bing附加到卡片的结构化属性——它们直接给您提供干净的标题、链接和出版者:
javascript
const articles = await page.evaluate(() => {
```javascript
const abs = (u) => { try { return new URL(u, location.href).href; } catch { return null; } };
return [...document.querySelectorAll('.news-card')]
.map((card) => ({
title: card.getAttribute('data-title'),
url: abs(card.getAttribute('url')),
source: card.getAttribute('data-author'),
snippet:
card.querySelector('.snippet')?.getAttribute('title') ||
card.querySelector('.snippet')?.innerText?.trim() ||
null,
}))
.filter((a) => a.title && a.url);
});
console.log(articles.length, '文章');
console.log(articles[0]);
// 12 文章
// {
// title: "日本科技企业软银推出基于OpenAI的网络安全产品",
// url: 'https://apnews.com/article/openai-softbank-japan-technology-intelligence-cyberattacks-d8d3f9b2e5042ea949a7d5c53b782d96',
// source: '美联社新闻',
// snippet: '日本科技巨头软银集团正在推出一项服务...'
// }
data-author是出版商名称(“美联社新闻”),不包括可见文本中包含的“15小时在MSN”的时间戳。.snippet元素在屏幕上截断,但在其title属性中保留完整摘要,因此优先读取该属性。
在免费计划中获取您的API密钥:app.scrapeless.com
第3步 — 深入获取更多结果
必应新闻通过URL中的first=偏移进行分页 — 没有下一步按钮,您只需将偏移量增加十。重用相同会话并按标题去重,因为必应在页面之间重新排序某些卡片:
javascript
const seen = new Map();
for (const first of [1, 11, 21]) {
await page.goto(
`https://www.bing.com/news/search?q=${encodeURIComponent(query)}&first=${first}`,
{ waitUntil: 'networkidle2', timeout: 60000 }
);
const batch = await page.evaluate(() =>
[...document.querySelectorAll('.news-card')]
.map((card) => card.getAttribute('data-title'))
.filter(Boolean)
);
for (const title of batch) seen.set(title, true);
console.log(`first=${first}: ${batch.length} 张卡片, ${seen.size} 个唯一的`);
}
// first=1: 10 张卡片, 10 个唯一的
// first=11: 10 张卡片, 18 个唯一的
// first=21: 10 张卡片, 26 个唯一的
每个偏移大约返回十张卡片;随着你推进,唯一的计数在增加。继续推动,直到唯一总数停止增长 — 这就是查询的结果集结束。
您得到的返回内容
每篇文章都是一个扁平记录 — 标题、链接、出版商和摘要:
json
[
{
"title": "软银推出基于OpenAI模型的网络安全产品",
"url": "https://www.msn.com/en-in/lifestyle/style/softbank-launches-cybersecurity-product-based-on-openai-models/ar-AA25LC2i",
"source": "经济时报在MSN上",
"snippet": "该“补丁即服务”产品将通过合资企业在日本推出 ..."
}
]
// 模式准确反映了第2步评估的输出。字段值为示例。
一些诚实的观察:
- 每页的结果数量不是固定的。 第一屏显示了大约十几个卡片;偏移页面每页返回十个。计算您获得的内容,不要假设页面大小。
- 一些卡片在偏移中重复。 必应会重新排序结果,因此在分页时按标题或URL去重。
- 出版商格式各异。
data-author通常是简洁的名称,但签约故事写为“……在MSN上”;如果您以出版商为关键字,进行标准化。 - 链接指向外部网站。
url属性解析到出版商的文章,而不是必应重定向 — 适合直接交给全文爬虫。
结论:一个结构化的必应新闻馈送
一个可靠的必应新闻抓取工具是渲染 → 阅读卡片属性 → 步骤first=偏移。在真实浏览器中渲染以使网格存在,获取data-title/url/data-author而不是解开可见文本,并通过偏移分页,同时去重。在Scrapeless抓取浏览器中运行提供了Chromium渲染和住宅出口,使结果始终加载一致。要将收集的链接转化为完整的文章体,配合以同样方式构建的网站抓取器使用;抓取浏览器产品页面和文档涵盖了完整的SDK表面。固定美国出口,读取属性,并遍历偏移。
准备好构建您的AI驱动的数据管道了吗?
加入我们的社区,获取免费计划并与构建新闻和搜索管道的开发人员联系:Discord · Telegram。
在 app.scrapeless.com 注册以获取免费的 Scraping Browser 运行时,并根据您的监控需求调整上述模式与查询和区域。有关规模的详细信息,请参阅 定价。
常见问题
问:抓取 Bing 新闻合法吗?
收集公开可见的搜索结果通常是允许的,但 Bing 的服务条款和当地法律仍适用于您如何存储和使用数据。请仅抓取公共结果,遵守 机器人和服务条款规则,并咨询法律顾问以满足您的使用案例。
问:我需要代理吗?
是的 — 固定 proxyCountry: 'US'(或您的目标区域)。Bing 根据 IP 地址进行本地化和速率限制,因此一致的家庭出口可以保持结果集和标记的稳定。
问:我得到了页面但没有卡片,怎么回事?
卡片是通过 JavaScript 渲染的。一个普通的 HTTP 获取仅返回页面框架;在 Scraping Browser 中加载页面并等待 networkidle2,以便在读取之前网格能够进入 DOM。
问:我如何获取超过第一页的结果?
在 URL 中步进 first= 偏移量 — &first=11、&first=21 等 — 重新使用相同的会话,并通过标题去重,因为某些卡片会在多个页面重复出现。
问:标记发生了变化,我的选择器坏了,为什么?
Bing 会定期更新其布局。请根据实时页面重新检查卡片的属性名(data-title、url、data-author),并在它们变化时收紧选择器。
问:我可以同时运行多少个查询?
保持并发在适度水平 — 每个主机三个会话是针对同一网站并行运行的安全上限。
问:我可以在没有 AI 代理的情况下运行吗?
可以。这只是对 Scraping Browser 会话的普通 Puppeteer 使用 — 不需要代理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



