C#使用webclient下载图片返回403forbiden
在一次爬虫下载图片的过程中,遇到服务器返回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相关推荐
- JS 实现跨域外链下载图片(不支持IE)
跨域需要服务器设置 function ddd(){// ES6 语法let src = 'https://fenmul.github.io/Sin.gtihub.io/images/qrcode.bm ...
- 使用Silverlight2的WebClient下载远程图片
在Silverlight 2之前有一个Downloader对象,开发者一般使用Downloader下载图片和文体文件,这个对象在Silverlight 2中作为了一个特性被集成到WebClient类之 ...
- 前端通过后端返回的url下载图片方法
前端通过后端返回的url下载图片方法: 1.a标签下载方式: <div class="code-info"><img :src="data.qrCode ...
- 在 C# 中下载图片
使用 C# 中 WebClient 类下载图片 使用 C# 中的 Bitmap 类在不知道格式的情况下下载图片 使用 C# 中的Image.FromStream() 函数下载不知道格式的图片 1.使用 ...
- scrapy (2)下载图片及存储信息
例1:scrapy项目的使用(利用item收集抓取的返回值) 1.创建scrapy项目 1 2 3 4 5 6 scrapy startproject booklist New Scrapy proj ...
- 多线程 python tcp 图片_Python第四周之网络编程TCP (服务器/客户端; 线程下载图片;线程版服务器和客户端(单人、多人)) UDP...
# 网络编程 # 计算机网络, 把多台独立自主的计算机,连接到网络,实现资源的共享 # Internet网,(互联网)eniac 1946美国大学第一台电子计算机 # # 一个TCP报文除了包含要传输 ...
- c++ url下载图片
/* @author:CodingMengmeng @theme:C++根据图片url下载图片 @time:2017-1-6 22:58:00 @blog:http://www.cnblogs.com ...
- python下载图片-Python下载URL图片
所谓下载URL图片就是指通过网络图片的URL去用脚本自动获取和下载图片到本地. 这里介绍两种方法,一种需要用到第三方库requests,一种直接使用Python自带的库urllib. 首先找到你要下载 ...
- php微信jssdk下载图片,微信JSSDK上传多张图片回调方法以及服务器端处理下载媒体...
有时候我们会在微信有这样的需求.在一个上传控件里面上传多个图片.而在微信里面使用file上传有些手机会崩溃而且.服务器端压缩图片效果也没有微信压缩效果好.这个就要使用微信的jssdk了. 如下就是微信 ...
- 简单图库软件的实现(联网下载图片保存到sdcard在Listview中展示,并作为ContentProvider为其他软件提供图库数据)
先看效果图: 这就是一个可以联网的图库软件,下面我们来看看需求 业务需求 1.判断是否第一次运行,第一次运行,提示添加新条目 2.点击添加按钮,弹出对话框,输入图片网址和标题 3.下载图片保存到本地S ...
最新文章
- python语言属于-Python语言属于( )。_学小易找答案
- 图卷积神经网络(part6)--GAT
- html5中 save方法,如何HTML5画布另存为窗口8 Metro应用中的图像文件?(How to save html5 c...
- 过滤日志中不相关的堆栈跟踪行
- 计算机学校教学大纲,中等职业学校计算机应用基础教学大纲
- 2020年周数和日期对应表_2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期...
- 在MacBook上Jupyter安装
- Python数据结构与算法(1.1)——数据结构与算法导论
- laravel中get()与 first()区别、collection与stdClass的区别
- 【转】临界区、互斥对象
- SpringBoot的C2C水果商城系统
- 在Swift中使用dispatch_once单例模型
- python的彪悍特性--自省
- VDI IDV VOI
- 数据结构-树结构-哈夫曼应用-修理牧场
- Win11怎么创建系统映像?
- 什么是redis?为什么要用redis?(redis的概述)
- Unity3D-打飞碟小游戏
- python程序设计第二章序列类型 题库及选解
- .NET 数组之间进行转换 Array.ConvertAll
热门文章
- 【人脸识别】基于matlab GUI PCA+SVM人脸识别(准确率)【含Matlab源码 823期】
- 【水果识别】基于matlab GUI阈值分类器草莓识别【含Matlab源码 653期】
- shader 反射 水面_大规模水面渲染
- snorkel_Snorkel AI:标记培训数据的程序化方法
- YOLOv5与Faster RCNN相比。 谁赢?
- 数字社会的下一波浪潮_下一波创业浪潮是自然而然的
- ai中如何建立阴影_在投资管理中采用AI:公司如何成功建立
- 契税申报期限_纳税申报的5个小常识,会计不知道,真不适合干会计 D1
- Ubuntu中mkdir失败,显示不存在此目录(mkdir: cannot create directory : No such file or directory)
- red hat linux yum,Red Hat Linux安装CentOS的yum源