正则表达式应用--提取CSDN所有下载资源URl的思路与代码实现分享
原文
http://blog.csdn.net/xuexiaodong2009/article/details/7481122
其实这个内容本身没有什么实际价值,只是有段时间,自己想找所有下载分为0的资源,闲来没事就随手写了一个小程序,见识到了正则表达式的强大
  1分析需求 2查找规律,实现思路,3实现代码
1分析需求
     需求很简单,就是找到所有下载分为0的资源,也就是不需要下载分的资源,刚开始时自己手动一个一个的找,感觉太慢了,
       首先得打开资源分类页http://download.csdn.net/category,
       再打开某一分类例如android http://download.csdn.net/category/mobile_development/android,
        再点列表的某一页 例如第2页,http://download.csdn.net/category/mobile_development/android/orderbypubdate/2,
          一页六个资源,一个一个的看,是不是存在不需要下载分的资源,有就打开到资源的详细页面,
      最后才可以到下载页面,实在感觉太慢了,于是就有了写一个小程序的想法。在50页中查找差不多得一个小时。
   2查找规律,实现思路
    有了想法就开始想着怎么实现了。第一步就是分析各个页面的关系或者说是规律。对于某一个具体的分类列表页的url组成是有三部分组成:
        第一部分http://download.csdn.net/category/是固定的,
        第二部分是mobile_development是资源的大分类,
        第三部分是android小分类,
        最后就是排序方式和页码了orderbypubdate/2
      分析列表的网页的源代码,发现关键的一行,包含了资源详细信息的链接和下载分,
      例如如下一行的链接为/detail/ipoints/4241887,下载分为1
[html] view plaincopy
<dt><a href="/detail/ipoints/4241887">Yaffs专家.apk</a><span class="marks">1</span></dt>   
通过正则表达式就可以匹配到链接和下载分。
  资源的详细介绍页面和最终下载页面也有一定的关系,一个是detail一个是download,所以只要得到了资源的详细介绍页面就可以了。
http://download.csdn.net/detail/xuexiaodong2009/4241131
http://download.csdn.net/download/xuexiaodong2009/4241131
3实现代码
获取资源列表页
[csharp] view plaincopy
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;               
             request.Method = "GET";   
             request.KeepAlive = false;   
             //Get the response   
             using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)   
             {   
                 using (Stream responseStream = response.GetResponseStream())   
                 {   
                     using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))   
                     {   
                         string line = reader.ReadLine();   
                         int count = 0;   
                         int lineNo = 0;   
                         while (line != null)   
                         {   
                             lineNo++;   
                             if (lineNo < startLineIndex || string.IsNullOrEmpty(line))   
                             {   
                                 line = reader.ReadLine();   
                                 continue;   
                             }       
                             if (lineNo >= endLineIndex)   
                             {   
                                 break;   
                             }   
                             Match match = reDetailUrl.Match(line);   
                             if (match.Success)   
                             {   
                                 string inerUrl = match.Groups["url"].Value;   
                                 string marks = match.Groups["marks"].Value;                                
                             }   
                             line = reader.ReadLine();   
                         }