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;
    }

}
时间: 2024-10-05 04:43:55

httpWebRequest获取流和WebClient的文件抓取的相关文章

Android APP测试的日志文件抓取

     1    log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb shell cat /proc/kmsg ,adb shell dmesg,adb shell dumpstate,adb shell dumpsys,adb bugreport,工程       模式等 2    LOG抓取详解 l  实时打印 adb logcat -b main -v

[整理]Android测试日志文件抓取与分析 -顶

http://blog.csdn.net/ameyume/article/details/7667574 1.log文件分类简介实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志状态信息的有:adb shell cat /proc/kmsg ,adb shell dmesg,adb shell dumpstate,adb shell dumpsys,adb bugreport,工程模式等2.LOG抓取详

【android】[转]Android软件测试的日志文件抓取简介

1    log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb shell cat /proc/kmsg ,adb shell dmesg,adb shell dumpstate,adb shell dumpsys,adb bugreport,工程模式等 2    LOG抓取详解 l  实时打印 adb logcat -b main -v time>app.log

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!

最近开发了基于C#的推流器一直不大理想,终于在不懈努力之后研究了一点成果,这边做个笔记:本文着重在于讲解下如何使用ffmpeg进行简单的推流,看似简单几行代码没有官方的文档很吃力.并获取流的源代码:如下→ #region RTMP推流(**已成功推流至服务器**) Network.Create() .WithSource(inputPath)//inputPath可以改成获取设备的视频流 .WithDest("rtmp://192.168.61.128/live/livestream"

网络爬虫(网络蜘蛛)之网页抓取

现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎.资讯采集.舆情监测等等,诸如此类.网络爬虫涉及到的技术(算法/策略)广而复杂,如网页获取.网页跟踪.网页分析.网页搜索.网页评级和结构/非结构化数据抽取以及后期更细粒度的数据挖掘等方方面面,对于新手来说,不是一朝一夕便能完全掌握且熟练应用的,对于作者来说,更无法在一篇文章内就将其说清楚.因此在本篇文章中,我们仅将视线聚焦在网络爬虫的最基础技术--网页抓取方面. 说到网页抓取,往往有两个点是不得不说的,首

hibernate抓取策略

18.抓取策略 抓取策略的意思是,在hibernate中,由一个对象如何获取其关联对象的策略,抓取策略是一种优化方式 <set name="students"  lazy="false"  cascasd="save-update"  inverse="false" fetch="select"> 抓取策略: 1.研究的主要是set集合如何提取数据 2.在Classes.hbm.xml文件中 &

Nutch学习笔记——抓取过程简析

Nutch学习笔记二--抓取过程简析 学习环境: ubuntu 概要: Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 通过nutch,诞生了hadoop.tika.gora. 先安装SVN和Ant环境.(通过编译源码方式来使用nutch) apt-get install ant apt-get install subversion [email protected]:~/data/nutch$ svn co https:

Python爬虫实战---抓取图书馆借阅信息

原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约,影响日后借书,而自己又懒得总是登录到学校图书馆借阅系统查看,于是就打算写一个爬虫来抓取自己的借阅信息,把每本书的应还日期给爬下来,并写入txt文件,这样每次忘了就可以打开该txt文件查看,每次借阅信息改变了,只要再重新运行一遍该程序,原txt文件就会被新文件覆盖,里面的内容得到更新. 用到的技术: Python版本是 2.7 ,同时用到了ur

029 hibernate抓取策略

实例A引用实例B,B如果是代理的话(比如多对一关联中):如果遍历A的查询结果集(假设有10条记录),在遍历A的时候,访问B变量,将会导致n次查询语句的发出!这个时候,如果在B一端的class上配置batch-size,hibernate将会减少SQL语句的数量. Hibernate可以充分有效的使用批量抓取,也就是说,如果仅一个访问代理(或集合),那么hibernate将不载入其他未实例化代理.批量抓取是延迟查询抓取的优化方案,你可以在两种批量抓取方案之间进行选择:在类级别和集合级别. 类/实体