我已经设置了一个 HttpClient,用于从网站检索元数据,以便在将 URL 在用户消息中发布到我的网站时构建预览。这适用于大多数网站的链接,但很多网站不会返回预期的数据。
例如 https://www.opendemocracy.net/en/uk/ - Facebook 和 Twitter 都检索元数据并显示预览,但返回到 C# httpClient 的 html 不包含所需的元数据,标题为“需要注意”
<head>
<title>Attention Required! | Cloudflare</title>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
我一直在检查 HeyMeta,它也无法检索元 - https://www.heymeta.com/url/www.opendemocracy.net/en/url/www.opendemocracy.net/en/uk/
这是我的代码,用于检索完整的 html,可以从 Head 中提取元数据
HttpResponseMessage response = await httpClient.GetAsync(uri).ConfigureAwait(false);
HttpContent content = response.Content;
var html = content.ReadAsStringAsync().Result;
成功返回元的示例
<title>Forge Bridge Cottage | Coniston</title>
<meta property="og:title" content="Forge Bridge Cottage | Coniston">
<meta property="og:description" content="Coppermines Cottages | Forge Bridge Cottage | Coniston Lake District Cottages">
HeyMeta 结果:https://www.heymeta.com/url/www.coppermines.co.uk/accommodation/forge-bridge-cottage-coniston
如何调整我的代码以一致地从 Facebook 和 Twitter 等网站检索元数据,而不会明显被识别为抓取机器人?有没有办法在请求中表明我只对应该公开的元数据感兴趣?
感谢@Charliface的评论,答案是添加UserAgent(如何?参考如何在HttpClient上设置默认用户代理?)
作为一个友好的机器人,只是想提供一个返回网站用户在帖子中引用的网站的链接,我的 API 仅需要头部的元数据,但这可以从返回的完整 html 中提取
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("C# App");
httpClient.Timeout = TimeSpan.FromSeconds(20);
using (HttpResponseMessage response = await httpClient.GetAsync(uri).ConfigureAwait(false))
{
HttpContent content = response.Content;
var html = await content.ReadAsStringAsync();
return html;
}
}