使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)