这个是第一种方法,因为我最先学会使用,可配置项多,所以先记录下
官网地址
安装 - 直接使用Nuget安装就好
抓取数据就是模拟浏览器请求,把网页html抓取到本地,然后用程序解析html并从里面获取到我们需要的信息。
// 1,From File
var doc = new HtmlDocument();
doc.Load(filePath);
// 2,From String
var doc = new HtmlDocument();
doc.LoadHtml(html);
// 3,From Web
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var doc = web.Load(url);
如果html已经获取到本地,可以使用前两个,如果是从网络上抓取数据,第三个方法很容易出错,如果html不是特别规范,获取网站有防止抓取的措施,基本是都会报错的,还好,C#有模拟浏览器请求的方式。
string url = string.Format("https://itljf.com/h/p/6369.shtml");
WebClient wc = new WebClient();
Encoding enc = Encoding.GetEncoding("UTF-8");
Byte[] pageData = wc.DownloadData(url);
string html = enc.GetString(pageData);
代码如上就是根据URL获取html的方法,一般的情况下就可以了,如果网站有更多的防止抓取数据的方式,需要配置更多的数据,这个后期的博客再说吧
把html使用上面官网例子里面的LoadHtml
中后,然后我们就根据我们需要进行解析我们需要的数据了。这个时候需要我们了解一下XPATH
,不会的话可以搜索下 XPath 的语法。下面举几个例子。
注:注意,获取到的数据都有可能为空,每一步都要进行空数据处理
var list = doc.DocumentNode.SelectNodes("//img")?.ToList();
if (list != null)
{
foreach (var item in list)
{
//获取图片路径
var src = item.Attributes["src"]?.Value ?? "";
}
}
blog-title
的div的信息注意:class前面要加@转义
var title = doc.DocumentNode.SelectNodes("//div[@class='blog-title']")?.FirstOrDefault();
string innerHtml = title?.InnerHtml;//获取该元素的html
string innerText = title?.InnerText;//获取该元素的里面的文本
其他元素或者根据id同理,也有很多其他的方法,根据JQuery的逻辑思想就基本可以使用VS点出来了。
把文件路径和文件存储本地的路径配置好就行了
WebClient wc1 = new WebClient();
wc1.DownloadFile("url", "path");
当需要下载的文件比较多的时候推荐这个方法
异步方法
public void DownloadImg(string url, string path)
{
WebClient wc = WebClient();
wc.DownloadFile(url, path);
}
//在用到下载文件的地方提前声明这个委托执行方法
Action downloadImg = new Action(DownloadImg);
//下载文件的时候,调用这个方法,即可高效的异步下载文件了
downloadImg.BeginInvoke("url", "path", null, null);
爬虫和抓取数据在没有了解的时候以为什么特别的技术,当了解后其实就是把远程的html获取到,然后解析出来我们需要的数据就可以了,需要注意的是网络数据很容易报错,要注意错误处理,要不然一会一报错程序一停,烦。HtmlAgilityPack
使用已经很好用了,优点是可配置项多,功能复杂(这个既是优点,也是缺点),下个博客介绍一个超级简单使用的抓取数据的轮子Jumony.Core
,一般的使用下超级好用。