在一次爬虫下载图片的过程中,遇到服务器返回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~

题外知识:

有关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
}

C#使用webclient下载图片返回403forbiden相关推荐

  1. JS 实现跨域外链下载图片(不支持IE)

    跨域需要服务器设置 function ddd(){// ES6 语法let src = 'https://fenmul.github.io/Sin.gtihub.io/images/qrcode.bm ...

  2. 使用Silverlight2的WebClient下载远程图片

    在Silverlight 2之前有一个Downloader对象,开发者一般使用Downloader下载图片和文体文件,这个对象在Silverlight 2中作为了一个特性被集成到WebClient类之 ...

  3. 前端通过后端返回的url下载图片方法

    前端通过后端返回的url下载图片方法: 1.a标签下载方式: <div class="code-info"><img :src="data.qrCode ...

  4. 在 C# 中下载图片

    使用 C# 中 WebClient 类下载图片 使用 C# 中的 Bitmap 类在不知道格式的情况下下载图片 使用 C# 中的Image.FromStream() 函数下载不知道格式的图片 1.使用 ...

  5. scrapy (2)下载图片及存储信息

    例1:scrapy项目的使用(利用item收集抓取的返回值) 1.创建scrapy项目 1 2 3 4 5 6 scrapy startproject booklist New Scrapy proj ...

  6. 多线程 python tcp 图片_Python第四周之网络编程TCP (服务器/客户端; 线程下载图片;线程版服务器和客户端(单人、多人)) UDP...

    # 网络编程 # 计算机网络, 把多台独立自主的计算机,连接到网络,实现资源的共享 # Internet网,(互联网)eniac 1946美国大学第一台电子计算机 # # 一个TCP报文除了包含要传输 ...

  7. c++ url下载图片

    /* @author:CodingMengmeng @theme:C++根据图片url下载图片 @time:2017-1-6 22:58:00 @blog:http://www.cnblogs.com ...

  8. python下载图片-Python下载URL图片

    所谓下载URL图片就是指通过网络图片的URL去用脚本自动获取和下载图片到本地. 这里介绍两种方法,一种需要用到第三方库requests,一种直接使用Python自带的库urllib. 首先找到你要下载 ...

  9. php微信jssdk下载图片,微信JSSDK上传多张图片回调方法以及服务器端处理下载媒体...

    有时候我们会在微信有这样的需求.在一个上传控件里面上传多个图片.而在微信里面使用file上传有些手机会崩溃而且.服务器端压缩图片效果也没有微信压缩效果好.这个就要使用微信的jssdk了. 如下就是微信 ...

  10. 简单图库软件的实现(联网下载图片保存到sdcard在Listview中展示,并作为ContentProvider为其他软件提供图库数据)

    先看效果图: 这就是一个可以联网的图库软件,下面我们来看看需求 业务需求 1.判断是否第一次运行,第一次运行,提示添加新条目 2.点击添加按钮,弹出对话框,输入图片网址和标题 3.下载图片保存到本地S ...

最新文章

  1. python语言属于-Python语言属于( )。_学小易找答案
  2. 图卷积神经网络(part6)--GAT
  3. html5中 save方法,如何HTML5画布另存为窗口8 Metro应用中的图像文件?(How to save html5 c...
  4. 过滤日志中不相关的堆栈跟踪行
  5. 计算机学校教学大纲,中等职业学校计算机应用基础教学大纲
  6. 2020年周数和日期对应表_2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期...
  7. 在MacBook上Jupyter安装
  8. Python数据结构与算法(1.1)——数据结构与算法导论
  9. laravel中get()与 first()区别、collection与stdClass的区别
  10. 【转】临界区、互斥对象
  11. SpringBoot的C2C水果商城系统
  12. 在Swift中使用dispatch_once单例模型
  13. python的彪悍特性--自省
  14. VDI IDV VOI
  15. 数据结构-树结构-哈夫曼应用-修理牧场
  16. Win11怎么创建系统映像?
  17. 什么是redis?为什么要用redis?(redis的概述)
  18. Unity3D-打飞碟小游戏
  19. python程序设计第二章序列类型 题库及选解
  20. .NET 数组之间进行转换 Array.ConvertAll

热门文章

  1. 【人脸识别】基于matlab GUI PCA+SVM人脸识别(准确率)【含Matlab源码 823期】
  2. 【水果识别】基于matlab GUI阈值分类器草莓识别【含Matlab源码 653期】
  3. shader 反射 水面_大规模水面渲染
  4. snorkel_Snorkel AI:标记培训数据的程序化方法
  5. YOLOv5与Faster RCNN相比。 谁赢?
  6. 数字社会的下一波浪潮_下一波创业浪潮是自然而然的
  7. ai中如何建立阴影_在投资管理中采用AI:公司如何成功建立
  8. 契税申报期限_纳税申报的5个小常识,会计不知道,真不适合干会计 D1
  9. Ubuntu中mkdir失败,显示不存在此目录(mkdir: cannot create directory : No such file or directory)
  10. red hat linux yum,Red Hat Linux安装CentOS的yum源