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.pswp.cn/news/273183.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273183.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273183.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql員工腳本_mySQL常用腳本匯總

mysql的常用腳本有哪些呢&#xff1f;我們來做個總結建表語句sql語句最后指定主鍵DROP TABLE IF EXISTS user_info1;CREATE TABLE user_info1 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主鍵,name varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT 姓名,password varcha…

多線程 調用多線程的方法 Runtime與ProcessBuilder

一般我們使用Java運行其他類中的方法的時候&#xff0c;無論是靜態調用還是動態調用&#xff0c;都是在當前的進程中執行的。也就是只有一個Java虛擬機實例在運行。有時候需要通過Java代碼啟動多個Java子進程&#xff0c;這樣做會消耗些資源&#xff0c;但是程序變得更穩定。因…

mysql可連接_mysql開啟遠程可連接

1.打開cmd窗口&#xff0c;進入MySql安裝的bin目錄2.執行命令登錄數據庫,之后會出現一行要你輸入密碼的mysql -u root -p3.執行以下命令分配新用戶&#xff1a;grant all privileges on *.* to ‘用戶名‘‘IP地址‘ identified by ‘密碼‘;4.執行完上述命令后用下面的命令刷新…

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…

mysql導出如何不區分大小寫_mysql 不區分大小寫

show variables like %case%-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_case_table_names | 1 | 表示已經是支持忽略大小寫了-------------------------------修改 /etc/mysql/…

[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文檔類型…

hdu2457 Trie圖+dp

hdu2457 給定n個模式串&#xff0c; 和一個文本串 問如果修改最少的字符串使得文本串不包含模式串&#xff0c; 輸出最少的次數&#xff0c;如果不能修改成功&#xff0c;則輸出-1 dp[i][j] 表示長度為i的字符串&#xff0c; 到達狀態j&#xff08;Trie圖中的結點&#xff09;…

sql中if語句的用法_Python中的if條件語句

Python中的if語句在實際的編程中&#xff0c;經常需要檢查一系列條件&#xff0c;并據此決定采取什么措施。正常情況下&#xff0c;程序的執行是自上而下的進行&#xff0c;if語句則根據條件判斷&#xff0c;實現程序的執行順序改變。一、if-else語句1、語法&#xff1a;if 條件…

mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解決方法

權限問題&#xff0c;授權 給 root 所有sql 權限 mysql> grant all privileges on *.* to root"%" identified by ".";Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)轉載于:https://www.cnbl…

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

后來在做WordPress&#xff0c;一開始還不知道原來WordPress用的是InnoDB數據引擎&#xff0c;于是在原來的數據庫里面就建了一個數據庫,一開始也沒發覺問題&#xff0c;安裝&#xff0c;導入sql&#xff0c;都沒問題&#xff0c;當時也沒多想。直到這幾天因為又要裝多一個Word…

openSUSE 11 上的配置可以Xmanager遠程桌面

openSUSE 11 上的配置(適用于默認圖形環境為KDE的Linux)&#xff1a; 1、配置KDM。 openSUSE 11的默認圖形環境為KDE&#xff0c;雖然可以同時安裝GDM和KDM&#xff0c;但默認只啟動了KDM。所以openSUSE 11只需配置KDM&#xff0c;如果你啟動了GDM來代替KDM&#xff0c;則配置可…

timed_waiting線程是否占用cpu_程序CPU占用率飆升,如何定位線程的堆棧信息?超詳細,值得收藏看不懂還有配套視頻 第319篇...

相關歷史文章(閱讀本文前&#xff0c;您可能需要先看下之前的系列?)國內最全的Spring Boot系列之三2020上半年發文匯總「值得收藏」GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇GraphQL的探索之路 – SpringBoot集成GraphQL之Query篇三 - 第316篇GraphQL的…

圖片的縮放(放大縮小)

package com.school.util;import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;import javax.imageio.ImageIO; /*** * <b>類名稱&#xff1a;圖片處理工具類</b>ImageUtils…

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…

mysql 交叉連接的用法_深入理解MySQL的外連接、內連接、交叉連接

1、內聯接(典型的聯接運算&#xff0c;使用像 或 <> 之類的比較運算符)。包括相等聯接和自然聯接。內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如&#xff0c;檢索 students和courses表中學生標識號相同的所有行。2、外聯接。外聯接可以是左向外聯…

基于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;平板計算機或筆記本計算機來編程…

mysql數據庫設計規范_MYSQL數據庫設計規范與原則

MYSQL數據庫設計規范1、數據庫命名規范采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線_組成;命名簡潔明確(長度不能超過30個字符);例如&#xff1a;user, stat, log, 也可以wifi_user, wifi_stat, wifi_log給數據庫加個前綴;除非是備份數據庫可以加0-9的自然…