AutoBuildModelClassBAK.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:18k
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Collections;
- using System.Threading;
- using System.IO;
- namespace XunLong.AutoModelBuilder
- {
- /// <summary>
- /// 自动建立模板类
- /// </summary>
- class AutoBuildModelClass
- {
- /// <summary>
- /// 记录采样的数据
- /// </summary>
- struct CaiYangShuJu
- {
- /// <summary>
- /// 采样数据列表
- /// </summary>
- public ArrayList ListOne;
- /// <summary>
- /// 记录本次采样所使用的优先级
- /// </summary>
- public int TNUM;
-
- }
- /// <summary>
- /// 模版的数量
- /// </summary>
- int xnum = 0;
- //D:XunLongXunLong.BINSpiderWEB
- /// <summary>
- /// 文件系统路径
- /// </summary>
- string aPath = "";
-
- /// <summary>
- /// 模版文件路径
- /// </summary>
- string bPath = "";
-
- /// <summary>
- /// 要生成的模版文件路径
- /// </summary>
- string cPath = "";
- /// <summary>
- /// 是否允许建模版
- /// </summary>
- bool isSURE = false;
- /// <summary>
- /// 线程需要的模板建立参数
- /// </summary>
- Hashtable TMMS = new Hashtable();
- /// <summary>
- /// 文件系统对象
- /// </summary>
- NetHashTableAPI.ClassNHT db = new NetHashTableAPI.ClassNHT();
- /// <summary>
- ///存放已经采样过的数据 模板名称(由原始模板数据MD5生成)
- /// </summary>
- ArrayList OLDMD5Name = new ArrayList();
- /// <summary>
- /// 已经生成过模版的url
- /// </summary>
- ArrayList olgurl = new ArrayList();
- /// <summary>
- ///存放已经采样过的数据 key = 第一个采样的url val = 该模版是在url相似度为多少的情况下建立的
- /// </summary>
- Hashtable OLDUrl = new Hashtable();
- /// <summary>
- /// 得到的URL列表 需要计算 去掉其中 已经建立过模板的部分
- /// </summary>
- ArrayList LIST = new ArrayList();
- /// <summary>
- /// 数据抽取使用 得到的URL列表 需要计算 去掉其中 已经建立过模板的部分
- /// </summary>
- ArrayList LIST2 = new ArrayList();
- // 1 读取 URL列表 提取数据特征 a 以不同的动态页面区别 b以结构相似的静态页面区别 c以参数结构相似的页区别
- // 只要该集合内数据大于160 则建立模板 采样按80来进行 模板的命名采用 模板数据的MD5 数据 有一个好处就是可以去掉完全相同的模板
- // 2 模板分析 检测出模板*前方 不属于HTML标示的第一个元素 <S>XX<4545><xxxx>*<xxsss> 自动匹配80源数据得到 每个元素的数据平均长度
- // 平均长度小于 20的 放在类聚模版中 然后 把所有的 生成 放在搜索模板中 平均长度是0的 取消此项
- /// <summary>
- /// 系统运行
- /// </summary>
- public void Run()
- {
- //初始化分类器
- // foreach (string a_a in LIST)
- while(LIST.Count>0)
- {
- Random ra = new Random();
- int nowPort = ra.Next();
- int i007 = LIST.Count * nowPort;
- string a_a = LIST[i007].ToString();
- int uuu1 = 0;
- int uuu2 = 0;
- foreach (string a_c in olgurl)
- {
- if (a_c == a_a)
- {
- goto NEXTIT; //当遇到 已经完成的模版中有比此更相似的url 建立的模板时 表示此url 不用建立模版了
- }
- }
- foreach (System.Collections.DictionaryEntry a_b in OLDUrl)
- {
- // 和已经建立过模板的url数据比较其相似度
- int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(a_a , a_b.Key.ToString()) ;
-
- //得到该模板建立时个个 url 的相似度
- int n2 = (int)a_b.Value;
- uuu1 = n1;
- uuu2 = n2;
- if ( n2>= n1 & n1 > 10 )
- {
- LIST.Remove(a_a);
- goto NEXTIT; //当遇到 已经完成的模版中有比此更相似的url 建立的模板时 表示此url 不用建立模版了
- }
- }
- LIST.Remove(a_a);
- //建立模板
- CaiYangShuJu CaiYang = GetADCUrlList(a_a);
- olgurl.Add(a_a);
- ArrayList urlList = CaiYang.ListOne;
- if (urlList == null)
- {
- goto NEXTIT;
- }
- //已经开始生成模板的 加入已生成行列
- if (OLDUrl.Contains(a_a) == false)
- {
- int n1U = XunLong.UrlStringLib.ClassUrlString.Url2Url(urlList[0].ToString(), urlList[1].ToString());
- OLDUrl.Add(a_a, n1U);
- }
- Hashtable htms = new Hashtable();
- htms.Clear();
- foreach (string akcc in urlList)
- {
- string htmData = db.Value(akcc);
- htmData = XunLong.HtmlClassLibrary.ClassHTML.HTML2CLEAR(htmData);
- htms.Add(akcc, htmData);
-
- }
- //调用模板建立类
- // 是否允许建模版
- isSURE = false;
- Console.WriteLine("-开始建立模板-> "+a_a);
- //建立模板
- TMMS = htms;
- Thread T1 = new Thread(new ThreadStart(TMM));
- T1.Start();
- //假设建立一个模板的时间是5分钟
-
- while (isSURE ==false)
- {
- Thread.Sleep(1000);
-
- }
- //选出小于 8 的 作为类聚标示 所有的 作为整题标示
- //得到建立的模板数据 判断
- //1 如果得到的模板 长度 小于原来数据的 1/40
- // 或者 其中 * 的数量小于等于 3个 那么此模板为坏模板 不进行标注 但是记录到已经建立过模板的队列中 坏模板队列
-
- // 标注模板
- // 根据标注得到的数据 进入分类器分类
- NEXTIT: ; //进入下一轮
-
- }
-
-
-
- }
- /// <summary>
- /// 建立模板线程
- /// </summary>
- private void TMM()
- {
- // 是否允许建模版
- isSURE = false;
- try
- {
- Hashtable TMMSOne = TMMS;
- string dataE = "";
- foreach (System.Collections.DictionaryEntry de2 in TMMSOne)
- {
- dataE = dataE + de2.Key.ToString() + "rn";
- }
- //声明模板构建类
- XunLong.ModelBuilder.ClassModelBuilder myBU = new XunLong.ModelBuilder.ClassModelBuilder();
- string ModelData = myBU.BuilderModel(TMMSOne);
- int nn = myBU.inStrNum(ModelData, "*");
- ArrayList txtDat = EditOneModelTag(ModelData);
- ArrayList neWW = txtDat;
- string dataA = "";
- string dataB = "";
- for (int i = 0; i < neWW.Count; i++)
- {
- dataA = dataA + neWW[i].ToString() + ":" + "<TAGDATA INDEX=" + i.ToString() + "/>" + "rn";
- dataB = dataB + neWW[i].ToString() + ":" + "<TAGDATA INDEX=" + i.ToString() + "/>" + "rn";
- }
- string dataT = "<TAGDATA INDEX=1/>";
- string x = cPath + "\" + getMD5name(ModelData);
- if (OLDMD5Name.Contains(x) == true)
- {
- return;
- }
- XunLong.PublicClassLibrary.kcSearch v = new XunLong.PublicClassLibrary.kcSearch();
- v.a = "";
- putFileData(x + ".a", dataA);
- putFileData(x + ".b", dataB);
- putFileData(x + ".c", "");
- putFileData(x + ".d", ModelData);
- putFileData(x + ".e", dataE);
- putFileData(x + ".t", dataT);
- putFileData(x + ".h", dataA);
- Console.WriteLine("-模版建立成功->" + x);
- xnum = xnum+1;
- Console.WriteLine("-全部模版数量-> " + xnum.ToString());
- }
- catch
- {
- Console.WriteLine("-模版建立F->" );
- }
- //允许建立模版
- isSURE = true;
- }
- /// <summary>
- /// 标注模板
- /// </summary>
- /// <param name="c">一个模版数据</param>
- /// <returns>标注的模板各个值</returns>
- private ArrayList EditOneModelTag(string c)
- {
- ArrayList x = new ArrayList(); //对每个*进行标注
- x.Clear();
- string[] xxs = c.Split('*');
- int Len = 0;
- foreach (string a in xxs)
- {
- Len = Len + a.Length;
- }
- //得到平均长度
- int OneLen = (int)Len / xxs.Length;
- for (int i = 0; i < xxs.Length; i++)
- {
- if (xxs[i].Length > 0 & OneLen < xxs[i].Length)
- {
- string aaa = GetClearTag(xxs[i]);
- if (aaa.Length < 40)
- {
- x.Add(aaa);
- }
- else
- {
- x.Add("");
- }
- }
- else
- {
- x.Add("");
- }
-
- }
- return x;
- // 1 把模板数据按照*顺序 分割 每个* 对应其前部的一个部分 n(i)
- // 2 去掉n(i) 标签数据 作为属性 去掉 : 等 如果太长〉8 则放弃
- }
- /// <summary>
- /// 清除数据中的HTML标签
- /// </summary>
- /// <param name="dat"></param>
- /// <returns></returns>
- private string GetClearTag(string dat)
- {
- //</td></tr><tr><td class="main_text_left">身份验证:</td><td class="main_text">
- dat = dat.Replace(":","");
- dat = dat.Replace(":", "");
- int Loop = dat.Length / 4;
- for (int i = 0; i < Loop; i++)
- {
- int a1 = dat.IndexOf('<');
- if (a1 == -1 | a1 == (dat.Length-1) )
- { }
- else
- {
- int a2 = dat.IndexOf('>',a1 + 1);
- if (a2 == -1)
- { }
- else
- {
- int aa = dat.Length;
- // *<>*<>*
- string dat1 = "";
- if (a1 == 0)
- {
-
- }
- else
- {
- dat1 = dat.Substring(0, a1 );
- }
- string dat2 = dat.Substring(a2 + 1, aa - a2-1);
- dat = dat1 + dat2;
- }
- }
- }
- // 1 去掉标签
- // 2 去掉: :
- return dat;
- }
- /// <summary>
- /// 得到一个60个url的采样队列
- /// </summary>
- /// <param name="a"></param>
- /// <returns></returns>
- private CaiYangShuJu GetADCUrlList(string aurl)
- {
- ArrayList x = new ArrayList();
- x.Clear();
- //记录得到不同的 相似度的数量
- int[] ValNum = new int[51];
-
- foreach (string b in LIST)
- {
- // 和已经建立过模板的url数据比较其相似度
- int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(aurl, b);
- ValNum[n1] = ValNum[n1] + 1;
- }
- //被选取得相似度
- int XXX = 0;
- //得到 最相似的 总体大于 120 的
- for (int i = 50; i > 10; i--)
- {
- if (ValNum[i] > 60)
- {
- XXX = i;
- break;
- }
- }
- if (XXX < 12)
- {
- CaiYangShuJu oneBad = new CaiYangShuJu();
- oneBad.ListOne = null;
- oneBad.TNUM = 0;
- return oneBad;
- }
- //记录 取得60个即可
- foreach (string b in LIST)
- {
- // 和已经建立过模板的url数据比较其相似度
- int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(aurl, b);
- if (n1 == XXX)
- {
- x.Add(b);
- if (x.Count >= 60)
- {
- break;
- }
- }
- }
- CaiYangShuJu one = new CaiYangShuJu();
- one.ListOne = x;
- one.TNUM = XXX;
- return one;
- }
- /// <summary>
- /// 读取各个模版 记录和存储 第一个采样的url 和 模板名称(由原始模板数据MD5生成)
- /// </summary>
- public void Init(string filePath,string b0,string c0)
- {
- XunLong.CongifData.Config.InitConfigData("d:\xunlong.kc");
- aPath = filePath;
- bPath = b0;
- cPath = c0;
- db.SetClassNHT(filePath, 3145727);
- LIST = db.SearchOneList("http");
- LIST2 = LIST;
- // OLDMD5Name
- OLDMD5Name.Clear();
-
- // OLDUrl
- OLDUrl.Clear();
- olgurl.Clear();
- // 1 得到目录下的文件
- DirectoryInfo dir = new DirectoryInfo(b0);
- // 2 遍历文件 读取数据压入
- foreach (FileInfo f in dir.GetFiles("*.a")) //遍历获得以xml为扩展名的文件
- {
- String name = f.FullName; //name为该文件夹下的文件名称,如f.FullName为全名
- name = name.Substring(0, name.Length - 2);
- String name2 = f.Name; //name为该文件夹下的文件名称,如f.FullName为全名
- name2 = name2.Substring(0, name2.Length - 2);
- string new_it = getFileData(name + ".e");
- //记录已经生成的名称
- OLDMD5Name.Add(name2);
- char[] xx ={'n','r' };
- string[] tmp = new_it.Split(xx);
- ArrayList xxTmp = new ArrayList();
- xxTmp.Clear();
- foreach (string x1 in tmp)
- {
- if (x1.Length > 0)
- {
- if (xxTmp.Contains(x1) == false)
- {
- xxTmp.Add(x1);
- }
- if (olgurl.Contains(x1) == false)
- {
- olgurl.Add(x1);
- }
- }
- }
- // 和已经建立过模板的url数据比较其相似度
- int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(xxTmp[0].ToString(), xxTmp[1].ToString());
- if (OLDUrl.Contains(xxTmp[0]) == false)
- {
- OLDUrl.Add(xxTmp[0], n1);
- }
- }
- xnum = OLDUrl.Count;
- }
- /// <summary>
- /// 得到数据的MD5名
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
- private string getMD5name(string data)
- {
- string strMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(data, "md5");
- return strMd5;
- }
- /// <summary>
- /// 读文件
- /// </summary>
- /// <param name="filename"></param>
- /// <returns></returns>
- private static string getFileData(string filename)
- {
- StreamReader reader = null;
- string data = string.Empty;
- try
- {
- reader = new StreamReader(filename, System.Text.Encoding.GetEncoding("gb2312"));
- data = reader.ReadToEnd();
- reader.Close();
- return data;
- }
- catch (IOException e)
- {
- Console.WriteLine(e.Message);
- }
- finally
- {
- if (reader != null)
- reader.Close();
- }
- return "";
- }
- /// <summary>
- /// 写文件
- /// </summary>
- /// <param name="filename"></param>
- /// <param name="data"></param>
- private void putFileData(string filename, string data)
- {
- StreamWriter writer = null;
- try
- {
- writer = new StreamWriter(filename, false, System.Text.Encoding.GetEncoding("gb2312"));
- writer.Write(data);
- writer.Close();
- }
- catch (IOException e)
- {
- Console.WriteLine(e.Message);
- }
- finally
- {
- if (writer != null)
- writer.Close();
- }
- }
- }
- }