2015-12-10 57 views
0

语境:刮产品页面与HttpAgilityPack - 不是让所有的产品

我开发C#中的桌面应用程序刮/分析来自个人网页在少数领域的产品信息。我使用HtmlAgilityPack捕获和解析页面来获取所需的数据。我为不同的域编码不同的解析规则。

问题:从一个特定域

页,当通过浏览器显示,可以显示或许60-80的产品。但是,当我通过HtmlAgilityPack解析时,我最多只能获得20个产品。在Firefox中查看原始html“查看页面源代码”,似乎也只有20个相关的产品div存在。我得出结论,其余产品必须通过脚本加载,以减轻服务器的负担。事实上,我有时会看到这种情况出现在浏览器中有一个短暂的停顿,而20多个产品负载,那么另外20等

问:

如何访问,通过HtmlAgilityPack或否则,一旦所有的脚本完成,整套产品div就会出现?

回答

0

好吧,我已经得到的东西用硒包(通过的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. 由于加载浏览器所需的时间并在脚本加载补充内容时暂停,所以速度有点慢。尽管如此,我或许可以忍受它。

我会尝试重写@swestner代码以使其在WPF应用程序中运行,并查看哪些是整数解决方案。

0

您可以使用WebBrowserSystem.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更多细节

+0

谢谢@swestner - 看起来很有希望。不幸的是,我正在做一个WPF应用程序,所以System.Windows.Forms不会立即提供给我,但我怀疑有一个解决办法,我会研究。与此同时,我用我刚刚发现的Selenium软件包敲击类似的东西。我会发布下面的结果。 – ifinlay