winforms HTMLAgilityPack加载 AJAX 内容进行抓取

cwxwcias  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(143)

我试图在C# Web窗体项目中使用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 已加载?

kuarbcqp

kuarbcqp1#

似乎使用HTMLAgilityPack只能抓取通过html本身加载的内容。因此,通过 AJAX 加载的任何内容对HTMLAgilityPack都不可见。
也许最简单的选择-在可行的情况下-是使用基于浏览器的工具,如Firebug来确定 AJAX 加载的数据源。然后直接操作源数据。这样做的另一个好处是能够抓取更大的数据集。

ej83mcc0

ej83mcc02#

我一整天都在努力做到这一点,所以这里有一个联邦快递跟踪的例子,说明接受的答案是指(我认为):

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

或者,您是否考虑过使用www.example.com在应用程序中构建浏览器Cefsharp.net,然后通过.net界面使用Dev Tools?
你可能已经注意到,即使是动态 AJAX /JS生成的HTML也可以使用Firefox中的Inspect Element选项找到。因此,即使你不能使用传统的HTML抓取方法来抓取代码,代码也会在你的计算机上。
另一个可以考虑的选择。
https://cefsharp.github.io/

相关问题