现在位置首页 / 项目实战 /正文

C# GeckoWebBrowser采集网站图片的完整实例和代码

作者: IT小兵 | 2014年8月21日| 热度:℃ | 评论: |参与:

最近有很多朋友问我采集网站数据的问题,其实方式有很多,但是还得有合适的。

以前发过几篇了,今天再分享一个获取网站图片的例子。

插件管理先说明一下几个采集用的组件:

1、GeckoWebBrowser浏览器插件。是使用的Firefox一样的核心的浏览器。可以实现大部分浏览器的功能

2、HtmlAgilityPack:html解析利器。很多网站我都是用HtmlAgilityPack实现的。这个后面有时间,我再发一个基于HtmlAgilityPack的采集图片的例子,会更有意思,更简单。

上面2个各有千秋吧。GeckoWebBrowser能够处理一些ajax请求出来的数据,HtmlAgilityPack则可以间接,多线程的处理数据,适合用正则表达式,非常灵活,适合大部分场景。

好了直接上代码:百度网盘下载地址:链接:http://pan.baidu.com/s/1mgkKVaC   密码:d5jd

关键代码:

1、关于请参考.net下使用GeckoWebBrowser步骤:[.net下使用GeckoWebBrowser步骤

2、下载文件方法:

     public static void DownloadOneFileByURL(string fileName, string url, string localPath, int timeout)
        {
            try
            {
                System.Net.HttpWebRequest request = null;
                System.Net.HttpWebResponse response = null;
                request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url + fileName);
                request.Timeout = timeout;//8000 Not work ?
                response = (System.Net.HttpWebResponse)request.GetResponse();
                Stream s = response.GetResponseStream();
                BinaryReader br = new BinaryReader(s);
                //int length2 = Int32.TryParse(response.ContentLength.ToString(), out 0);
                int length2 = Int32.Parse(response.ContentLength.ToString());
                byte[] byteArr = new byte[length2];
                s.Read(byteArr, 0, length2);
                if (File.Exists(localPath + fileName)) { File.Delete(localPath + fileName); }
                if (Directory.Exists(localPath) == false) { Directory.CreateDirectory(localPath); }
                FileStream fs = File.Create(localPath + fileName);
                fs.Write(byteArr, 0, length2);
                fs.Close();
                br.Close();
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        ///Web Client Method ,only For Small picture,else large please use FTP
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="url"></param>
        /// <param name="localPath"></param>
        public static void DownloadOneFileByURLWithWebClient(string fileName, string url, string localPath)
        {
            try
            {
                System.Net.WebClient wc = new System.Net.WebClient();
                if (File.Exists(localPath + fileName)) { File.Delete(localPath + fileName); }
                if (Directory.Exists(localPath) == false) { Directory.CreateDirectory(localPath); }
                wc.DownloadFile(url, localPath + fileName);
            }
            catch (Exception ex)
            {
            }
        }

3、异步处理GeckoWebBrowser的多线程:

void AsyncNavigate(string url)
        {
            ThreadStart starter = delegate { AsyncNavigateThread(url); };
            Thread thread = new Thread(starter);
            thread.IsBackground = true;
            thread.Start();
        }
        public void ShowMsg(string msg)
        {
            if (this.InvokeRequired)
            {
                Action<string> action = this.ShowMsg;
                this.BeginInvoke(action, msg);
            }
            else
            {
                this.txtTest.Text = msg;
            }
        }
        public void ShowProcess(string msg)
        {
            if (this.InvokeRequired)
            {
                Action<string> action = this.ShowProcess;
                this.BeginInvoke(action, msg);
            }
            else
            {
                this.txtProcess.Text = msg;
            }
        }
        private delegate void StringDelegate(string url);
        private void AsyncNavigateThread(string url)
        {
            if (this == null || this.IsDisposed) return;
            if (this.InvokeRequired || Browser.InvokeRequired)
            {
                this.BeginInvoke(new StringDelegate(AsyncNavigateThread), new object[] { url });
                return;
            }
            Browser.Navigate(url);
        }

4、注册浏览器加载完成事件:

     Browser.DocumentCompleted += new EventHandler(Browser_DocumentCompleted_WEIMEI);

然后再DocumentCompleted中处理获取到的html:

        void Browser_DocumentCompleted_WEIMEI(object sender, EventArgs e)
        {
            GeckoWebBrowser br = sender as GeckoWebBrowser;
            if (br.Url.ToString() == "about:blank") { return; }
            Skybound.Gecko.GeckoElementCollection imglist = br.Document.GetElementsByTagName("img");
            foreach (Skybound.Gecko.GeckoElement a in imglist)
            {
                if (a.ClassName != null && a.ClassName.ToLower() == "imgs"
                    )
                {
                    try
                    {
                        string hreff = a.Attributes["src"].TextContent;// 排除  博海拾贝第二百零二期】吃完薯条寂寞了
                        string[] name = hreff.Split('/');
                        string filenn = "";
                        if (name.Length > 1)
                        {
                            filenn = name[name.Length - 1];
                        }
                        else
                        {
                            filenn = Guid.NewGuid().ToString() + ".jpg";
                        }
                        Log.Datalogger(hreff, "ImgList");
                        DownloadOneFileByURLWithWebClient(filenn, hreff, "d:\\imges\\");
                        //    DownloadOneFileByURL(filenn, hreff, "d:\\imges\\", 5000);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
            loadURLCount++;
            LoadLuoBO();
        }

处理思路就是,加载一个url的图片并分析完成,下载,再接着获取下一页。

更多参考:

[C#采集代理服务器ip并设置IE代理--HtmlAgilityPack实战代码]

[.Net解析html文档类库HtmlAgilityPack完整使用说明--采集软件开发尤其好用]

[搜房网房产数据采集程序demo--GeckoWebBrowser实例]

[百度风云榜数据采集工具]


点击阅读本文所属分类的更多文章: 项目实战 。和高手一起交流:346717337

未注明转发、原文均为本站原创。分享本文请注明 原文链接

给您更多信息和帮助

在这里您可以找到更多:

技术交流群:346717337 Jquery插件交流

投稿:suchso@vip.qq.com

承接:企业网站门户/微网站/微商城/CMS系统/微信公众号运营/业务咨询

echarts教程系列
本月最热文章

微信扫一扫,徜徉悠嘻网,您的休闲乐园

微信公众号:快乐每一天

随机文章
标签

技术交流群:346717337

投稿:suchso@vip.qq.com

专业专注:企业网站门户/微网站/微商城/CMS系统/微信公众号运营/付费问题咨询