最近对爬虫很感兴趣,稍微研究了一下,利用HtmlAgilityPack制作了一个十分简单的爬虫,这个简易爬虫只能获取静态页面的Html

HtmlAgilityPack简介

HtmlAgilityPack是一个解析速度十分快,并且开源的Html解析工具,并且HtmlAgilityPack支持使用Xpath解析Html,能够帮助我们解析Html文档就像解析Xml文档一样轻松、方便。

C#安装HtmlAgilityPack

  1. 如果VS安装有Nuget,在Nuget直接搜索安装即可。
  2. 下载后解压缩后有3个文件,这里只需要将其中的HtmlAgilityPack.dll、HtmlAgilityPack.xml引入解决方案中即可使用

实例(获取某页面图片)

加载HTML页面

//从网页中加载
string url = "https://www.bilibili.com";
HtmlWeb web = new HtmlWeb();
HtmlDocument hd = web.Load(url);

利用WebClient写一个图片下载器

需要using System.Netusing System.IO

/// <summary>
/// 图片下载器
/// </summary>
public class ImgDownloader
{
/// <summary>
/// 下载图片
/// </summary>
/// <param name="webClient"></param>
/// <param name="url">图片url</param>
/// <param name="folderPath">文件夹路径</param>
/// <param name="fileName">图片名</param>
public static void DownloadImg(WebClient webClient, string url, string folderPath, string fileName)
{
//如果文件夹不存在,则创建一个
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
//判断路径是否完整,补全不完整的路径
if (url.IndexOf("https:") == -1 && url.IndexOf("http:") == -1)
{
url = "https:" + url;
}
//下载图片
try
{
webClient.DownloadFile(url, folderPath + fileName);
Console.WriteLine(fileName + "下载成功");
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.WriteLine(url);
}
}
}

通过Xpath获取img标签中的图片

string imgPath = "//img";//选择img
int imgNum = 0;//图片编号
//获取img标签中的图片
foreach (HtmlNode node in hd.DocumentNode.SelectNodes(imgPath))
{
if (node.Attributes["src"] != null)
{
string imgUrl = node.Attributes["src"].Value.ToString();
if (imgUrl != "" && imgUrl != " ")
{
imgNum++;
//生成文件名,自动获取后缀
string fileName = imgNum + imgUrl.Substring(imgUrl.LastIndexOf("."));
ImgDownloader.DownloadImg(wc, imgUrl, "images/", fileName);
}
}
}

通过Xpath获取背景图

//获取背景图
string bgImgPath = "//*[@style]";//选择具有style属性的节点
foreach (HtmlNode node in hd.DocumentNode.SelectNodes(bgImgPath))
{
if (node.Attributes["style"].Value.Contains("background-image:url"))
{
imgNum++;
string bgImgUrl = node.Attributes["style"].Value;
bgImgUrl = Regex.Match(bgImgUrl, @"(?<=\().+?(?=\))").Value;//读取url()的内容
//Console.WriteLine(bgImgUrl);
//生成文件名,自动获取后缀
string fileName = imgNum + bgImgUrl.Substring(bgImgUrl.LastIndexOf(".")); ImgDownloader.DownloadImg(wc, bgImgUrl, "images/bgcImg/", fileName);
}
}

完整代码

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using HtmlAgilityPack;
using System.Text.RegularExpressions; namespace WebCrawlerDemo
{
class Program
{
static void Main(string[] args)
{
WebClient wc = new WebClient(); string url = "https://www.bilibili.com";
HtmlWeb web = new HtmlWeb();
HtmlDocument hd = web.Load(url);//下载html页面 string imgPath = "//img";//选择img int imgNum = 0;//图片编号 //获取img标签中的图片
foreach (HtmlNode node in hd.DocumentNode.SelectNodes(imgPath))
{
if (node.Attributes["src"] != null)
{
string imgUrl = node.Attributes["src"].Value.ToString();
if (imgUrl != "" && imgUrl != " ")
{
imgNum++;
//生成文件名,自动获取后缀
string fileName = imgNum + imgUrl.Substring(imgUrl.LastIndexOf(".")); ImgDownloader.DownloadImg(wc, imgUrl, "images/", fileName);
}
}
}
//获取背景图
string bgImgPath = "//*[@style]";//选择具有style属性的节点
foreach (HtmlNode node in hd.DocumentNode.SelectNodes(bgImgPath))
{
if (node.Attributes["style"].Value.Contains("background-image:url"))
{
imgNum++;
string bgImgUrl = node.Attributes["style"].Value;
bgImgUrl = Regex.Match(bgImgUrl, @"(?<=\().+?(?=\))").Value;//读取url()的内容
//生成文件名,自动获取后缀
string fileName = imgNum + bgImgUrl.Substring(bgImgUrl.LastIndexOf(".")); ImgDownloader.DownloadImg(wc, bgImgUrl, "images/bgcImg/", fileName);
}
} Console.WriteLine("----------END----------");
Console.ReadKey();
}
}
/// <summary>
/// 图片下载器
/// </summary>
public class ImgDownloader
{
/// <summary>
/// 下载图片
/// </summary>
/// <param name="webClient"></param>
/// <param name="url">图片url</param>
/// <param name="folderPath">文件夹路径</param>
/// <param name="fileName">图片名</param>
public static void DownloadImg(WebClient webClient, string url, string folderPath, string fileName)
{
//如果文件夹不存在,则创建一个
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
//判断路径是否完整,补全不完整的路径
if (url.IndexOf("https:") == -1 && url.IndexOf("http:") == -1)
{
url = "https:" + url;
}
//下载图片
try
{
webClient.DownloadFile(url, folderPath + fileName);
Console.WriteLine(fileName + "下载成功");
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.WriteLine(url);
}
}
}
}

参考文章

最新文章

  1. Android 弱引用和软引用
  2. Python_Day5_迭代器、装饰器、软件开发规范
  3. Content has been consumed
  4. IIS7.5 HTTP 错误 500.19 - Internal Server Error 问题的解决方案
  5. 编写Swift代码的其他工具
  6. meta标签属性总结
  7. PHP通过Zabbix API获取服务器监控信息
  8. django 配置URLconf和获取值
  9. MFC半透明对话框
  10. PHP如何处理emoji表情存入utf8的数据库
  11. 0106笔记--vc2012 打印堆栈
  12. HDU 2196 Compute --树形dp
  13. Linux网络编程学习(八) ----- 文件和记录锁定(第四章)
  14. keepalived高可用集群。
  15. 信息检索(IR)的评价指标介绍 - 准确率、召回率、F1、mAP、ROC、AUC
  16. dup2替换
  17. ZOJ 3156 Taxi (二分 + 二分匹配)
  18. ImportError DLL load failed: %1 不是有效的 Win32 应用程序
  19. Access中替代case when的方法 .
  20. Windows电脑键盘快捷键大全【最全的快捷键】

热门文章

  1. python 获取 一个正整数的二进制
  2. #C++初学记录(树和二叉树)
  3. Clang的线程安全分析静态工具
  4. LODOP很简短的问答(纯文字)
  5. [LeetCode] 96. Unique Binary Search Trees 唯一二叉搜索树
  6. [LeetCode] 121. Best Time to Buy and Sell Stock 买卖股票的最佳时间
  7. Redis 主从、哨兵Sentinel、Jedis
  8. 【视频开发】【计算机视觉】doppia编译之一:前言及安装CUDA
  9. 基于Prometheus+Grafana+AlertManager的监控系统
  10. Python 内置函数--range() xrange()