使用HttpAgilityPack刮擦产品页面 - 没有获得所有产品

时间:2015-12-10 17:28:25

标签: c# html web-scraping html-agility-pack

上下文

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

问题:

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

问题:

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

2 个答案:

答案 0 :(得分:0)

您可以使用WebBrowser中的System.Windows.Forms加载数据,使用敏捷包来解析数据。它看起来像这样:

 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);

有关详细信息,请参阅here

答案 1 :(得分:0)

好的,我已经使用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,可以进行进一步分析,首先通过反复滚动到底部来强制页面完全加载。两个未决问题:

  1. 代码启动Firefox,然后在完成后再次停止。这有点笨拙,我宁愿无形地发生这一切。它建议你可以使用PhantomJS驱动程序而不是Firefox驱动程序来避免这种情况。这并没有帮助,因为它只是弹出一个Windows控制台窗口。
  2. 由于加载浏览器所花费的时间并且在脚本加载补充内容时暂停,因此它有点慢。我可以忍受它。
  3. 我也尝试重新编写@swestner代码,让它在WPF应用程序中运行,看看哪个是更整洁的解决方案。

相关问题