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

Posted

技术标签:

【中文标题】使用 HttpWebRequest.GetResponse() 进行屏幕抓取时出现错误“远程服务器返回错误:(403) Forbidden”【英文标题】:Getting Error "The remote server returned an error: (403) Forbidden" when screen scraping using HttpWebRequest.GetResponse() 【发布时间】:2011-06-08 10:09:01 【问题描述】:

我们有一个工具可以检查给定的 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) Forbidden” 经过进一步检查,我在 WebException 对象中发现了以下详细信息

状态="协议错误" StatusDescription="不良行为"

这是请求标头“User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5 主办方:sceneryspares.co.uk 连接:保持活动状态”

这是响应标头“Keep-Alive: timeout=4, max=512 连接:保持活动 传输编码:分块 内容类型:文本/html 日期:格林威治标准时间 2011 年 1 月 13 日星期四 10:29:36 服务器:阿帕奇”

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

【问题讨论】:

【参考方案1】:

原来我只需要关注

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

它已经修复了。

【讨论】:

您好@syed,我遇到了同样的问题,并且已经添加了 .Accept 代码,但我仍然收到此错误。有任何想法吗?谢谢 知道了,我必须添加这三行,` webRequest.Method = "GET"; webRequest.UserAgent = "Foo"; webRequest.Accept = "text/html";`不同的服务器可能需要不同的设置 感谢 swdev。您的提示似乎解决了某些***页面的问题。 @swdev:谢谢。我错过了 webRequest.UserAgent 行。 刚刚再次看到这个页面,我很高兴那里的一些人从我的提示中获益:)【参考方案2】:

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

【讨论】:

【参考方案3】:

在面对这个问题一整天后,我为我的网络 scraping 应用修复了它,希望它可以帮助其他人:

    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;
    

【讨论】:

以上是关于使用 HttpWebRequest.GetResponse() 进行屏幕抓取时出现错误“远程服务器返回错误:(403) Forbidden”的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)