从返回403禁止访问的网站解析数据

3
实际上,我正在编写一个Windows Store应用程序,尝试解析一个网站,但响应返回请求中有错误不是必需的。 我有一个快照可能帮助我们找到解决方案 这段代码在我尝试的所有网站上都有效,但现在无法正常工作。
我使用以下源代码:
private async void parsingActualites()
    {
        HttpClient http = new System.Net.Http.HttpClient();
        HttpClientHandler newClientHandler = new HttpClientHandler();
        System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
        ***var reponse = await http.GetByteArrayAsync("http://.........../");***
        str3 = Encoding.UTF8.GetString(reponse, 0, reponse.Length - 1);
        var strdecodet = System.Net.WebUtility.HtmlDecode(str3);
        HtmlAgilityPack.HtmlDocument document2 = new HtmlAgilityPack.HtmlDocument();
        document2.LoadHtml(str3);

显示给我的错误是:

响应状态代码并未指示成功:403(被禁止)。

Res

这是一个更详细描述该错误的图片,您能帮我解决吗?


你能通过URL访问吗? - Vadim
是的,我可以,它正常工作100%。 - Med MANS
2个回答

14

有些Web服务器希望在请求中收到User-Agent头(如果没有看到则返回403)。您可以按照以下示例添加User-Agent头:

HttpClient httpClient = new HttpClient();
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get,"http://example.com");
// Add our custom headers
requestMessage.Headers.Add("User-Agent", "User-Agent-Here");
HttpResponseMessage response = await httpClient.SendAsync(requestMessage);

我在一些网站上遇到了同样的问题,这个方法对我有效。实际上,在任何 Stackoverflow 页面上执行 GET 请求都会返回 StatusCode 403。在请求头中设置任何用户代理后,它将返回 StatusCode 200 OK。谢谢。 - Alexandru Dicu

9
您所遇到的问题可能有几个原因。例如 - 网站可能需要身份验证,您的程序没有执行但在浏览时手动进行了身份验证。或者网站期望头文件,而您的程序没有提供。
解决此问题的正确方法是了解浏览器所做的操作,而您没有做的操作。下载 Fiddler,运行它,然后浏览到该URL。 Fiddler将显示浏览器实际发出的请求。这是一个示例 - Fiddler example
正如您所看到的,浏览器发送了多个其他头文件,您应该做同样的操作(实际上您应该找到最小的可用头文件集)。要添加头文件 - 参考http://massivescale.com/pages/custom-headers-with-httpclient/如何设置 HttpClient 请求的 Content-Type 头文件?

同样的问题,使用用户代理并不是解决方案!同样的消息 403 禁止访问。 - Med MANS
@MedMans - 1. 你是否添加了浏览器发送的所有标头?2. 网站是否需要身份验证?3. 你能否发布一个Fiddler的屏幕截图,当你浏览该网站时(你可以对除标头以外的内容进行审查),以及你的代码? - Vadim
我验证了我的代码,问题现在已经解决了,我只是将PUT方法更改为GET方法,非常感谢!(y) - Med MANS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接