笨笨图片批量抓取下载 V0.2 beta

简介:

正题

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

 

 

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

          异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载。下载成功的均在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.1 beta 采用的是同步编程,也能勉勉强强能用,有规划但一直懒于继续往下写,后来被群里一朋友采用了,给我莫大的鼓舞,决定按计划写出V0.2 beta出来,也就有了这篇文章。

     写这个东西很大一部分程度上是为了练习,里面注释比较多,就当时学习交流吧,欢迎多多指教: )



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586489,如需转载请自行联系原作者

相关文章
|
7月前
|
存储 弹性计算 安全
阿里云服务器ECS实例选购参考:vCPU到云盘IOPS等指标详解
阿里云服务器ECS实例可以分为多种实例规格族,而根据CPU、内存等配置的不同,一种实例规格族又进一步细分为多种实例规格。这些实例规格包含了众多关键的性能指标,如 vCPU、处理器、内存、vTPM、本地存储、网络带宽、网络收发包 PPS、连接数、弹性网卡、云盘带宽、云盘 IOPS 等。深入理解这些性能指标,对于用户在阿里云服务器购买过程中选择最适合自己业务需求的实例规格至关重要。
|
11月前
|
人工智能 运维 自然语言处理
OS Copilot深度体验:大模型赋能下的操作系统智能助手
作为一名运维工程师,我体验了阿里云推出的OS Copilot,这款操作系统智能助手结合大语言模型与专业知识,提供自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行接口,用户可在主流Linux系统中快速启动这些功能,大幅提升效率,尤其适合复杂任务处理。安装简便,支持批量操作,大幅减少重复劳动。建议尝试,探索AI在系统管理中的潜力。
304 25
OS Copilot深度体验:大模型赋能下的操作系统智能助手
|
10月前
|
机器学习/深度学习 人工智能 边缘计算
联邦
随着人工智能的发展,联邦学习在打破“数据孤岛”和保护隐私方面展现出巨大潜力,但也面临诸多安全挑战。本文总结了五个关键研究方向:1. 提高防御方法的鲁棒性,以应对多种攻击;2. 研究更多样化的攻击手段,促进防御进步;3. 提升通信效率,平衡安全与性能;4. 探索异构联邦学习,拓展应用场景;5. 增强模型可解释性,确保应用安全。未来需深入研究这些方向,推动联邦学习成为数据安全领域的关键技术。
|
10月前
|
测试技术 API 数据安全/隐私保护
API 调试与管理工具选型思考:Apifox 和 Apipost,企业究竟该如何选择?
在企业级 API 调试与管理场景中,选择一款高效的工具至关重要。市面上的调试工具琳琅满目,而 Apifox 和 Apipost 是近几年两款备受开发者关注的 API 工具。二者都宣称为团队协作和接口调试赋能,但对企业来说,究竟谁才是更适合的选择呢?本文将从功能对比、用户体验、企业适配度和性价比等多个维度做一次全面解析,帮助你做出更明智的选择。
289 1
|
Web App开发
谷歌直链下载云盘数据集,使用谷歌云盘生成直接下载的url,示例: NeRFStudio-nerfacto默认训练数据集poster下载,nerfstudio 数据集下载链接
谷歌直链下载云盘数据集,使用谷歌云盘生成直接下载的url,示例: NeRFStudio-nerfacto默认训练数据集poster下载,nerfstudio 数据集下载链接
1011 0
谷歌直链下载云盘数据集,使用谷歌云盘生成直接下载的url,示例: NeRFStudio-nerfacto默认训练数据集poster下载,nerfstudio 数据集下载链接
|
C# 数据安全/隐私保护 开发者
『.NET』.NET 中常用的AOP框架——Castle
📣读完这篇文章里你能收获到 - AOP概念介绍 - 结合具体代码讲解.NET项目接入Castle
539 0
『.NET』.NET 中常用的AOP框架——Castle
|
存储 开发者 iOS开发
打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程
打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程
400 0
|
机器学习/深度学习 存储 Shell
Google Colab免费GPU大揭晓:超详细使用攻略
Google Colab免费GPU大揭晓:超详细使用攻略
阿里云商标注册申请流程新版教程(智能注册申请新手操作笔记)
阿里云商标类型、阿里云商标名称、阿里云商标图样、阿里云商标说明、阿里云商标类别选择、阿里云上传商标申请人材料,阿里云商标注册图文教程快速上手笔记,本文以阿里云商标智能注册申请为例,商标智能注册申请需要用户手动填写商标类型、商标名称、商标图样、商标说明及商标分类表选择等操作,流程较为复杂,阿里云百科来详细说下阿里云商标注册快速上手笔记
769 0
阿里云商标注册申请流程新版教程(智能注册申请新手操作笔记)
如何查看Mac上的隐藏文件和文件夹
隐藏的文件和文件夹 我们的电脑上,默认情况下会有很多隐藏文件和文件夹。这些文件和文件夹大部分都是一些支撑Mac运行的重要文件,主要是为了防止用户在使用过程中意外将其删除或者修改他们。
如何查看Mac上的隐藏文件和文件夹