httpWebRequest获取流和WebClient的文件抓取
2017-07-12 11:08
253 查看
httpWebRequest获取流和WebClient的文件抓取
昨天写一个抓取,遇到了一个坑,就是在获取网络流的时候,人为的使用了stream.Length来获取流的长度,获取的时候会抛出错误,查了查文档,原因是某些流是无法获取到数据的长度的,所以不能直接得到。如果是常和stream打交道就能避免这个问题。其实直接使用do-while来获取就行了,代码如下:
其中while后只能写i>0;而不能写成i>=1024;原因可以看MSDN中的一段解释:msdn
仅当流中没有更多数据且预期不会有更多数据(如套接字已关闭或位于文件结尾)时,Read 才返回 0。 即使尚未到达流的末尾,实现仍可以随意返回少于所请求的字节。
一下是httpwebrequest和webClient抓取数据的简短代码:
昨天写一个抓取,遇到了一个坑,就是在获取网络流的时候,人为的使用了stream.Length来获取流的长度,获取的时候会抛出错误,查了查文档,原因是某些流是无法获取到数据的长度的,所以不能直接得到。如果是常和stream打交道就能避免这个问题。其实直接使用do-while来获取就行了,代码如下:
int i=0; do { byte[] buffer = new byte[1024]; i = stream.Read(buffer, 0, 1024); fs.Write(buffer, 0, i); } while (i >0);
其中while后只能写i>0;而不能写成i>=1024;原因可以看MSDN中的一段解释:msdn
仅当流中没有更多数据且预期不会有更多数据(如套接字已关闭或位于文件结尾)时,Read 才返回 0。 即使尚未到达流的末尾,实现仍可以随意返回少于所请求的字节。
一下是httpwebrequest和webClient抓取数据的简短代码:
httpWebRequest
/// <summary>
///
/// </summary>
/// <param name="url">抓取url</param>
/// <param name="filePath">保存文件名</param>
/// <param name="oldurl">来源路径</param>
/// <returns></returns>
public static bool HttpDown(string url, string filePath, string oldurl)
{
try
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Accept = @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
";
req.Referer = oldurl;
req.UserAgent = @" Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36
";
req.ContentType = "application/octet-stream";
HttpWebResponse response = req.GetResponse() as HttpWebResponse;
Stream stream = response.GetResponseStream();
// StreamReader readStream=new StreamReader
FileStream fs = File.Create(filePath);
long length = response.ContentLength;
int i=0; do { byte[] buffer = new byte[1024]; i = stream.Read(buffer, 0, 1024); fs.Write(buffer, 0, i); } while (i >0);
fs.Close();
return true;
}
catch (Exception ex)
{
return false;
}
}
WebClient
public static bool Down(string url, string desc,string oldurl) { try { WebClient wc = new WebClient(); wc.Headers.Add(HttpRequestHeader.Accept, @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 "); wc.Headers.Add(HttpRequestHeader.Referer, oldurl); wc.Headers.Add(HttpRequestHeader.UserAgent, @" Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 "); wc.Headers.Add(HttpRequestHeader.ContentType, "application/octet-stream"); wc.DownloadFile(new Uri(url), desc); Console.WriteLine(url); Console.WriteLine(" "+desc + " yes!"); return true; } catch (Exception ex) { return false; } }
相关文章推荐
- httpWebRequest获取流和WebClient的文件抓取
- 使用WebClient或HttpWebRequest模拟上传文件和数据
- 使用WebClient或HttpWebRequest模拟上传文件和数据
- C# Get请求数据 WebClient和HttpWebRequest获取HTML代码 蓝色梦想网
- 使用WebClient或HttpWebRequest模拟上传文件和数据
- C# Get请求数据 WebClient和HttpWebRequest获取HTML代码
- WebClient HttpWebRequest从网页中获取请求数据
- 【JavaWeb-6】HttpServletResponse的字符字节输出流、编码、文件下载、Captcha图片与HttpServletRequest获取request数据表单非表单数据、重定向与转发
- C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
- 使用WebClient或HttpWebRequest模拟上传文件和数据
- HttpWebRequest / HttpWebResponse 远程获取文件信息
- C# 通过HttpWebRequest 创建连接获取文件大小 判断Http类型的文件是否存在
- 使用WebClient HttpWebRequest 的高级应用,获取带验证的session下载权限
- HttpWebRequest &&FileStream分块读取和写入文件&WebClient
- 使用WebClient或HttpWebRequest模拟上传文件和数据
- 利用HttpWebRequest获取网页内容,由于Gzip压缩导致乱码的情况
- httpwebrequest 模拟登录 获取cookies 以前的代码,记录备忘!
- C#用HttpWebRequest通过代理服务器验证后抓取网页内容 。。。。。
- C#用HttpWebRequest通过代理服务器验证后抓取网页内容 。。。。。
- HttpWebRequest 接收文件