ITLJF
.Net 程序员

联系站长:itljfs@163.com

豫ICP备17037278号-1

Copyright © 2013-2023 ITljf

  豫公网安备 41102402000068号

C# 抓取数据总结(一)
2019/5/26 17:02:40 标签
摘要:C# 抓取数据总结(一), WebClient,HtmlAgilityPack

这个是第一种方法,因为我最先学会使用,可配置项多,所以先记录下

使用HtmlAgilityPack抓取数据

官网地址
安装 - 直接使用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#有模拟浏览器请求的方式。

C# 使用 WebClient 获取html

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

把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 ?? "";
    }
}

获取class为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,一般的使用下超级好用。