一.     先贴一张图,这个界面就是程序的主界面了:

二.     部分代码说明(主要讲解异步分析和下载):

异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载。下载成功的均在List框链接前面划上了√ ,未能下载的图片有可能是分析错误或者是下载异常。

1.     异步分析部分代码

        /// <summary>
        /// 异步分析下载
        /// </summary>
        private void AsyncAnalyzeAndDownload(string url, string savePath)
        {
            this.uriString = url;
            this.savePath = savePath;

#region 分析计时开始

count = 0;
            count1 = 0;
            freq = 0;
            result = 0;

QueryPerformanceFrequency(ref freq);
            QueryPerformanceCounter(ref count);

#endregion

using (WebClient wClient = new WebClient())
            {
                AutoResetEvent waiter = new AutoResetEvent(false);
                wClient.Credentials = CredentialCache.DefaultCredentials;
                wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze);
                wClient.DownloadDataAsync(new Uri(uriString), waiter);
                //waiter.WaitOne();     //阻止当前线程,直到收到信号
            }
                
        }

/// <summary>
        /// 异步分析
        /// </summary>
        protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e)
        {
            AutoResetEvent waiter = (AutoResetEvent)e.UserState;
            try
            {
                if (!e.Cancelled && e.Error == null)
                {
                    
                    string dnDir = string.Empty;
                    string domainName = string.Empty;
                    string uri = uriString;

//获得域名 http://www.sina.com/
                    Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase
                    domainName = match.Value;

//获得域名最深层目录 http://www.sina.com/mail/
                    if (domainName.Equals(uri))
                        dnDir = domainName;
                    else
                        dnDir = uri.Substring(0, uri.LastIndexOf('/'));

dnDir += '/';
                    
                    //获取数据
                    string pageData = Encoding.UTF8.GetString(e.Result);
                    List<string> urlList = new List<string>();

//匹配全路径
                    match = Regex.Match(pageData, @"((http(s)?://)?)+(((/?)+[\w-.]+(/))*)+[\w-./]+\.+(" + ImageType + ")"); //, RegexOptions.IgnoreCase
                    while (match.Success)
                    {
                        string item = match.Value;
                        //短路径处理
                        if (item.IndexOf("http://") == -1 && item.IndexOf("https://") == -1)
                            item = (item[0] == '/' ? domainName : dnDir) + item;

if (!urlList.Contains(item))
                        {
                            urlList.Add(item);
                            imgUrlList.Add(item);

//实时显示分析结果
                            AddlbShowItem(item);

//边分析边下载
                            WebRequest hwr = WebRequest.Create(item);
                            hwr.BeginGetResponse(new AsyncCallback(AsyncDownLoad), hwr);
                            //hwr.Timeout = "0x30D40";        //默认 0x186a0 -> 100000 0x30D40 -> 200000
                            //hwr.Method = "POST";
                            //hwr.ContentType = "application/x-www-form-urlencoded";
                            //hwr.MaximumAutomaticRedirections = 3;
                            //hwr.Accept ="image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
                            //hwr.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
                            //IAsyncResult iar = hwr.BeginGetResponse(new AsyncCallback(AsyncDownLoad), hwr);
                            //iar.AsyncWaitHandle.WaitOne();
                        }
                        match = match.NextMatch();
                    }
                }
            }
            finally
            {
                waiter.Set();

#region 分析计时结束

QueryPerformanceCounter(ref count1);
                count = count1 - count;
                result = (double)(count) / (double)freq;

toolStripStatusLabel1.Text = "分析完毕!";
                toolStripStatusLabel2.Text = string.Format(" | 分析耗时:{0}秒", result);
                Application.DoEvents();

#endregion

//分析完毕
                isAnalyzeComplete = true;
            }
        }

这两个方法主要是用WebClient来请求然后异步获得网址所返回的数据并对数据分析,提取图片链接,提取主要有两种方式:一种是完整路径的图片链接;一种是短路径的链接,比如/images/bg.gif,程序会自动为其加上域名部分组成完整的链接。

2.     异步下载部分代码

        /// <summary>
        /// 异步接受数据
        /// </summary>
        /// <param name="asyncResult"></param>
        public  void AsyncDownLoad(IAsyncResult asyncResult)  
        {
            #region 下载计时开始

if (cfreq == 0)
            {
                QueryPerformanceFrequency(ref cfreq);
                QueryPerformanceCounter(ref ccount);
            }

#endregion

WebRequest request = (WebRequest)asyncResult.AsyncState;
            string url = request.RequestUri.ToString();
            try
            {
                WebResponse response = request.EndGetResponse(asyncResult);
                using (Stream stream = response.GetResponseStream())
                {
                    Image img = Image.FromStream(stream);
                    string[] tmpUrl = url.Split('.');
                    img.Save(string.Concat(savePath, "/", DateTime.Now.ToString("yyyyMMddHHmmssfff"), ".", tmpUrl[tmpUrl.Length - 1]));
                    img.Dispose();
                    stream.Close();
                }
                allDone.Set();

//从未下载的列表中删除已经下载的图片
                imgUrlList.Remove(url);

//更新列表框
                int indexItem = this.lbShow.Items.IndexOf(url);
                if (indexItem >= 0 && indexItem <= this.lbShow.Items.Count)
                    SetlbShowItem(indexItem);
            }
            catch (Exception)
            {
                imgUrlList.Remove(url);
            }
        }

这部分就是异步下载图片并保存的代码,调用部分请看AsyncURIAnalyze方法分析图片链接匹配成功后就开始进行图片下载,每下载完一张图片就更新显示在界面正下方List框内(在链接前标记√ )。

篇幅有限,还有一起其他重要的代码如 实时显示分析和下载结果 的代码请下载源代码查看。另外需要注意的是输入需要下载图片的网址的时候需要输入完整的链接,带http如http://www.sina.com/ 。

程序和代码:

exe可执行文件:http://files.cnblogs.com/over140/IBD_exe.rar

源代码:http://files.cnblogs.com/over140/ImagesBatchDownloading2008-8-21.rar

本文转自博客园农民伯伯的博客,原文链接:笨笨图片批量抓取下载 V0.2 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程],如需转载请自行联系原博主。

笨笨图片批量抓取下载 V0.2 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程]...相关推荐

  1. 笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new...

    前言 从[笨笨图片批量抓取下载 V0.2 beta]到[笨笨图片批量下载器 V0.3 beta]时间将近2个月,不是说这个升级版本开发了这么久,实在是懒,呵呵: )再加有时候工作忙.学习,多的时间就不 ...

  2. 笨笨图片批量下载器[C# | WinForm | 正则表达式 | HttpWebRequest]

    截图      源代码:     /Files/over140/ImagesBatchDownloading.rar 欢迎大家多多指教,可以考虑加入多线程和异步获取数据,并且正则表达式有待改善:) 请 ...

  3. Python利用bs4批量抓取网页图片并下载保存至本地

    Python利用bs4批量抓取网页图片并下载保存至本地 使用bs4抓取网页图片,bs4解析比较简单,需要预先了解一些html知识,bs4的逻辑简单,编写难度较低.本例以抓取某壁纸网站中的壁纸为例.(b ...

  4. python 爬取作品集_Python批量抓取站酷ZCOOL作品图片并归档

    前言 前几天,由于个人有需求,所以就要对站酷网一些类别下的作品的图片进行批量抓取,首先是采用的是NodeJs来写的,但是在运行的途中遇到很多的问题,所以后来就换成了Python,同时使用了多线程,使得 ...

  5. python爬虫学习基础教程,批量抓取美女图片!

    python的抓取功能其实是非常强大的,当然不能浪费,呵呵.下面就与大家分享一个python写的美女图自动抓取程序吧! 其中用到urllib2模块和正则表达式模块.下面直接上代码: 用python批量 ...

  6. 使用IDM批量抓取音效素材下载

    IDM下载器站点抓取功能,能够抓取网站上的图片.音频.视频.PDF.压缩包等等文件.更重要的是,能够实现批量抓取操作,省时省力.今天就来看一下,如何用IDM巧妙的批量抓取音效素材. 1.进入音效合辑界 ...

  7. 淘宝的主图视频,怎么批量抓取、下载的?

    主图视频,淘宝.天猫.阿里巴巴等平台,为了提升客户的购物体验,能让客户看清商品的各个细节和上身的效果,淘宝.天猫.阿里巴巴平台都一直推广商家采用主图视频来展示商品,客户也喜欢通过视频来观看商品的各个角 ...

  8. 批量抓取图虫作者页作品图片的方法

    图虫相册中很多图片都精美绝伦,让人抑制不住想要"据为己有".今天小编给大家分享一款采集工具--下图高手,下面就一采集图虫作者页图片为例,一起来操作. 作品分类效果: 图片展示效果: ...

  9. python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存

    原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...

最新文章

  1. linux互斥锁和条件变量,如何理解互斥锁和条件变量?
  2. 智能车竞赛技术报告 | 节能信标组 - 中国计量大学 - 赛博 - 8
  3. 语言 蜗牛爬树问题_一年级语文《小蜗牛》课文解析及测试题,感觉最难的是口语交际题...
  4. 增加fast cgi进程数 php7,使用 FastCGI 模式运行 PHP7 教程
  5. ecg 幅度_ECG信号中一些运动伪差的讨论
  6. 修改freebsd的主机名
  7. SAP应用followup transaction的错误讨论
  8. 查看是否打印GC收集细节
  9. 透明大页相关内核参数_透明大内存页Hugepage支持
  10. kafka实现组内广播
  11. Atitit 资源类型的分类法规范MIME类型类型 目录 1.1. 一个MIME类型至少包括两个部分:一个类型(type)和一个子类型(subtype)。 1 1.2. 命名格式MIME类型包括一个
  12. eclipse代码加版权头插件
  13. QComboBox 仅在展开时显示图标
  14. alienware 15 r2 linux驱动下载,外星人笔记本驱动-外星人Alienware驱动下载 官方版-下载啦...
  15. Petalinux2019.1详细安装
  16. 学好英语网html首页制作,首页英语
  17. iol植入手术过程_完美!浙二眼科中心完成中国首例连续视程IOL植入术 - 眼科专业讨论版 -丁香园论坛...
  18. PowerDesigner 添加字段和表名备注
  19. python垃圾邮件识别_Python贝叶斯推理垃圾邮件分类
  20. python调用vbs脚本_使用python创建的参数执行vbs文件

热门文章

  1. Spring 中 MongDB Conver转换器的使用
  2. 小程序_图片剪切功能(支持多图片上传)
  3. 学习TypeScrip3(接口和对象类型)
  4. vb.net如何查询电脑麦克风收到声音_拔掉 MacBook,用 8GB 树莓派来办公的体验如何?...
  5. 应用市场免费推广资源合集
  6. php api开发书籍,概述 · ThinkPHP API开发入门 · 看云
  7. 列举1990年到2000年间的闰年
  8. 玉蟾宫【洛谷P4147】
  9. 【ZeloEngine】反射系统填坑小结
  10. linux终端里面的光标很粗,怎么调细