.net爬虫是一门必修课

背景

网上关于爬虫的介绍很多,小编当初刚入门编程领域时老是听别人说爬虫怎么怎么好玩,对爬虫也没有概念,只知道这个名字特别牛叉,后来在采集数据时才真心明白"爬虫"其含义,不得不说取这个名字的人相当有水准,定登大雅之堂。关于这些概念小编就顺带一过,需要更详细的说明,请谷歌或百度知。小编今天要介绍的是.net爬虫,近几年,网上都在火吹python这门语言怎么怎么牛逼,凡是说爬虫的,谈人工智能的必能扯上python,当然小编这这里没有任何贬低python的意思。只是python爬的.net照样能干,java也可以,大部分高级语言都可以做到!好了,牛逼不多吹,下面亮真货。

在抓取数据之前,我们心里大概有个思路;

第一点:数据从网上来,必然要用到网络操作类,在.net这方面有三个操作类供我们使用(WebClient,HttpClient,HttpWebRequest),WebClient操作简单粗暴、HttpClient使用时注意资源的释放问题、HttpWebRequest更接近底层,在使用时稍微麻烦点,其实三者一般想要的功能都可以实现。

第二点:抓取的数据里面都是和html元素混合在一起,那必然需要解析html结构,筛选出我们想要的数据。这方面介绍两款工具(HtmlAgilityPack结合XPath使用,AngleSharp)。

我们抓取下博客园的详情页数据,上代码;
        {
            HtmlWeb client = new HtmlWeb();
            string detailUrl = "https://www.cnblogs.com/wangjiming/p/10098061.html";
            var doc = client.Load(detailUrl);
            HtmlNode node = doc?.DocumentNode.SelectSingleNode("//div[@class='post']");
            var title = node?.SelectSingleNode("h1[@class='postTitle']");
            HtmlNode node2 = doc?.DocumentNode.SelectSingleNode("//div[@class='postBody']");
            var content = node2?.SelectSingleNode("div[@id='cnblogs_post_body']");
            Console.WriteLine(title?.InnerText);
            Console.WriteLine(content?.InnerText);
            Console.WriteLine("---------------");
            //提取所有图片共下载
            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]*>";
            Regex r = new Regex(pat, RegexOptions.Compiled);
            MatchCollection listImg = r.Matches(content.InnerHtml);
            foreach (Match item in listImg)
            {
                if (item.Success)
                {
                    string url = item.Groups[1].Value.ToString();
                    HttpDownLoad.DownloadUseWebClient(url, "image");
                    string fullImgSrc = "/editorImages/cpy" + url.Substring(url.LastIndexOf('/'));
                    content.InnerHtml = content.InnerHtml.Replace(url, fullImgSrc);
                    Console.WriteLine(content.InnerHtml);
                }
            }
            Console.ReadLine();
        } 
  贴上关于图片下载的方法(HttpDownLoad.DownloadUseWebClient(url, "image"));
 public static void DownloadUseWebClient( string url, string localPath,string webSite=null)
        {
            WebClient wc = new WebClient();
            string fileName = Path.GetFileName(url);
            string path = Path.Combine(localPath, fileName);
            if (!Directory.Exists(localPath))
            {
                Directory.CreateDirectory(localPath);
            }
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            wc.Headers.Add("Referer", webSite);     
            wc.DownloadFile(url, path);
        }  

大家可复制以上代码到vs中新建控制台自行去运行。或者点击“阅读原文”去浏览代码更友好。

上一篇:AI 推荐模型


下一篇:KCP C# 版本 源码解析