博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
httpWebRequest获取流和WebClient的文件抓取
阅读量:6587 次
发布时间:2019-06-24

本文共 2425 字,大约阅读时间需要 8 分钟。

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中的一段解释:

仅当流中没有更多数据且预期不会有更多数据(如套接字已关闭或位于文件结尾)时,Read 才返回 0。 即使尚未到达流的末尾,实现仍可以随意返回少于所请求的字节。

一下是httpwebrequest和webClient抓取数据的简短代码:

httpWebRequest

/// /// /// /// 抓取url/// 保存文件名/// 来源路径/// 
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;    }}

转载于:https://www.cnblogs.com/ac1985482/p/httpWebRequest_stream_WebClient_doanload.html

你可能感兴趣的文章
java内存模型(netty权威指南)
查看>>
Fragment问题集
查看>>
NSNotificationCenter详解
查看>>
【javascript】浮点数运算问题分析及解决方法
查看>>
TQ2440实现触摸屏和qt图形 解决segmentation fault
查看>>
HBase的JavaAPI使用
查看>>
Debian GNU/kFreeBSD是什么
查看>>
使用base64:url 来定义背景图片url
查看>>
Oracle事务隔离级别
查看>>
PNG文件格式具体解释
查看>>
WebService注解
查看>>
7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景...
查看>>
cocos2dx 3.1从零学习(三)——Touch事件(回调,反向传值)
查看>>
GetParam(name)
查看>>
android PopupWindow实现从底部弹出或滑出选择菜单或窗口
查看>>
(面试必知)必知必会的冒泡排序和快速排序
查看>>
图解iPhone开发新手教程
查看>>
ext2磁盘布局
查看>>
23种设计模式(3):抽象工厂模式
查看>>
【Android】自己定义控件——仿天猫Indicator
查看>>