C#网络爬虫/解析器/蜘蛛

C#网络爬虫/解析器/蜘蛛,c#,winforms,parsing,web-crawler,C#,Winforms,Parsing,Web Crawler,我是C#和WinForms的新手,我想创建一个web爬虫(解析器)——它可以解析网页并按层次显示它们我不知道如何使机器人爬行与特定的超链接深度 所以我想我有两个问题: 如何使用指定的链接深度进行机器人爬网 如何分层显示所有超链接 另外,如果这是一个代码示例,我会很高兴的 p.p.S.有1个按钮=按钮1;1 richtextbox=richTextBox1 这是我的密码:我知道这很难看。。。。(一个按钮中的所有代码): 公共部分类表单1:表单 { 公共表格1() { 初始化组件(); } 私有无效

我是C#和WinForms的新手,我想创建一个web爬虫(解析器)——它可以解析网页并按层次显示它们我不知道如何使机器人爬行与特定的超链接深度

所以我想我有两个问题:

  • 如何使用指定的链接深度进行机器人爬网
  • 如何分层显示所有超链接
  • 另外,如果这是一个代码示例,我会很高兴的

    p.p.S.有1个按钮=按钮1;1 richtextbox=richTextBox1

    这是我的密码:我知道这很难看。。。。(一个按钮中的所有代码):

    公共部分类表单1:表单
    {
    公共表格1()
    {
    初始化组件();
    }
    私有无效按钮1\u单击(对象发送者,事件参数e)
    {
    //声明
    HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse=(HttpWebResponse)request.GetResponse();
    StreamReader sr=新的StreamReader(response.GetResponseStream());
    匹配m;
    字符串另一个测试=@“((ht){1}tp[s]?:/)[-a-zA-Z0-9@:%\+.~\\?&\\]+”;
    List savedUrls=新列表();
    列表标题=新列表();
    //转到此URL:
    字符串url=UrlTextBox.Text=”http://www.yahoo.com";
    if(!(url.StartsWith(“http:/”)| | url.StartsWith(“https:/”))
    url=“http://”+url;
    //删除整个Html代码:
    字符串s=sr.ReadToEnd();
    尝试
    {
    //获取URL:
    m=正则表达式匹配,另一个测试,
    RegexOptions.IgnoreCase | RegexOptions.Compiled,
    时间跨度从秒(1)开始;
    while(m.Success)
    {
    savedUrls.Add(m.Groups[1].ToString());
    m=m.NextMatch();
    }
    //获取标题:
    Match m2=Regex.Match(s,@“\s*(.+?)\s*”);
    如果(m2.成功)
    {
    titles.Add(m2.Groups[1].Value);
    }
    //节目名称:
    richTextBox1.Text+=标题[0]+“\n”;
    //显示URL:
    trimURL(参考savedUrls);
    }
    捕获(RegexMatchTimeoutException)
    {
    WriteLine(“匹配操作超时”);
    }
    高级关闭();
    }
    专用URL(参考列表URL)
    {
    列表d=URL.Distinct().ToList();
    foreach(d中的v值)
    {
    如果(v.IndexOf('.')!=-1&&v!=”http://www.w3.org")
    {
    richTextBox1.Text+=v+“\n”;
    }
    }
    }
    }
    
    }

    还有一个问题:
    有人知道如何将其保存为XML格式的树吗?

    如果需要解析此类结构化数据(xhtml),请尝试查看xpath:


    (您还应该将逻辑放在专用对象中,而不仅仅是放在GUI层。稍后您会很感激的。)

    我还强烈推荐您使用

    使用Html Agility Pack,您可以执行以下操作:

    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var urls = new List<String>();
    doc.DocumentNode.SelectNodes("//a").ForEach(x => 
    {
        urls.Add(x.Attributes["href"].Value);
    });
    
    __

    private readonly List_results=new List();
    私有Int32_maxDepth=5;
    public void Foo(字符串urlToCheck=null,Int32 depth=0,ParsResult parent=null)
    {
    如果(深度>=\u最大深度)返回;
    字符串html;
    使用(var wc=new WebClient())
    html=wc.DownloadString(urlToCheck??parent.Url);
    var doc=新的HtmlDocument();
    doc.LoadHtml(html);
    var aNods=doc.DocumentNode.SelectNodes(“//a”);
    if(aNods==null | |!aNods.Any())返回;
    foreach(阳极中的var阳极)
    {
    var url=aNode.Attributes[“href”];
    如果(url==null)
    继续;
    var结果=新结果
    {
    深度=深度,
    父=父,
    Url=Url.Value
    };
    _结果。添加(结果);
    WriteLine(“{0}-{1}”,深度,result.Url);
    Foo(深度:深度+1,父级:结果);
    }
    
    简单地说
    HTMLAgilityPack
    Python+urlib2+BeautifulSoupis您有没有可能编写一个代码:如何使用HTMLAgilityPack实现深度?Python+urlib2+beautifulsoups-对不起,我甚至在C#中都是新手:)嗨,欢迎来到这个网站。您的问题可能太笼统了。您有什么具体的问题吗em?谢谢你的帮助。我只需要知道如何制作一个函数(可能是递归函数)来深入挖掘…请你帮我把这个保存在XML文件中好吗?谢谢你的帮助。
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var urls = new List<String>();
    doc.DocumentNode.SelectNodes("//a").ForEach(x => 
    {
        urls.Add(x.Attributes["href"].Value);
    });
    
    public class ParsResult
    {
        public ParsResult Parent { get; set; }
        public String Url { get; set; }
        public Int32 Depth { get; set; }
    }
    
    private readonly List<ParsResult> _results = new List<ParsResult>();
    private  Int32 _maxDepth = 5;
    public  void Foo(String urlToCheck = null, Int32 depth = 0, ParsResult parent = null)
    {
        if (depth >= _maxDepth) return;
        String html;
        using (var wc = new WebClient())
            html = wc.DownloadString(urlToCheck ?? parent.Url);
    
        var doc = new HtmlDocument();
        doc.LoadHtml(html);
        var aNods = doc.DocumentNode.SelectNodes("//a");
        if (aNods == null || !aNods.Any()) return;
        foreach (var aNode in aNods)
        {
            var url = aNode.Attributes["href"];
            if (url == null)
                continue;
            var result = new ParsResult
            {
                Depth = depth,
                Parent = parent,
                Url = url.Value
            };
            _results.Add(result);
            Console.WriteLine("{0} - {1}", depth, result.Url);
            Foo(depth: depth + 1, parent: result);
    }