`
hsyzijvaa
  • 浏览: 107171 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

C#信息采集工具实现

阅读更多

   

简单C#信息采集工具实现

最近想整只爬虫玩玩,顺便熟悉下正则表达式。



开发环境 vs2008 sql2000

实现方法如下

1.先抓取网页代码

2.通过正则匹配出你需要的内容

比如http://www.soso.com/q?w=%C4%E3%BA%C3&pg=1 页面中 搜索结果的标题跟连接地址。具体可以根据你的需要填写合适的地址跟正则。

3.把匹配出的内容保存到数据库中。对其中的数据可以根据需要自己进行处理





具体实现代码

1.读取网页的代码

   public static string GetDataFromUrl(string url)

   {

     string str = string.Empty;

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

     //设置Http头;

     request.AllowAutoRedirect = true;

     request.AllowWriteStreamBuffering = true;

     request.Referer = "";

     request.Timeout = 10 * 1000;

     //request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";

     HttpWebResponse response = null;

     try

     {

       response = (HttpWebResponse)request.GetResponse();

       if (response.StatusCode == HttpStatusCode.OK)

       {

         //根据http应答头来判别编码

         string Characterset = response.CharacterSet;

         Encoding encode;

         if (Characterset != "")

         {

           if (Characterset == "ISO-8859-1")

           {

             Characterset = "gb2312";

           }

           encode = Encoding.GetEncoding(Characterset);

         }

         else

         {

           encode = Encoding.Default;

         }

         //声明一个内存流来贮存http应答流

         Stream Receivestream = response.GetResponseStream();

         MemoryStream mstream = new MemoryStream();

         byte[] bf = new byte[255];

         int count = Receivestream.Read(bf, 0, 255);

         while (count > 0)

         {

           mstream.Write(bf, 0, count);

           count = Receivestream.Read(bf, 0, 255);

         }

         Receivestream.Close();

         mstream.Seek(0, SeekOrigin.Begin);

         //从内存流里读取字符串这里涉及到了编码方案

         StreamReader reader = new StreamReader(mstream, encode);

         char[] buf = new char[1024];

         count = reader.Read(buf, 0, 1024);

         while (count > 0)

         {

           str += new string(buf, 0, 1024);

           count = reader.Read(buf, 0, 1024);



         }

         reader.Close();

         mstream.Close();







       }



     }

     catch (Exception ex)

     {



       GetDataFromUrl(url);



     }

     finally

     {

       if (response != null)

         response.Close();

     }



     return str;

   }

2.正则匹配的代码



   public static ArrayList GetString(string reg, string content)

   {

     Regex r = new Regex(reg, RegexOptions.Compiled);

     MatchCollection matches = r.Matches(content);



     ArrayList a = new ArrayList();

     foreach (Match m in matches)

     {

       string[] arr = new string[10];

       arr[0] = m.Groups[1].Value;

       arr[1] = m.Groups[2].Value;

       arr[2] = m.Groups[3].Value;

       arr[3] = m.Groups[4].Value;

       arr[4] = m.Groups[5].Value;

       arr[5] = m.Groups[6].Value;

       arr[6] = m.Groups[7].Value;

       arr[7] = m.Groups[8].Value;

       arr[8] = m.Groups[9].Value;

       arr[9] = m.Groups[10].Value;

       a.Add(arr);

     }

     return a;

   }



3.如果抓取的页面很多 ,可以把多线程跟队列应用过来,提高抓取效率



   Queue<int> numbers = new Queue<int>();

   const int MaxCount = 5;//同时运行的最多线程数

   private static object _lock = new object();

   private void Test()

   {

     while (true)

     {

       int i = 0;

       lock (_lock)

       {

         if (numbers.Count == 0)

         {

           flag = false;

           return;

         }

         i = numbers.Dequeue();

       }

       f(i);

     }

   }

   void Ssss()

   {

     for (int i = 1; i <= 100; i++)//处理的页面参数 从http://www.soso.com/q?w=你好&amp;pg=1 到http://www.soso.com/q?w=你好&amp;pg=100

     {

       numbers.Enqueue(i);

     }

     for (int i = 0; i < MaxCount; i++)

     {

       Thread thread = new Thread(new ThreadStart(Test));

       thread.Name = "T" + i.ToString();

       thread.Start();

     }

   }

   private void f(int num)

   {

     string str = ClassLibrary1.Class1.GetDataFromUrl("http://www.soso.com/q?w=%C4%E3%BA%C3&amp;pg="+num);

     string reg = "<a href=/"([^/"]+?)/" [^>]+? target=/"_blank/">([//s//S]+?)</a>";

     ArrayList a = ClassLibrary1.Class1.GetString(reg, str);

     for (int i = 0; i < a.Count; i++)

     {

       string[] arr = (string[])a[i];

       Result r = new Result();

       r.Value1 = arr[0];

       r.Value2 = ClassLibrary1.Class1.Html2Txt(arr[1]);

       ResultManager.AddResult(r);

     }

   }

5.常用的一些正则表达式

* 0-多个

? 0-1个

+ 1-多个

+? 尽可能少的匹配

*? 0次或多次,尽可能少

/w  等效于 [a-zA-Z_0-9]

/W  匹配非单词

/S  非空

/s  等效于 [ /f/n/r/t/v] 空格,制表 换页

.  匹配除了换行以为的任何字符

/d  数字

[^>] 除了>以为的字符

[/u4e00-/u9fa5] 汉字



6.代码只是实现了信息采集的主要功能,根据你自己的需要更换采集页面,跟合适的正则表达式后,可以根据你的需要自动进行采集,对采集到的数据,再根据你的需要自己进行处理。

7.数据库操作部分用的3层代码生成器连接地址 在 app.config中









如果你发现有什么不合理的,需要改进的地方,<span style="font-family: 'lucida Grande',Verdana; font-size: 14px; line-height: 23px;">邮件联系328452421@qq.com(qq常年不在线,邮件联系)</span>朱晓 。相互交流 谢谢



顺便问下 有家是新泰的没。





下载地址 http://download.csdn.net/source/3329838

<br>



 
0
0
分享到:
评论

相关推荐

    超级串口调试工具设计及实现(C#源码)

    如是,在串口工具的基础上,本人添加了“出厂设备”按钮,实现了程序自动采集,只需要人工将设备从串口线另一端进行更换,设备的信息就会采集在列表中,采保证列表不会重复,并可以导出为Excel表文件,文档后面提供...

    明日科技《C#示例源代码》(5-8)

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...

    明日科技《C#示例源代码》(9-12)

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...

    明日科技C#示例源码.part02

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...

    C#示例(配套光盘源码)第五部分

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...

    C#示例(配套光盘源码)第二部分

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...

    明日科技C#示例源码.part04

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...

    明日科技C#示例源码.part03

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...

    明日科技C#示例源码

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点...

    c#实现基本的学校人员信息管理系统.zip

    数据采集模块:负责从各类业务环节中实时、准确地收集信息,形成企业的基础数据资源。 数据分析模块:运用统计学、人工智能等技术对数据进行深度挖掘和智能分析,提供决策支持。 业务流程管理模块:设计、执行...

    C#示例(配套光盘源码)第四部分

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...

    c#开发的CRM源代码

    但在很多人的眼里,客户资源管理被认为是进行客户资料采集的工具,殊不知在良好客户资源管理系统的辅助下,能让客户感受到“无微不至的关怀。” 企业客户资源管理系统实现了企业客户资源管理的信息化,它记录着一个...

    C#示例(配套光盘源码)第一部分

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...

    C#程序开发范例宝典(第2版).part02

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    C#.net_经典编程例子400个

    273 实例190 获取窗口文本 273 实例191 判断文件是否正在被使用 274 实例192 在程序中调用.HLP文件 275 实例193 C#中实现文件拖放 276 实例194 文件比较 276 第7章 操作系统与Windows...

    C#程序开发范例宝典(第2版).part08

    实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...

    明日科技C#示例源码.part01

    实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...

    该项目使用C#编写,主要实现了图书管理系统注册、登录、管理员实现对书籍的增、删、改、查功能以及用户借 、还书的功能。.zip

    数据采集模块:负责从各类业务环节中实时、准确地收集信息,形成企业的基础数据资源。 数据分析模块:运用统计学、人工智能等技术对数据进行深度挖掘和智能分析,提供决策支持。 业务流程管理模块:设计、执行、...

Global site tag (gtag.js) - Google Analytics