使用HttpWebRequest.GetResponse()进行屏幕抓取时出现错误“远程服务器返回错误:(403)禁止访问”。

9
我们有一个工具可以检查给定的URL是否可用。如果一个给定的URL是可用的,我们软件的另一部分可以从中筛选出内容。
以下是我用于检查URL是否可用的代码。
    public static bool IsLiveUrl(string url)
    {
        HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
        webRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5";
        webRequest.CookieContainer = new CookieContainer();
        WebResponse webResponse;
        try
        {
            webResponse = webRequest.GetResponse();
        }
        catch (WebException e)
        {
            return false;
        }
        catch (Exception ex)
        {

            return false;
        }
        return true;
    }

这段代码在大多数网站上都能正常运行,但是在一个由Apache托管的特定网站上,我遇到了一个Web异常,错误信息如下:"远程服务器返回错误:(403) 禁止访问"。进一步检查发现WebException对象中有以下细节:
状态="协议错误" 状态描述="不良行为"
这是请求头 "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5 Host: scenicspares.co.uk Connection: Keep-Alive"。
这是响应头 "Keep-Alive: timeout=4, max=512 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html Date: Thu, 13 Jan 2011 10:29:36 GMT Server: Apache"。
我使用vs2008中的观察工具提取了这些标头。所使用的框架是3.5。
3个回答

13

原来我所需要的只是遵循以下步骤

            webRequest.Accept = "*/*";
            webResponse = webRequest.GetResponse();

问题已经修复。


5
明白了,我必须添加这三行代码:webRequest.Method = "GET"; webRequest.UserAgent = "Foo"; webRequest.Accept = "text/html"; 不同的服务器可能需要不同的设置。 - swdev
1
谢谢swdev。您的提示似乎解决了一些维基百科页面的问题。 - newman
1
@swdev:谢谢。我漏掉了webRequest.UserAgent这一行。 - Az-
再次看到这个页面,我很高兴有些同行从我的技巧中获益 :) - swdev
非常准确,谢谢伙计!像魔法一样奏效。为什么这还不是一个答案呢? - Dungeon
显示剩余2条评论

0

在我使用网络爬取应用程序时,我面临了这个问题长达一天,但最终我修复了它,希望能帮助其他人:

    public static string GetPageContent(string url)
    {
        CookieContainer cookieContainer = new CookieContainer();
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.CookieContainer = cookieContainer; // after Create() method
        request.AllowAutoRedirect = true; //  should be true
        request.UserAgent= ".NET Framework Test Client"; // should not be null

        var responseStr = string.Empty;
        using (var response = request.GetResponse())
        {
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            responseStr = reader.ReadToEnd();
            reader.Close();
            dataStream.Close();
        }
        return responseStr;
    }

0

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