使用HttpAgilityPack报废产品页面-未获取所有产品

本文关键字:获取 有产品 HttpAgilityPack 使用 | 更新日期: 2023-09-27 18:26:19

上下文:

我正在用C#开发一个桌面应用程序,从少数域的单个网页中抓取/分析产品信息。我使用HtmlAgilityPack来捕获和解析页面以获取所需的数据。我为不同的域编写了不同的解析规则。

问题:

当通过浏览器显示某个特定域的页面时,可能会显示60-80种产品。然而,当我解析HtmlAgilityPack时,我最多只能得到20个产品。看看Firefox"查看页面源代码"中的原始html,似乎也只有20个相关的产品div。我的结论是,必须通过脚本加载剩余的产品,也许是为了减轻服务器上的负载。事实上,我有时可以在浏览器中看到这种情况,因为在加载20多个产品时会有一个短暂的暂停,然后再加载20个等等。

问题:

一旦所有脚本完成,我如何通过HtmlAgilityPack或其他方式访问完整的产品div集?

使用HttpAgilityPack报废产品页面-未获取所有产品

您可以使用System.Windows.Forms中的WebBrowser来加载数据,并使用敏捷包来解析数据

 var browser = new WebBrowser();
 browser.Navigate("http://whatever.com");
  while (true)
  {
      if(browser.ReadyState == WebBrowserReadyState.Complete && browser.IsBusy != true)
      {
        break;
      }
        //not for production
        Thread.Sleep(1000)
  }

  var doc = new HtmlAgilityPack.HtmlDocument();
  var dom = (IHTMLDocument3)browser.Document.DomDocument; 
  StringReader reader = new StringReader(dom.documentElement.outerHTML); 
  doc.Load(reader);

请参阅此处了解更多详细信息

好的,我已经使用Selenium包(可通过NuGet获得)完成了一些工作。代码如下:

    private HtmlDocument FetchPageWithSelenium(string url)
    {
        IWebDriver driver = new FirefoxDriver();
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        driver.Navigate().GoToUrl(url);
       // Scroll to the bottom of the page and pause for more products to load.
       // Do it four times as there may be 4x20 products to retrieve.
        js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.Sleep(2000);
        js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.Sleep(2000);
        js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.Sleep(2000);
        js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");
        HtmlDocument webPage = new HtmlDocument();
        webPage.LoadHtml(driver.PageSource.ToString());
        driver.Quit();
        return webPage;
    }

这将返回一个HtmlAgilityPack HtmlDocument,该HtmlDocument已准备好进行进一步分析,它首先通过反复滚动到底部来强制页面完全加载。两个悬而未决的问题:

  1. 该代码启动Firefox,然后在完成后再次停止。这有点笨拙,我宁愿这一切都在无形中发生。建议您使用PhantomJS驱动程序而不是Firefox驱动程序来避免这种情况。但这并没有起到任何作用,因为它只是弹出了一个Windows控制台窗口
  2. 由于加载浏览器和脚本加载补充内容时暂停所需的时间,速度有点慢。不过我也许能接受

我也会尝试重新编写@swestner代码,让它在WPF应用程序中运行,看看哪种解决方案更整洁。