[爬虫学习笔记]Url过滤模块UrlFilter【分分快三计划

作者:编程技术

        Url Filter则是对提取出来的URL再进行一次筛选。不同的应用筛选的标准是不一样的,比如对于baidu/google的搜索,一般不进行筛选,但是对于垂直搜索或者定向抓取的应用,那么它可能只需要满足某个条件的url,比如不需要图片的url,比如只需要某个特定网站的url等等。Url Filter是一个和应用密切相关的模块。

using System;
using System.Collections.Generic;
using Crawler.Common;


namespace Crawler.Processing { public class UrlFilter { public static List RemoveByRegex(List uris, params string[] regexs) { var uriList=new List(uris); for (var i = 0; i < uriList.Count; i ) { foreach (var r in regexs) { if (!RegexHelper.IsMatch(uriList[i].ToString(), r)) continue; uris.RemoveAt(i); i--; } } return uriList; }
public static List SelectByRegex(List uris, params string[] regexs) { var uriList = new List(); foreach (var t in uris) foreach (var r in regexs) if (RegexHelper.IsMatch(t.ToString(), r)) if(!uriList.Contains(t)) uriList.Add(t); return uriList; }
} }

    //根据内容--获取所有链接
    public static List<string> getLink(string htmlStr)
    {
        List<string> list = new List<string>(); //用来存放链接       
        String reg = @" ./?%&=]*)?";  //链接的正则表达式      
        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;

    //所有图片路径(如果是相对路径的话,自动设置成绝对路径)
    public static List<string> getImgPath(string url)
    {
        List<string> list = new List<string>();
        string htmlStr = getHtml(url);
        string pat = @"<imgb[^<>]*?bsrc[strn]*=[strn]*[""']?[strn]*(?<imgUrl>[^strn""'<>]*)[^<>]*?/?[strn]*>";
        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;
    }

分分快三计划 1分分快三计划 2网页抓取类

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

    }

/// <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;
        }
    }

                Regex reg_charset = new Regex(@"charsetbs*=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();

    //获取编码
    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;

整理了一个通用的类,下次使用的时候直接可以调用,也分享在这里,希望能给用的着的朋友带来方便。

最近在做一个分享功能,根据用户输入的网站 自动抓取链接中的文本及图片内容,根据自己的需求和思路

                string html = reader.ReadToEnd();

    //获取所有图片
    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;
    }

[爬虫学习笔记]Url过滤模块UrlFilter【分分快三计划】。    }

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

 

    //根据内容--获取标题
    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;

 

            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);

    //过滤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);

    //根据内容--获取描述信息
    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", "");
    }

 

    //处理url路径问题
    public static string getUrl(string url)
    {
        //如果是           返回
        //如果是  返回
        return url = url.Substring(0, url.LastIndexOf('/'))   "/";
    }
}

    //下载图片
    public void DownloadImg(string fileurl)
    {
        if (fileurl.Contains('.'))//url路径必须是绝对路径 例如 
        {
            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);
        }
    }

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

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

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 ASP.NET