C# 网络编程之webBrowser获取网页url和下载网页中图片

该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试下载网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识、正则表达式实现浏览、获取url、下载图片三个功能.而且很清晰的解析了每一步都是以前一步为基础实现的.

一.界面设计

界面设计如下图所示,添加控件如图,设置webBrowser1其Anchor属性为Top、Bottom、Left、Right,实现对话框缩放;设置groupBox1其Dock(定义要绑到容器控件的边框)为Buttom,实现当浏览器缩放时groupBox1始终在最下边;设置listBox其HorizontalScrollbar属性为True,显示水平滚动条.

二.源代码

1.命名空间

[csharp] view plaincopy

  1. //新添加命名空间
  2. using System.Net;
  3. using System.IO;
  4. using System.Text.RegularExpressions;  //正则表达式

2.浏览

点击"浏览"按钮,生成button1_Click(object sender, EventArgs e)点击事件中添加如下代码,实现浏览网页:

[csharp] view plaincopy

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. webBrowser1.Navigate(textBox1.Text.Trim());         //显示网页
  4. }

调用webBrowser的Navigate方法将指定位置的文档加载到控件中,其中一种重载方法Navigate(urlString)将制定的统一资源定位符URL处的文档加载到WebBrowser控件中替换上一个文档.

3.获取

点击"获取"按钮,生成button2_Click(object sender, EventArgs e)点击事件中添加如下代码,通过获取"html.OuterHtml"当前网页的HTML内容,利用正则表达式获取网页中所有内容的URL超链接和图片的URL,并显示在listBox控件中.

[csharp] view plaincopy

  1. <strong>//定义num记录listBox2中获取到的图片URL个数
  2. public int num = 0;
  3. //点击"获取"按钮
  4. private void button2_Click(object sender, EventArgs e)
  5. {
  6. HtmlElement html = webBrowser1.Document.Body;      //定义HTML元素
  7. string str = html.OuterHtml;                       //获取当前元素的HTML代码
  8. MatchCollection matches;                           //定义正则表达式匹配集合
  9. //清空
  10. listBox1.Items.Clear();
  11. listBox2.Items.Clear();
  12. //获取
  13. try
  14. {
  15. //正则表达式获取<a href></a>内容url
  16. matches = Regex.Matches(str, "<a href=\"([^\"]*?)\".*?>(.*?)</a>", RegexOptions.IgnoreCase);
  17. foreach (Match match in matches)
  18. {
  19. listBox1.Items.Add(match.Value.ToString());
  20. }
  21. //正则表达式获取<img src=>图片url
  22. matches = Regex.Matches(str, @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""‘]?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""‘<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
  23. foreach (Match match in matches)
  24. {
  25. listBox2.Items.Add(match.Value.ToString());
  26. }
  27. //记录图片总数
  28. num = listBox2.Items.Count;
  29. }
  30. catch (Exception msg)
  31. {
  32. MessageBox.Show(msg.Message);    //异常处理
  33. }
  34. }</strong>

其中MatchCollection Regex.Matches(string input,string pattern,RegexOption options)表示使用指定的匹配选项pattern在输入的字符串中搜索指定正则表达式的所有结果.上面RegexOptions.IgnoreCase表示不区分大小写匹配.因为下载中我会显示下载成功结果到listBox2中,所以这里使用num先计算图片总数.

4.下载

在"获取"中我们已经获取到了所有网页内容的URL和图片的URL,这里想要下载图片,但它的格式通常是:“<img src="http://www.baidu.com/img/bdlogo.gif"width="270" height="129">”所以这里只需要获取src中的内容实现访问该图片,在调用文件相关知识实现简单下载图片.而获取src中的值很显然也是通过正则表达式获取的.代码如下:

[csharp] view plaincopy

  1. //点击"下载"实现下载图片
  2. private void button3_Click(object sender, EventArgs e)
  3. {
  4. string imgsrc = string.Empty;             //定义
  5. //循环下载
  6. for (int j = 0; j < num; j++)
  7.  {  
  8. string content = listBox2.Items[j].ToString();    //获取图片url
  9. Regex reg = new Regex(@"<img.*?src=""(?<src>[^""]*)""[^>]*>", RegexOptions.IgnoreCase);
  10. MatchCollection mc = reg.Matches(content);        //设定要查找的字符串
  11. foreach (Match m in mc)
  12. {
  13. try
  14. {
  15. WebRequest request = WebRequest.Create(m.Groups["src"].Value);//图片src内容
  16. WebResponse response = request.GetResponse();
  17. //文件流获取图片操作
  18. Stream reader = response.GetResponseStream();
  19. string path = "E://" + j.ToString() + ".jpg";        //图片路径命名
  20. FileStream writer = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
  21. byte[] buff = new byte[512];
  22. int c = 0;                                           //实际读取的字节数
  23. while ((c = reader.Read(buff, 0, buff.Length)) > 0)
  24. {
  25. writer.Write(buff, 0, c);
  26. }
  27. //释放资源
  28. writer.Close();
  29. writer.Dispose();
  30. reader.Close();
  31. reader.Dispose();
  32. response.Close();
  33. //下载成功
  34. listBox2.Items.Add(path + ":图片保存成功!");
  35. }
  36. catch (Exception msg)
  37. {
  38. MessageBox.Show(msg.Message);
  39. }
  40. }
  41. }
  42. }

该部分代码可能存在几个问题: (1).获取图片格式不一定是jpg格式,这里主要想展示一种思想,具体的不同图片获取设置一下即可; (2).采用该文件流的方法下载速度很慢,可以采用其他方法,WebClient.DownloadFile()等,因为我刚好研究了文件知识和网络爬虫,所以就采用了此基础方法; (3).代码中的两层循环有点多余,但MatchCollection mc获取的是匹配集合,总体感觉此段还是有点乱; (4).如果想批量下载图片,最好使用上线程等知识,同时采用一些优秀的算法(强调是算法),内存中获取,该程序只是基础知识.

三.运行结果

运行结果如下图所示:点击"浏览"按钮可以实现浏览网页,点击"获取"可以获取网页的URL并显示在listBox控件中,最后点击"下载"把图片保存到E盘目录下,下面就是浏览百度时下载的logo图标.(如果图片没有源URL路径,需要自己去实现,如<img src="/sites/default/files/bitren_logo.gif">)

四.网页基础知识

这里主要介绍HTML网页制作中的超链接和图片链接的基础知识,更好的方便大家理解这篇文章.(参考赵丰年的《网页制作教程》) 1.页面链接 网页中创建超链接需要使用A标记符,结束标记符为</A>.它的最基本属性是href,用于指定超链接的目标,通过href属性指定不同的值,可以创建不同类型的超链接.同时<A>和</A>之间可以用单击对象作为超链接的源(文字或图片). 如百度首页中的:“<a href="http://news.baidu.com">新&nbsp;闻</a>”.(锚点连接这里就不介绍) 2.插入图片 在HTML中使用IMG标记符向网页中插入图片,它的两个必要基本属性是src和alt.分别用于设置图像文件的位置和替换文本. (1).src属性表示要插入图像的文件名,必须包含绝对路径或相对路径. (2).alt属性表示图像的简单文本说明,用于不能显示图像的浏览器或显示时间过长时先替换显示. 如百度首页的logo图标图片“<img src="http://www.baidu.com/img/bdlogo.gif" width="270" height="129">”当直接访问该url时能访问图片,我们上面的程序主要就是通过这种方式下载网页中的图片的.如下图:

五.正则表达式

正则表达式(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式.许多语言包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能.我所接触到的正则表达式一个是用户名密码设置和该网页知识中,所以我也还需要去学习该部分知识.这里主要用到3个正则表达式,其中下面两个代码非常有用:

1.获取HTML中所有图片的URL

(参考:http://blog.csdn.net/smeller/article/details/7108502)

[csharp] view plaincopy

  1. /// <summary>
  2. /// 取得HTML中所有图片的 URL
  3. /// </summary>
  4. /// <param name="sHtmlText">HTML代码</param>
  5. /// <returns>图片的URL列表</returns>
  6. public static string[] GetHtmlImageUrlList(string sHtmlText)
  7. {
  8. // 定义正则表达式用来匹配 img 标签
  9. Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""‘]?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""‘<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
  10. // 搜索匹配的字符串
  11. MatchCollection matches = regImg.Matches(sHtmlText);
  12. int i = 0;
  13. string[] sUrlList = new string[matches.Count];
  14. // 取得匹配项列表
  15. foreach (Match match in matches)
  16. {
  17. sUrlList[i++] = match.Groups["imgUrl"].Value;
  18. }
  19. return sUrlList;
  20. }

2.获得图片的src路径并保存

(参考:http://bbs.csdn.net/topics/320001867)

[csharp] view plaincopy

  1. /// <summary>
  2. /// 获得图片的路径并存放
  3. /// </summary>
  4. /// <param name="M_Content">要检索的内容</param>
  5. /// <returns>IList</returns>
  6. public static IList<string> GetPicPath(string M_Content)
  7. {
  8. IList<string> im = new List<string>();//定义一个泛型字符类
  9. Regex reg = new Regex(@"<img.*?src=""(?<src>[^""]*)""[^>]*>", RegexOptions.IgnoreCase);
  10. MatchCollection mc = reg.Matches(M_Content); //设定要查找的字符串
  11. foreach (Match m in mc)
  12. {
  13. im.Add(m.Groups["src"].Value);
  14. }
  15. return im;
  16. }

六.总结

该文章主要是做C#网络知识中关于网络爬虫获取URL和简单下载图片的基础讲解,很清晰的讲述了首先要获取URL就需要浏览网页,至少要获取网页HTML内容,在通过简单的正则表达式获取<A href></A>内容;如果要下载图片就要获取图片的URL<img src="">获取src的网址,在下载该网址中的图片,获取方法还是使用正则表达式,下载方法可以使用很多,这里采用的是文件流,最好使用多线程等批量下载手段.(免费下载地址:http://download.csdn.net/detail/eastmount/6355125) 主要通过该文件介绍一些基本的网络知识,同时我也在不断的学习研究,同时讲解正则表达式和网页基本的两个概念知识.最后感谢文章中那个网址的博主及一些人,希望该文章能够对大家有所帮助,同时如果文章中有错误或不足之处,还请大家海涵.

时间: 2024-10-05 09:34:53

C# 网络编程之webBrowser获取网页url和下载网页中图片的相关文章

网络编程之TCP/IP各层详解

网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只是最上面一层--应用层,自上而下每层都依赖于下一层,所以我们从最下层开始切入,比较好理解. 每层都运行特定的协议,越往上越靠近用户,越往下越靠近硬件. 一.物理层 由来:孤立的计算机之间要一起"玩耍",就必须接入Internet,即计算机之间必须完成组网. 物理层功能:主要是基于电器特性发

【转】JAVA网络编程之Socket用法

JAVA网络编程之Socket用法 分类: JAVA2012-08-24 15:56 710人阅读 评论(0) 收藏 举报 在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(Str

网络编程之UDP编程

网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送和接受数据报.值得注意的是:UDP编程必须先由客户端发出信息.一个客户端就是一封信,Socket相当于美国式邮筒(信件的收发都在一个邮筒中).端口与协议相关,所以TCP的30

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

[深入浅出WP8.1(Runtime)]网络编程之HttpClient类

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

黑马程序员——网络编程之CTP传输

TCP传输 Socket和ServerSocket,实现了两台机器间的套接字端点,绑定本机IP地址.建立客户端和服务端,客户端对应的对象是Socket,服务端对应的对象是ServerSocket. //客户端部分 public class ClientA { private String filePath ; public String getFilePath() {return filePath;} public void setFilePath(String filePath ) { thi

网络编程之HttpClient类(转)

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT

[深入浅出WIndows 10]网络编程之HttpClient类

14.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTTP