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;
}
}
}
獲取網頁中的所有超鏈接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.