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

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

一.界面设计

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

二.源代码

1.命名空间

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //新添加命名空间    
  2. using System.Net;    
  3. using System.IO;  
  4. using System.Text.RegularExpressions;  //正则表达式  

2.浏览

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

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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在CODE上查看代码片派生到我的代码片
  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) 主要通过该文件介绍一些基本的网络知识,同时我也在不断的学习研究,同时讲解正则表达式和网页基本的两个概念知识.最后感谢文章中那个网址的博主及一些人,希望该文章能够对大家有所帮助,同时如果文章中有错误或不足之处,还请大家海涵.

转载于:https://www.cnblogs.com/275147378abc/p/4590390.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程 调用多线程的方法 Runtime与ProcessBuilder

一般我们使用Java运行其他类中的方法的时候&#xff0c;无论是静态调用还是动态调用&#xff0c;都是在当前的进程中执行的。也就是只有一个Java虚拟机实例在运行。有时候需要通过Java代码启动多个Java子进程&#xff0c;这样做会消耗些资源&#xff0c;但是程序变得更稳定。因…

ubuntu14.04 python2.7 安装配置OpenCV3.0

环境&#xff1a;ubuntu14.04 python2.7 内容&#xff1a;安装并配置OpenCV3.0 今天按照OpenCV官网上的步骤装了OpenCV但是&#xff0c;装好之后python提示“No module named cv2” 首先&#xff0c;安装OpenCV的步骤&#xff1a; OpenCV官网的安装步骤&#xff1a;http://doc…

[iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10

近来因为人事变动&#xff0c;领导打算安排我做 iOS 的项目&#xff0c;所以需要花一些时间提前准备一下iOS相关的东西。因为自己手头上并没有 Mac&#xff08;过年为了闲的时候能玩玩游戏买了联想&#xff0c;唉&#xff09;&#xff0c;想想不能只靠每天在公司的时间练 demo …

html5的网络书店图书网站代码_【技能提升】10个编写HTML5的实用小技巧

1. 新的文档类型(Doctype)html PUBLIC ”-//W3C//DTD XHTML 1.0 Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>上面这个既麻烦又难记的XHTML文档类型你还在使用吗&#xff1f;如果还是这样的话&#xff0c;现在该切换到新的HTML5文档类型…

sql中if语句的用法_Python中的if条件语句

Python中的if语句在实际的编程中&#xff0c;经常需要检查一系列条件&#xff0c;并据此决定采取什么措施。正常情况下&#xff0c;程序的执行是自上而下的进行&#xff0c;if语句则根据条件判断&#xff0c;实现程序的执行顺序改变。一、if-else语句1、语法&#xff1a;if 条件…

mysql中non用什么_mysql Non-Transactional Database Only(只支持MyISAM)

后来在做WordPress&#xff0c;一开始还不知道原来WordPress用的是InnoDB数据引擎&#xff0c;于是在原来的数据库里面就建了一个数据库,一开始也没发觉问题&#xff0c;安装&#xff0c;导入sql&#xff0c;都没问题&#xff0c;当时也没多想。直到这几天因为又要装多一个Word…

timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...

相关历史文章(阅读本文前&#xff0c;您可能需要先看下之前的系列?)国内最全的Spring Boot系列之三2020上半年发文汇总「值得收藏」GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇GraphQL的探索之路 – SpringBoot集成GraphQL之Query篇三 - 第316篇GraphQL的…

sql多层嵌套别名无效_SQL之复杂查询

前文学了汇总分析&#xff0c;学了常见的汇总函数&#xff0c;会分组并且掌握了对分组结果指定条件。今天开始学习SQL的视图和子查询&#xff0c;还有数据库关联与嵌套查询内容的学习。一、视图1.1视图是有单固定存储可反复读取使用的子查询&#xff0c;所以视图适用于频繁使用…

POJ 1195 Mobile phones【 二维树状数组 】

题意&#xff1a;基础的二维数组&#xff0c;注意 0 lowbit(0)会陷入无限循环----- 之前做一道一维的一直tle,就是因为这个-------------------------- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #includ…

基于Angularjs实现分页

前言 学习任何一门语言前肯定是有业务需求来驱动你去学习它&#xff0c;当然ng也不例外&#xff0c;在学习ng前我第一个想做的demo就是基于ng实现分页&#xff0c;除去基本的计算思路外就是使用指令封装成一个插件&#xff0c;在需要分页的列表页面内直接引用。 插件 在封装分页…

mbot机器人初体验_[首发开箱]Makeblock mBot Ranger mBot游侠版 强大的STEM教育机器人...

本帖最后由 ahagowo 于 2016-4-17 08:38 编辑mBot游侠机器人套件是一个三种功能于一身的STEM教育机器人套件&#xff0c;它支持3种组装形态&#xff1a;机器人坦克&#xff0c;三轮赛车&#xff0c;和自平衡车。mBot游侠可通过 iPad&#xff0c;平板计算机或笔记本计算机来编程…

python课程笔记_Python课程笔记(一)

由于新冠状病毒的爆发&#xff0c;不得不在家里上网课&#xff0c;开课已经两个礼拜了&#xff0c;今天上完Python课后&#xff0c;准备整理一下最近学习Python的笔记。人生苦短&#xff0c;我用Python一、Hello World初学一门新的语言&#xff0c;就一定要从Hello World开始pr…

redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange

namespace app\admin\controller;use think\cache\driver\Redis;use think\Controller;use \think\Db;class Index extends Controller{//获取redispublic function getRedis(){$redis new \Redis();$redis->connect(127.0.0.1,6379);$redis->auth(root); //redis密码ec…

云服务器建站原理_云服务器cvm与建站主机之间的区别

(文章来源&#xff1a;西部数码)云服务器cvm与建站主机区别是什么&#xff1f;cvm的英文全拼是CloudVirtualMachine(云虚拟机)&#xff0c;所以云服务器cvm是指虚拟云服务器&#xff0c;属于云服务器产品中的一种。而建站主机一般多是指虚拟主机&#xff0c;是在服务器中划分出…

maven找到mysql 连接池_在Tomcat6.0+MySQL5.0环境下配置和使用数据库连接池

一&#xff0c;在Tomcat中配置连接池的JNDI首先到MySQL的网站上下载MySQL JDBC连接器放到%CATALINA_HOME%/lib目录下&#xff0c;在%CATALINA_HOME%/conf目录下找到context.xml&#xff0c;这个文件是全局的&#xff0c;如果想只对特定的应用使用可以编辑WEB-INF/context.xml文…

mysql将多个成绩放在一排_mysql巧用连表查询各科成绩前三名

下列是各表的详情&#xff0c;不想自己建表的同学可以直接copy code&#xff0c;数据随意。创建表成绩详情表&#xff1a;CREATE TABLE score (id int(10) NOT NULL AUTO_INCREMENT,subject_id int(10) DEFAULT NULL,student_id int(10) DEFAULT NULL,score float DEFAULT NULL…

LeetCode Contains Duplicate (判断重复元素)

题意&#xff1a; 如果所给序列的元素不是唯一的&#xff0c;则返回true&#xff0c;否则false。 思路&#xff1a; 哈希map解决。 1 class Solution {2 public:3 bool containsDuplicate(vector<int>& nums) {4 unordered_map<int,int> mapp;5 …

提高团队代码质量

近期看到一篇博客。大致的意思就是网管将原本混乱不堪的交换机整理整齐了&#xff0c;起初交换机是图2那样的&#xff0c;由于越来用的人越多&#xff0c;操作的人越来越多。终于成为了图1那个样子。这不禁让我想到了项目中的代码。原先在刚上线的时候谈不上是完美的&#xff0…

webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...

昨天我们提到火狐浏览器最新稳定版Mozilla Firefox v67 版将面向部分用户开启WebRender渲染引擎测试。据火狐浏览器团队介绍当用户开启新的渲染引擎后 , 网页加载帧率能够从现有的 20FPS 直接提升到 60FPS。不过新的渲染引擎本身并不是用于加快网页的加载速度&#xff0c;而是…

NOIP201307货车运输

试题描述A 国有n座城市&#xff0c;编号从1到n&#xff0c;城市之间有m条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有q辆货车在运输货物&#xff0c;司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物。输入第一行有两个用一…