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

时间:2011-01-13 10:35:07

标签: c# httpwebrequest screen-scraping httpwebresponse http-status-code-403

我们有一个工具可以检查给定的网址是否为实时网址。如果给定的网址是实时的,我们软件的另一部分可以屏蔽其中的内容。

这是我检查网址是否有效的代码

    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对象

中找到了以下详细信息

状态= “ProtocolError” StatusDescription =“不良行为”

这是请求标题“User-Agent:Mozilla / 5.0(Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6)Gecko / 20060728 Firefox / 1.5 主持人:scenicspares.co.uk 联系:保持活力“

这是响应标题“Keep-Alive:timeout = 4,max = 512 连接:保持活力 转移编码:分块 内容类型:text / html 日期:2011年1月13日星期四,格林威治标准时间10:29:36 服务器:Apache“

我在vs2008中使用手表提取了这些标题。正在使用的框架是3.5。

3 个答案:

答案 0 :(得分:14)

原来,我需要做的就是关注

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

它已修复。

答案 1 :(得分:0)

我相信有很多类似的问题依赖于服务器应用程序。在我的特定情况下,请参阅:The remote server returned an error: (403) Forbidden

答案 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;
    }