分享一个c#t的网页抓取类

using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.IO.Compression;

/// <summary>
///Name:网页抓取类
///Author:loafinweb
///Date:2011-09-12
/// </summary>
public class webCrawl
{
    public webCrawl() { }

    //获取网页字符根据url  
    public static string getHtml(string url)
    {
        try
        {
            string str = "";
            Encoding en = Encoding.GetEncoding(getEncoding(url));
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Set("Pragma", "no-cache");
            request.Timeout = 30000;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
            {
                Stream strM = response.GetResponseStream();
                StreamReader sr = new StreamReader(strM, en);
                str = sr.ReadToEnd();
                strM.Close();
                sr.Close();
            }
            return str;
        }
        catch
        {
            return String.Empty;
        }
    }

    //获取编码
    public static string getEncoding(string url)
    {
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(url);
            request.Timeout = 30000;
            request.AllowAutoRedirect = false;

            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
            {
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                    reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                else
                    reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

                string html = reader.ReadToEnd();

                Regex reg_charset = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
                if (reg_charset.IsMatch(html))
                {
                    return reg_charset.Match(html).Groups["charset"].Value;
                }
                else if (response.CharacterSet != string.Empty)
                {
                    return response.CharacterSet;
                }
                else
                    return Encoding.Default.BodyName;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            if (response != null)
            {
                response.Close();
                response = null;
            }
            if (reader != null)
                reader.Close();

            if (request != null)
                request = null;
        }
        return Encoding.Default.BodyName;
    }

    //根据内容--获取标题
    public static string getTitle(string url)
    {
        string title = string.Empty;
        string htmlStr = getHtml(url);//获取网页
        Match TitleMatch = Regex.Match(htmlStr, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        title = TitleMatch.Groups[1].Value;
        title = Regex.Replace(title, @"\W", "");//去除空格
        return title;

    }

    //根据内容--获取描述信息
    public static string getDescription(string url)
    {
        string htmlStr = getHtml(url);
        Match Desc = Regex.Match(htmlStr, "<meta name=\"Description\" content=\"([^<]*)\"*>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        string mdd = Desc.Groups[1].Value;
        return Regex.Replace(Desc.Groups[1].Value, @"\W", "");
    }


    //根据内容--获取所有链接
    public static List<string> getLink(string htmlStr)
    {
        List<string> list = new List<string>(); //用来存放链接       
        String reg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";  //链接的正则表达式      
        Regex regex = new Regex(reg, RegexOptions.IgnoreCase);
        MatchCollection mc = regex.Matches(htmlStr);
        for (int i = 0; i < mc.Count; i++) //存放匹配的集合
        {
            bool hasExist = false;   //链接存在与否的标记         
            String name = mc[i].ToString();
            foreach (String one in list)
            {
                if (name == one)
                {
                    hasExist = true; //链接已存在                   
                    break;
                }
            }
            if (!hasExist) list.Add(name); //链接不存在,添加
        }
        return list;

    }

    //根据内容--取得body内的内容
    public static string getBody(string url)
    {
        string htmlStr = getHtml(url);
        string result = string.Empty;
        Regex regBody = new Regex(@"(?is)<body[^>]*>(?:(?!</?body\b).)*</body>");
        Match m = regBody.Match(htmlStr);
        if (m.Success)
        {
            result = parseHtml(m.Value);
        }
        return result;
    }

    //获取所有图片
    public static List<string> getImg(string url)
    {
        List<string> list = new List<string>();
        string temp = string.Empty;
        string htmlStr = getHtml(url);
        MatchCollection matchs = Regex.Matches(htmlStr, @"<(IMG|img)[^>]+>"); //抽取所有图片
        for (int i = 0; i < matchs.Count; i++)
        {
            list.Add(matchs[i].Value);
        }
        return list;
    }

    //所有图片路径(如果是相对路径的话,自动设置成绝对路径)
    public static List<string> getImgPath(string url)
    {
        List<string> list = new List<string>();
        string htmlStr = getHtml(url);
        string pat = @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>";
        MatchCollection matches = Regex.Matches(htmlStr, pat, RegexOptions.IgnoreCase | RegexOptions.Multiline);
        foreach (Match m in matches)
        {
            string imgPath = m.Groups["imgUrl"].Value.Trim();
            if (Regex.IsMatch(imgPath, @"\w+\.(gif|jpg|bmp|png)$")) //用了2次匹配,去除链接是网页的 只留图片
            {
                if (!imgPath.Contains("http"))//必须包含http 否则无法下载
                {
                    imgPath = getUrl(url) + imgPath;
                }
                list.Add(imgPath);
            }
        }
        return list;
    }

    //下载图片
    public void DownloadImg(string fileurl)
    {
        if (fileurl.Contains('.'.ToString()))//url路径必须是绝对路径 例如http://xxx.com/img/logo.jpg 
        {
            string imgName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + fileurl.Substring(fileurl.LastIndexOf('.')); // 生成图片的名字
            string filepath = System.Web.HttpContext.Current.Server.MapPath("") + "/" + imgName;
            WebClient mywebclient = new WebClient();
            mywebclient.DownloadFile(fileurl, filepath);
        }
    }

    //过滤html
    public static string parseHtml(string html)
    {
        string value = Regex.Replace(html, "<[^>]*>", string.Empty);
        value = value.Replace("<", string.Empty);
        value = value.Replace(">", string.Empty);
        //return value.Replace(" ", string.Empty);

        return Regex.Replace(value, @"\s+", "");
    }

    //处理url路径问题
    public static string getUrl(string url)
    {
        //如果是http://www.xxx.com           返回http://www.xxx.com/
        //如果是http://www.xxx.com/art.aspx  返回http://www.xxx.com/
        return url = url.Substring(0, url.LastIndexOf('/')) + "/";
    }
}

  

posted @ 2014-02-28 14:47  襄阳老兵  阅读(189)  评论(0编辑  收藏  举报