一.使用传统的抓取方法:HtmlAgilityPack.HtmlDocument
Html Agility Pack 不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲美:)
Html Agility Pack最常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。其中HtmlWeb类帮助获取Web页面很方面。
二、添加引用很简单
Install-Package HtmlAgilityPack
1
HtmlDocument类
当然在解析DOM前需要加载html原始文件或者html的字符串,HtmlDocument类封装了支持此功能的方法,下面是加载html的方法介绍。
HtmlDocument类定义了多个重载的Load方法来实现以不同方式加载html,其实主要分为两种,一种是从Stream中加载html,另外一种是从物理路径加载html,分别见下面:
方法:public void Load(TextReader reader)
说明:从指定的 TextReader对象中加载Html
示例:
HtmlDcument doc = new HtmlDocument();
StreamReader sr = File.OpenText( " file path " );
doc.Load(sr);
1
2
3
基于上面方法,衍生出了几个不同重载方法。
以指定的Stream对象为主的有:
(1)public void Load(Stream stream) ///从指定的Stream对象中加载html;
(2)public void Load(Stream stream, bool detectEncodingFromByteOrderMarks) ///指定是否从顺序字节流中解析编码格式
(3)public void Load(Stream stream, Encoding encoding) ///指定编码格式
(4)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
(5)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
以指定的物理路径为主的有:
(1)public void Load(string path)
(2)public void Load(string path, bool detectEncodingFromByteOrderMarks) ///指定是否从顺序字节流中解析编码格式
(3)public void Load(string path, Encoding encoding) ///指定编码格式
(4)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
(5)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
这种方式只能抓取JS加载前的内容,有缺陷;
二,使用经典方案:PhantomJS,抓取JS加载后的网页内容;
hantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,这样访问网页就省去了浏览器的界面绘制所消耗的系统资源,比较适合用于网络测试等应用 。我只是调用了其中的一个截取网页的小功能,可以完美的解析网页的js和css 而且兼容html5,不过最新的1.5版本不支持flash,所以我采用了1.4的版本,能够得到完整的网页体验。
1.打开nuget安装相关包;
2.
3.源码:引用
using OpenQA.Selenium.PhantomJS;
using OpenQA.Selenium.Chrome;
//using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;
static ChromeDriver driver { get; set; }
static ICookieJar cookie { get; set; }
#region 抓取数据的要求
private static void GetHtml(string searchAA,string url)
{
PhantomJSDriverService driverService = PhantomJSDriverService.CreateDefaultService();
driverService.IgnoreSslErrors = true;
ChromeOptions options = new ChromeOptions();
options.AddArgument("--headless");
options.AddArgument("--nogpu");
List<String> tagNmaeList = new List<string>();
using (driver = new ChromeDriver(options))
{
try
{
driver.Manage().Window.Maximize();
driver.Navigate().GoToUrl(url);
Thread.Sleep(5000);
var txtPath = driver.PageSource;
string wtxtTitle =driver.FindElementByTagName("h1").Text;//
string wtxtContent = wtxtTitle+ "\r\n" + driver.FindElementById("wenzhangziti").Text;//
string strUrl = driver.FindElementByClassName("prenext").FindElement(By.TagName("a")).GetAttribute("href").ToString();//获取到文章内容
string strccUrl = driver.FindElementByClassName("prenext").Text;
bool boolstr1 = strccUrl.Contains("下");
bool boolstr2 = strccUrl.Contains("上");
}
catch (NoSuchElementException)
{
Console.WriteLine("找不到该元素"); ;
}
}
}
#endregion