獲取網頁中的所有超鏈接

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
using System.Net.NetworkInformation;


namespace frmExpendFlow
{
    public partial class UIExpendFlow : Form
    {
        public UIExpendFlow()
        {
            InitializeComponent();
        }
        private static UIExpendFlow formInstance = null;              //本窗體的實例(單例模式)
        
        List<string> linkList = new List<string>();
        string MyLink { get; set; }                    //鏈接對象
        string MyScheme { get; set; }          //超文本傳輸協議
        bool MyAbsolute { get; set; }             //是否符合指定協議鏈接


        public static UIExpendFlow GetInstanceObject()           //保證同一個窗體只實例化一次
        {
            if (formInstance == null)
            {
                formInstance = new UIExpendFlow();
                formInstance.Show();
            }
            return formInstance;
        }


        private void UIExpendFlow_FormClosing(object sender, FormClosingEventArgs e)    //實例置爲空
        {
            formInstance = null;                     
        }


        private void UIExpendFlow_Activated(object sender, EventArgs e)                  //網址池輸入框獲取焦點
        {
            tbUrlPool.Focus();
        } 


        private void btnClose_Click(object sender, EventArgs e)              //關閉窗口
        {
            this.Close();
        }


        private void chkUrlPool_CheckStateChanged(object sender, EventArgs e)          //按鈕是否可用
        {
            if (chkUrlPool.Checked == true)
            {
                btnGetHyperlink.Enabled = true;
            }
            else
            {
                btnGetHyperlink.Enabled = false;
            }
        }
        
        private void btnGetHyperlink_Click(object sender, EventArgs e)                        // 創建一個線程,用來執行委託
        {
            btnGetHyperlink.Enabled = false;            
            int UnableAdapters=0;                            //不可用網絡適配器個數
            int PCIAdapters = 0;                               //PCI適配器個數                   
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();   //獲取本地計算機上網絡接口的對象            
            foreach (NetworkInterface adapter in adapters)
            {
                if (adapter.Description.IndexOf("PCI") > 0)
                {
                    PCIAdapters++;
                    if (adapter.OperationalStatus.ToString().Equals("Up"))                               //Up網絡接口已運行,可以傳輸數據包。
                    {
                        labLinkInfo.Text =string.Format("適配器{0}已連接至網絡",adapter.Description);
                        labLinkInfo.Text = "正在獲取超鏈接,請等待..."; 
                        Thread getHtmlThread = new Thread(CrossThreadFlush);                                  //開始執行獲取超鏈接的線程
                        getHtmlThread.IsBackground = true;
                        getHtmlThread.Start();
                    }
                    else
                    {                        
                        UnableAdapters++;
                    }                    
                }
                else
                {
                    continue;
                }
            }
            if (UnableAdapters == PCIAdapters)
            {
                MessageBox.Show("電腦未連接網絡", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                btnGetHyperlink.Enabled = true;
                return;
            }               
        }
        private void CrossThreadFlush()                                                        //聲明一個委託,執行獲取網頁內容的方法
        {
            MethodInvoker In = new MethodInvoker(GetHtml); 
            this.BeginInvoke(In);
        }
        private void GetHtml()                                                                         //獲取網頁的方法
        {          
            if (txtAccessAddress.TextLength > 0)
            {
                //獲取網頁內容
                linkList.Clear();                                            //清空list
                tbUrlPool.Clear();                                       //清空網址池顯示                
                Uri uri = new Uri(txtAccessAddress.Text.Trim());                   //獲取統一資源定位符
                HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);               //實例化HttpWebRequest類
                myReq.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 LBBROWSER";              //瀏覽器標識(UA)
                myReq.Accept = "*/*";
                myReq.KeepAlive = true;                                                                 //保持永久性連接
                myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
                try
                {
                    HttpWebResponse result = (HttpWebResponse)myReq.GetResponse();
                    Stream receviceStream = result.GetResponseStream();
                    StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));
                    string strHTML = readerOfStream.ReadToEnd();
                    readerOfStream.Close();
                    receviceStream.Close();
                    result.Close();
                    String MyHrefPattern = @"<a[^>]+href=\s*(?:'(?<href>[^']+)'|""(?<href>[^""]+)""|(?<href>[^>\s]+))\s*[^>]*>(?<text>.*?)</a>";                                  //提取超鏈接的正則表達式
                    Regex MyHrefRegex = new Regex(MyHrefPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
                    Match MyHrefMatch = MyHrefRegex.Match(strHTML);
                    while (MyHrefMatch.Success)
                    {
                        MyLink = MyHrefMatch.Groups[1].Value.Replace("\r", "").Replace("\n", "");
                        if (MyLink.Substring(0, 1) != "#")//忽略書籤,查找超級鏈接
                        {
                            MyAbsolute = false;
                            if (MyLink.Length > 8)
                            {
                                MyScheme = Uri.UriSchemeHttp;                                         //http協議鏈接
                                if (MyLink.Substring(0, MyScheme.Length) == MyScheme)
                                    MyAbsolute = true;
                                MyScheme = Uri.UriSchemeHttps;
                                if (MyLink.Substring(0, MyScheme.Length) == MyScheme)
                                    MyAbsolute = true;
                            }
                            if (MyAbsolute)
                            {
                                if (linkList.Contains(string.Format("{0}\r\n", MyLink)))                      //判斷鏈接是否重複
                                {
                                    MyHrefMatch = MyHrefMatch.NextMatch();//繼續查找超級鏈接
                                }
                                else
                                {
                                    linkList.Add(string.Format("{0}\r\n", MyLink));
                                }
                            }
                        }
                        MyHrefMatch = MyHrefMatch.NextMatch();//繼續查找超級鏈接
                        if (linkList.Count == 500)                                        //設置獲取的超鏈接的最大數
                        {
                            break;
                        }
                    }
                    myReq.KeepAlive = false;                                     //斷開連接
                }
                catch { }
                foreach (string str in linkList)
                {
                    tbUrlPool.AppendText(str);
                }
                labLinkInfo.Text = string.Format("{0}  網頁中{1}個鏈接獲取完畢\r", txtAccessAddress.Text, linkList.Count.ToString());
            }
            else
            {
                MessageBox.Show("訪問地址不能不能爲空,請輸入訪問地址", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }
            btnGetHyperlink.Enabled = true;    
        }


               
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章