是否可以在C#中配置HttpClient以一致地检索网站元数据而不被阻止?

问题描述 投票:0回答:1

我已经设置了一个 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 等网站检索元数据,而不会明显被识别为抓取机器人?有没有办法在请求中表明我只对应该公开的元数据感兴趣?

c# .net-core dotnet-httpclient meta
1个回答
0
投票

感谢@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;
            }
        }

从提取的元数据创建的 OpenDemocracy.net 示例链接:

© www.soinside.com 2019 - 2024. All rights reserved.