Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpAgilityPack删除产品页面-未获取所有产品_C#_Html_Web Scraping_Html Agility Pack - Fatal编程技术网

C# 使用HttpAgilityPack删除产品页面-未获取所有产品

C# 使用HttpAgilityPack删除产品页面-未获取所有产品,c#,html,web-scraping,html-agility-pack,C#,Html,Web Scraping,Html Agility Pack,上下文: 我正在用C#开发一个桌面应用程序,从少数域中的单个网页中获取/分析产品信息。我使用HtmlAgilityPack捕获和解析页面以获取所需的数据。我为不同的域编写不同的解析规则 问题: 当通过浏览器显示某一特定领域的页面时,可能会显示60-80种产品。然而,当我通过HtmlAgilityPack解析时,我最多只能得到20个产品。查看Firefox“查看页面源代码”中的原始html,似乎只有20个相关的产品分区。我的结论是,剩余的产品必须通过脚本加载,也许是为了减轻服务器上的负载。事实上,

上下文:

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

问题:

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

问题:


在所有脚本编写完成后,如何通过HtmlAgilityPack或其他方式访问当前的全套产品div?

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

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

  • 代码启动Firefox,完成后再次停止。这有点笨拙,我宁愿一切都发生在看不见的地方。建议您使用PhantomJS驱动程序而不是Firefox驱动程序来避免这种情况。但这并没有帮助,因为它只是弹出一个Windows控制台窗口
  • 这有点慢,因为在脚本加载补充内容时加载浏览器和暂停所需的时间。不过我还是可以接受的

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

    谢谢@swestner-看起来很有希望。不幸的是,我正在做一个WPF应用程序,因此System.Windows.Forms不能立即供我使用,但我怀疑有一个解决方法,我将对此进行研究。与此同时,我正在使用我刚刚发现的Selenium软件包将类似的东西组合在一起。我将在下面公布结果。