现在的位置: 首页 > 综合 > 正文

使用C#与正则表达式分析hao123.com的网址列表

2013年01月08日 ⁄ 综合 ⁄ 共 2662字 ⁄ 字号 评论关闭

最近需要一些对网址的分类,来检测本地用户上网的习惯,这样我们就需要一些域名的分类,首先我们就想到了www.hao123.com

通过这个分析,大家可以了解到C#获取网页源代码、调用正则表达式的一些简单方法

以及一些使用中的技巧。

1、获取网页源代码

为了方便,我们在这里直接写成函数的形式,如下:

        static string GetSource(string PageUrl)
        {            
            WebRequest request = WebRequest.Create(PageUrl); //WebRequest.Create方法,返回WebRequest的子类HttpWebRequest
            WebResponse response = request.GetResponse(); //WebRequest.GetResponse方法,返回对 Internet 请求的响应
            Stream resStream = response.GetResponseStream(); //WebResponse.GetResponseStream 方法,从 Internet 资源返回数据流。 
            Encoding enc = Encoding.GetEncoding("GB2312"); // 如果是乱码就改成 utf-8 / GB2312
            StreamReader sr = new StreamReader(resStream, enc); //命名空间:System.IO。 StreamReader 类实现一个 TextReader (TextReader类,表示可读取连续字符系列的读取器),使其以一种特定的编码从字节流中读取字符。 
            string source = sr.ReadToEnd(); //输出(HTML代码),ContentHtml为Multiline模式的TextBox控件
            resStream.Close();
            sr.Close();

            return source;//返回源代码字符串
        }

使用上面的代码可以解决大多数问题,在有的时候会发现获取的源代码和浏览器看到的不一样,这时候就需要用UA来处理。

2、建立一个网址类

这个很简单

    class Page
    {
        public string Url;
        public string Class;
    }

3、获取hao123.com的主页源代码

使用第一步中的函数分析www.hao123.com,得到源代码source。

通过对网页的分析,我们可以看出hao123主要的网址分布在右侧的列表部分,如下图

通过这个列表就基本可以分析出我们想要的分类网址了

因为点击前面的绿色字可以进入详细列表,我们对这个绿色字的源代码进行分析,发现是:

<span
class="box-sort_title">
<a
href="http://v.hao123.com/movie/">
影 视</a></span>

而且是有且仅有这样子的才是分类列表的入口,所以我们就可以用这段字符串作为我们的模板进行分析:


4、正则表达式分析:

我们需要的是a href="后面的链接和链接后面的标题,在此,我们把他们改成(.*?),即

<span
class="box-sort_title">
<a
href="(.*?)">(.*?)
</a></span>

.*表示任意字符串 ?表示非贪心处理 两边的括号表示我们需要在下面用到它。

通过这样的处理,在正则表达式分析后我们就可以得到网址和对应的分类:

   //*******************获取分类列表部分********************
            List<Page> ClassPages = new List<Page>();
            string strReg = "box-sort_title\"><a href=\"(.*?)\">(.*?)</a>";            
            foreach (Match m in Regex.Matches(source, strReg, RegexOptions.IgnoreCase))
            {
                Console.WriteLine(string.Format("{0} {1}", m.Groups[2].Value,m.Groups[1].Value));                
                Page p = new Page();
                p.Url = m.Groups[1].Value.Replace(" ", ""); p.Class = m.Groups[2].Value.Replace(" ", "");
                ClassPages.Add(p);
            }            
            //*******************获取分类列表部分********************

foreach表示对每个匹配项都进行处理

经过这样的处理,我们的网址和分类就保存在了ClassPages这个List里面


5、对每个分类的网页进行分析

同上面一样,我们找到了分类中网址的列表,不再赘述直接上代码:

//**************直接分析网页,不保存*************
            foreach (Page P in ClassPages)
            {
                string temp = GetSource(P.Url);
                strReg = "<h3><div><a href=\"(.*?)\" target=\"_blank\" class=\"text-con\">(.*?)</a></div></h3>";
                Console.WriteLine(P.Class);
                StreamWriter sw2 = new StreamWriter("c:\\输出列表.txt", true, Encoding.Default);//这里改成false就不会追加,直接覆盖。
                sw2.WriteLine("<" + P.Class + ">");

                foreach (Match m in Regex.Matches(temp, strReg, RegexOptions.IgnoreCase))
                {
                    sw2.WriteLine(m.Groups[1].Value + " " + m.Groups[2].Value);                    
                }
                sw2.Close();
            }
            //**************直接分析网页,不保存*************

最后网址的分类就保存在了c盘下的txt文件中。

这里要注意的是,因为我使用了追加的模式,所以在第二次运行程序的时候会继续向文件中添加,有兴趣的可以让程序自动删除原来的文件。


上个代码:http://download.csdn.net/detail/icyfox_bupt/4389810


做爬虫做的比较多了,发现其实爬东西会用方法是一回事,会一些技巧也很重要,比如有的时候在分析的时候添加一些预处理会在正则的时候方便很多,这就需要大家慢慢去摸索了。

抱歉!评论已关闭.