前言:说到爬虫,基本上清一色的都知道用Python,但是对于一些没玩过或者不想玩Python的来说,却比较头大一点。所以以下我站在C# 的角度,来写一个简单的Demo,用来演示C# 实现的简单小爬虫。大家感兴趣可以自己拓展出更加丰富的爬虫功能。
前提:引用包HtmlAgilityPack
先来个爬取文本。
新建一个文本处理的方法,用于处理爬取的文本数据,并写入到指定文件夹内的text.txt文件内
static async Task ProcessText(HtmlDocument doc, string textDir)
{
var textNodes = doc.DocumentNode.SelectNodes("//*[text()]");
if (textNodes != null)
{
StringBuilder allText = new StringBuilder();
foreach (HtmlNode node in textNodes.Where(node => !string.IsNullOrWhiteSpace(node.InnerText)))
{
string textContent = WebUtility.HtmlDecode(node.InnerText.Trim());
if (!string.IsNullOrWhiteSpace(textContent))
{
allText.AppendLine(textContent);
}
}
string filePath = Path.Combine(textDir, "text.txt");
await File.WriteAllTextAsync(filePath, allText.ToString());
}
}
static async Task ProcessImages(HtmlDocument doc, string baseUrl, string imagesDir)
{
var imageNodes = doc.DocumentNode.SelectNodes("//img[@src]");
if (imageNodes != null)
{
foreach (HtmlNode imageNode in imageNodes)
{
string imageUrl = imageNode.GetAttributeValue("src", null);
imageUrl = EnsureAbsoluteUrl(baseUrl, imageUrl);
string fileName = Path.GetFileName(new Uri(imageUrl).LocalPath);
string localPath = Path.Combine(imagesDir, fileName);
byte[] imageBytes = await client.GetByteArrayAsync(imageUrl);
await File.WriteAllBytesAsync(localPath, imageBytes);
}
}
}
static async Task ProcessVideos(HtmlDocument doc, string baseUrl, string videosDir)
{
var videoNodes = doc.DocumentNode.SelectNodes("//video/source[@src]");
if (videoNodes != null)
{
foreach (HtmlNode videoNode in videoNodes)
{
string videoUrl = videoNode.GetAttributeValue("src", null);
videoUrl = EnsureAbsoluteUrl(baseUrl, videoUrl);
string videoName = Path.GetFileName(new Uri(videoUrl).LocalPath);
string videoPath = Path.Combine(videosDir, videoName);
byte[] videoBytes = await client.GetByteArrayAsync(videoUrl);
await File.WriteAllBytesAsync(videoPath, videoBytes);
}
}
}
如果大佬们想要直接获取我本地测试的源码demo,可以在我的公众号【Dotnet Dancer】后台回复:【爬虫】 即可获取我的本地demo源码自行调试和把玩。
最近园子时不时会图片全挂掉,如果图片没掉了,可以移步另一个地方围观:
https://mp.weixin.qq.com/s/NB2UWsfUdgNU82UVRbWe3Q
如果以上内容对你有帮助,欢迎关注我的公众号【Dotnet Dancer】,或点赞、推荐和分享。我会时不时更新一些其他C#或者其他技术文章。