背景
网上关于爬虫的介绍很多,小编当初刚入门编程领域时老是听别人说爬虫怎么怎么好玩,对爬虫也没有概念,只知道这个名字特别牛叉,后来在采集数据时才真心明白"爬虫"其含义,不得不说取这个名字的人相当有水准,定登大雅之堂。关于这些概念小编就顺带一过,需要更详细的说明,请谷歌或百度知。小编今天要介绍的是.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中新建控制台自行去运行。或者点击“阅读原文”去浏览代码更友好。