爬虫大全:BingPreview 微软电子邮件链接预览爬虫
编辑文章简介
BingPreview 是 微软(Microsoft) 用于 为Outlook.com等电子邮件服务中的链接生成实时预览 的官方网络爬虫。其最关键的独特属性在于它并非用于主搜索引擎索引,而是专注于为电子邮件客户端提供链接的预览快照(如页面摘要、缩略图),其抓取行为通常由用户打开包含链接的邮件触发。该预览功能会直接访问链接目标,可能导致一次性或敏感链接意外失效。
用户代理
最具代表性的标准 User-Agent 字符串为:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b
BingPreview/1.0b**:核心标识,指明此为Bing预览爬虫。Windows NT 6.1**:模拟在Windows 7操作系统环境下运行。AppleWebKit/534+**:使用WebKit渲染引擎,模仿浏览器行为以正确获取页面内容。
IP范围
BingPreview 作为微软的服务,其请求源自微软的IP地址段。常见的Bing爬虫(如Bingbot)IP范围可作为参考,但不能仅凭IP段判断,必须进行反向DNS验证以确保其合法性。
- 典型微软/Bing IP段:
13.x.x.x,20.x.x.x,40.x.x.x,52.x.x.x,104.x.x.x,131.253.x.x,157.55.x.x,207.46.x.x等。 - 官方验证方法:访问微软官方验证工具(
https://www.bing.com/webmasters/verifybingbot),输入IP地址即可查验。
反向DNS验证步骤(生产环境推荐):
该方法通过验证IP的反向解析域名是否属于微软,以及该域名能否正向解析回原IP,进行双重确认。
- 对来访IP执行反向DNS查询,获取其主机名。
- 检查主机名是否匹配微软爬虫的域名模式(如
*.search.msn.com,*.msn.com,*.bing.com)。 - 对获得的主机名执行正向DNS查询,确认返回的IP地址与原始来访IP一致。
验证成功标志:同时满足以上2、3两点,即可确认是合法的微软爬虫。
操作示例(Python):
import socket
import re
def verify_ms_bot(ip_address):
try:
# 1. 反向DNS查询
hostname = socket.gethostbyaddr(ip_address)[0]
# 2. 检查是否为微软域名
ms_patterns = [r'\.msn\.com$', r'\.search\.msn\.com$', r'\.bing\.com$', r'\.microsoftonline\.com$']
if not any(re.search(p, hostname) for p in ms_patterns):
return False, f"主机名 {hostname} 未匹配微软域名。"
# 3. 正向DNS验证
forward_ip = socket.gethostbyname(hostname)
if forward_ip == ip_address:
return True, f"验证通过: {ip_address} 属于微软 (hostname: {hostname})"
else:
return False, f"验证失败: 正向DNS不匹配 ({forward_ip} != {ip_address})"
except socket.herror:
return False, "无法解析主机名"
except Exception as e:
return False, f"验证过程出错: {str(e)}"
# 在日志分析或中间件中调用
is_valid, message = verify_ms_bot('40.77.167.72')
您也可以直接使用现有的验证库(如Ruby的 bot_verification gem)来集成此功能。
交互策略
不屏蔽
- 当您的网站内容(如博客文章、产品页面)希望通过电子邮件分享,并期望在Outlook等客户端内显示良好的预览效果时。
- 对绝大多数公开的、非敏感的内容,应允许其抓取,这属于正常的网络交互。
可屏蔽的场景及方法
当BingPreview的抓取行为导致业务逻辑问题时,应考虑屏蔽,例如:
– 一次性链接(密码重置、邀请验证):爬虫访问会导致链接提前失效。
– 敏感操作端点(如“确认删除”、“支付回调”),即使这些端点通过邮件链接访问。
– 私有或内部资源,这些内容不应在邮件预览中泄露。
屏蔽方法示例:
– 在 robots.txt 中声明(此为君子协定,微软通常遵守):
“`txt
User-Agent: BingPreview
Disallow: /account/password-reset/
Disallow: /api/email-callback/
“`
– **在应用层或中间件中通过User-Agent识别并返回 `403 Forbidden`**:
“`python
# Python Flask示例
from flask import request, abort
@app.before_request
def block_bing_preview():
user_agent = request.headers.get('User-Agent', '')
if 'BingPreview' in user_agent and request.path.startswith('/account/reset-token/'):
abort(403, description="Preview crawling not allowed for this resource.")
```
– 技术性防护:对于一次性链接,务必在服务器端设计为仅对真实用户的会话(携带正确Cookie、POST请求)有效,而非对任何GET请求都执行操作,这是最根本的解决方案。
最佳实践
robots.txt 配置
- 明确引导:在
robots.txt中为BingPreview设置单独的规则,清晰地允许或禁止其访问特定路径。这比依赖默认规则更可靠。 - 区分主爬虫:请注意
BingPreview与主索引爬虫Bingbot是不同的。若只想屏蔽预览抓取而保留索引,应精确指定User-Agent: BingPreview。
SEO优化要点
- 认知差异:需明确
BingPreview不直接贡献于网站在Bing搜索中的排名,它服务于邮件预览功能。提升Bing搜索排名的核心对象是Bingbot。 - 优化主索引:针对Bing搜索的优化(如提交Sitemap至Bing站长工具、优化页面速度、使用结构化数据)应聚焦于服务
Bingbot。确保网站对Bingbot可抓取、可索引是Bing SEO的基础。
问题排查
- 链接意外失效:若用户报告来自邮件的一次性链接无效,首先检查服务器访问日志,过滤
BingPreview的User-Agent,看其是否在用户之前访问了该URL。 - 流量与资源消耗:在服务器监控中,若发现来自微软IP且User-Agent为
BingPreview的请求量异常,可审查其访问频率和路径。虽然通常由用户行为触发,但仍需排除异常情况。 - 屏蔽有效性验证:在修改
robots.txt或实施代码屏蔽后,可使用包含BingPreviewUser-Agent的测试工具尝试访问被屏蔽URL,确认其返回预期状态码(如403或遵守robots.txt规则),并持续监控日志以确保策略生效。