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只能抓取通过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/