使用WebClient访问部分页面时抛出(403) Forbidden错误的问题
解决WebClient访问sts.pl返回403 Forbidden的问题
嘿,这个问题我之前处理过类似的场景,咱们来一步步捋清楚原因和解决办法:
为什么会出现403 Forbidden?
你遇到的403错误,本质是网站的反爬/安全机制把你的WebClient请求识别成了自动化程序,而非真实浏览器的请求。虽然你已经添加了User-Agent头,但浏览器发送的请求头远不止这一项——网站的服务器会校验请求头的完整性,一旦发现缺失关键字段,就会直接拒绝访问。
举个例子,真实浏览器(比如Chrome)访问该网站时,会自动带上这些请求头:
Accept:告诉服务器客户端能接受的内容类型Accept-Language:客户端的语言偏好Accept-Encoding:支持的压缩格式Connection:保持连接的设置- 还有可能包含会话Cookie(即使你没登录,网站也会给浏览器分配一个会话标识)
而你的WebClient代码只加了User-Agent,其他关键头都缺失,服务器很容易判断这不是正常的浏览器请求。
怎么修改代码解决问题?
你需要补充完整的请求头,甚至处理Cookie,让请求更接近真实浏览器的行为。这里有两种方案:
方案1:给WebClient添加完整请求头
直接在你的现有代码基础上,补充更多浏览器常用的请求头:
System.Net.WebClient webClient = new System.Net.WebClient(); // 用更贴近现代浏览器的User-Agent webClient.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); // 补充其他关键请求头 webClient.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"); webClient.Headers.Add("Accept-Language", "en-US,en;q=0.5"); webClient.Headers.Add("Accept-Encoding", "gzip, deflate, br"); webClient.Headers.Add("Connection", "keep-alive"); webClient.Headers.Add("Upgrade-Insecure-Requests", "1"); Stream data = webClient.OpenRead("https://www.sts.pl");
方案2:改用更灵活的HttpWebRequest(推荐)
WebClient是比较老旧的类,HttpWebRequest能更精细地控制请求细节,比如处理Cookie:
// 创建请求 var request = (HttpWebRequest)WebRequest.Create("https://www.sts.pl"); // 设置浏览器风格的请求头 request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"; request.AcceptLanguage = "en-US,en;q=0.5"; request.AcceptEncoding = "gzip, deflate, br"; request.KeepAlive = true; request.Headers.Add("Upgrade-Insecure-Requests", "1"); // 处理Cookie:模拟浏览器保存会话Cookie var cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; // 获取响应并处理流 using (var response = (HttpWebResponse)request.GetResponse()) using (var stream = response.GetResponseStream()) { // 这里可以添加你的流处理逻辑,比如读取内容 }
额外提醒
如果上面的方案还是不行,那网站可能还有更严格的反爬检测,比如JS生成的验证参数、IP频率限制等。不过从你的描述来看,浏览器能直接访问,补充请求头和Cookie应该就能解决当前的403问题。
内容的提问来源于stack exchange,提问作者user3057544
相关产品推荐
相关产品推荐

