HTMLAgilityPack加载AJAX内容进行抓取

本文关键字:抓取 加载 AJAX HTMLAgilityPack | 更新日期: 2023-09-27 18:14:34

我正在尝试在c# Web Forms项目中使用HTMLAgilityPack抓取网页。

我看到的所有解决方案都使用WebBrowser控件。然而,据我所知,这只适用于WinForms项目。

目前,我通过以下代码调用所需的页面:

var getHtmlWeb = new HtmlWeb();
var document = getHtmlWeb.Load(inputUri);
HtmlAgilityPack.HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//div[@class='"nav'"]");

我看到的一个使用WebBrowser控件的代码示例:

if (this.webBrowser1.Document.GetElementsByTagName("html")[0] != null)
_htmlAgilityPackDocument.LoadHtml(this.webBrowser1.Document.GetElementsByTagName("html")[0].OuterHtml);

如何在AJAX加载后抓取页面?

HTMLAgilityPack加载AJAX内容进行抓取

似乎使用HTMLAgilityPack只能抓取通过html本身加载的内容。因此,任何通过AJAX加载的内容都不会对htmllagilitypack可见。

也许最简单的选择——在可行的情况下——是使用基于浏览器的工具(如Firebug)来确定AJAX加载的数据的来源。然后直接操作源数据。这样做的另一个好处可能是能够抓取更大的数据集。

我挣扎了一整天才弄明白这个问题,所以这里有一个联邦快递跟踪的例子,说明了公认的答案是指什么(我认为):

        Dim body As String
        body = "data={""TrackPackagesRequest"":{""appType"":""WTRK"",""appDeviceType"":""DESKTOP"",""supportHTML"":true,""supportCurrentLocation"":true,""uniqueKey"":"""",""processingParameters"":{},""trackingInfoList"":[{""trackNumberInfo"":{""trackingNumber"":" & Chr(34) & "YOUR TRACKING NUMBER HERE" & Chr(34) & ",""trackingQualifier"":"""",""trackingCarrier"":""""}}]}}"
        body = body & "&action=trackpackages&locale=en_US&version=1&format=json"
        With CreateObject("MSXML2.XMLHTTP")
            .Open("POST", "https://www.fedex.com/trackingCal/track", False)
            .setRequestHeader("Referer", "https://www.fedex.com/apps/fedextrack/?tracknumbers=YOUR TRACKING NUMBER HERE")
            .setRequestHeader("User-Agent", "Mozilla/5.0")
            .setRequestHeader("X-Requested-With", "XMLHttpRequest")
            .setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
            .send(body)
            Dim Reply = .responseText
        End With

或者你是否考虑过使用Cefsharp.net构建一个浏览器到你的应用程序中,然后通过。net接口使用开发工具?

你可能已经注意到,即使是动态AJAX/JS生成的HTML也可以在Firefox中使用Inspect Element选项找到。因此,即使你无法使用传统的HTML抓取方法抓取这些代码,这些代码也会留在你的电脑上。

另一个可以考虑的选项。

https://cefsharp.github.io/