LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#使用webclient下载图片时出现“远程服务器返回错误:(403)已禁止”提示

admin
2023年5月23日 9:13 本文热度 1657

在一次爬虫下载图片的过程中,遇到服务器返回403,然后寻找解决办法,解决办法如下:

1、一般造成403的原因是权限设置问题,也就是没有权限造成的,因此这里直接添加信任权限即可:

webclient.Credentials = CredentialCache.DefaultCredentials; // 添加授权证书

2、分析Reques tHeaders:

可以看到在requet中,有host,cookie等需要设置的内容,因此加上相应的内容即可,给webclient添加头信息:

WebClient mywebclient = new WebClient();

mywebclient.Credentials = CredentialCache.DefaultCredentials; // 添加授权证书

mywebclient.Headers.Add("User-Agent""Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");

mywebclient.Headers.Add("Host""biz.touchev.com");

mywebclient.Headers.Add("Cookie""UM_distinctid=16bb1d9972eab2-0ec4ae521bb726-3e385b04-1fa400-16bb1d9972f9b8; PHPSESSID=upN0hwQw8FlkIm_Y7uegI45AB8qRVRDS7yq-YGrQ5o6mm6Hc_BSqQg7hNLQ6sr8x; Hm_lvt_6dba01603aa724759d9c4ea0dddd9b72=1562056956,1562816935; CNZZDATA1273105019=948668930-1562055616-%7C1562909757; Hm_lpvt_6dba01603aa724759d9c4ea0dddd9b72=1562914189");

mywebclient.DownloadFile(url, desPath);


运行,ok~


该文章在 2023/5/23 9:19:49 编辑过

全部评论1

admin
2023年5月23日 9:14
 题外知识:

有关HTTP头完整、详细的说明,请参见 http://www.w3.org/Protocols/ 的HTTP规范。

1. RequestHeader分析:

Accept:浏览器可接受的MIME类型。    

Accept-Charset:浏览器可接受的字符集。   

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。     Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。        

Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP   1.1(HTTP   1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。   

Content-Length:表示请求消息正文的长度。   

Cookie:这是最重要的请求头信息之一   

from:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。   

Host:初始URL中的主机和端口。   

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not  Modified”应答。   

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。   

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。   

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。   

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。  

每个标头独占一行, 最后必须要有一个空行。有关HTTP头完整、详细的说明,请参见http://www.w3.org/Protocols/的HTTP规范。

2.webclient保持session和cookie的方法

https://www.cnblogs.com/anjou/archive/2008/05/25/1206832.html

有些朋友说 WebClient 不能保持 Session 和 Cookie,只有 HttpWebRequest 才能保持 Session。实际上我们只要重写 WebClient 的 GetWebRequest 方法就可以使 WebClient 保持 Session 和 Cookie。

下面是 HttpClient 类, 它继承自 WebClient,并重写了 GetWebRequest 方法。关键是要定义一个 Cookie 容器(红色代码部分):


/// <summary>
/// 支持 Session 和 Cookie 的 WebClient。
/// </summary>
public class HttpClient : WebClient 
{
    // Cookie 容器
    private CookieContainer cookieContainer;
 
    /// <summary>
    /// 创建一个新的 WebClient 实例。
    /// </summary>
    public HttpClient()
    {
        this.cookieContainer = new CookieContainer();
    }
 
    /// <summary>
    /// 创建一个新的 WebClient 实例。
    /// </summary>
    /// <param name="cookie">Cookie 容器</param>
    public HttpClient(CookieContainer cookies)
    {
        this.cookieContainer = cookies;
    }
 
    /// <summary>
    /// Cookie 容器
    /// </summary>
    public CookieContainer Cookies
    {
        get { return this.cookieContainer; }
        set { this.cookieContainer = value; }
    }
 
    /// <summary>
    /// 返回带有 Cookie 的 HttpWebRequest。
    /// </summary>
    /// <param name="address"></param>
    /// <returns></returns>
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            HttpWebRequest httpRequest = request as HttpWebRequest;
            httpRequest.CookieContainer = cookieContainer;
        }
        return request;
    }
 
    #region 封装了PostData, GetSrc 和 GetFile 方法
    /// <summary>
    /// 向指定的 URL POST 数据,并返回页面
    /// </summary>
    /// <param name="uriString">POST URL</param>
    /// <param name="postString">POST 的 数据</param>
    /// <param name="postStringEncoding">POST 数据的 CharSet</param>
    /// <param name="dataEncoding">页面的 CharSet</param>
    /// <returns>页面的源文件</returns>
    public string PostData(string uriString, string postString, string postStringEncoding, string dataEncoding, out string msg)
    {
        try
        {
            // 将 Post 字符串转换成字节数组
            byte[] postData = Encoding.GetEncoding(postStringEncoding).GetBytes(postString);
            this.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            // 上传数据,返回页面的字节数组
            byte[] responseData = this.UploadData(uriString, "POST", postData);
            // 将返回的将字节数组转换成字符串(HTML);
            string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);
            srcString = srcString.Replace("\t", "");
            srcString = srcString.Replace("\r", "");
            srcString = srcString.Replace("\n", "");
            msg = string.Empty;
            return srcString;
        }
        catch (WebException we)
        {
            msg = we.Message;
            return string.Empty;
        }
    }
 
    /// <summary>
    /// 获得指定 URL 的源文件
    /// </summary>
    /// <param name="uriString">页面 URL</param>
    /// <param name="dataEncoding">页面的 CharSet</param>
    /// <returns>页面的源文件</returns>
    public string GetSrc(string uriString, string dataEncoding, out string msg)
    {
        try
        {
            // 返回页面的字节数组
            byte[] responseData = this.DownloadData(uriString);
            // 将返回的将字节数组转换成字符串(HTML);
            string srcString = Encoding.GetEncoding(dataEncoding).GetString(responseData);
            srcString = srcString.Replace("\t", "");
            srcString = srcString.Replace("\r", "");
            srcString = srcString.Replace("\n", "");
            msg = string.Empty;
            return srcString;
        }
        catch (WebException we)
        {
            msg = we.Message;
            return string.Empty;
        }
    }
 
    /// <summary>
    /// 从指定的 URL 下载文件到本地
    /// </summary>
    /// <param name="uriString">文件 URL</param>
    /// <param name="fileName">本地文件的完成路径</param>
    /// <returns></returns>
    public bool GetFile(string urlString, string fileName, out string msg)
    {
        try
        {
            this.DownloadFile(urlString, fileName);
            msg = string.Empty;
            return true;
        }
        catch (WebException we)
        {
            msg = we.Message;               
            return false;
        }
    }
    #endregion
}
关键字查询
相关文章
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved