2015-12-10 2 views
0

Контекст:Зачистка страницу продукта с HttpAgilityPack - Не получать все продукты

Я занимаюсь разработкой настольных приложений в C#, чтобы скрести/анализировать информацию о продукте из отдельных веб-страниц в небольшом количестве доменов. Я использую HtmlAgilityPack для захвата и анализа страниц для получения необходимых данных. Я кодирую различные правила синтаксического разбора для разных доменов.

Выпуск:

Страницы из одной конкретной области, при отображении через браузер, может показать, возможно, 60-80 продуктов. Однако, когда я просматриваю HtmlAgilityPack, я получаю максимум 20 продуктов. Глядя на необработанный html в Firefox «View Page Source», также появляется только 20 из соответствующих продуктов. Я пришел к выводу, что остальные продукты должны загружаться через скрипт, возможно, для облегчения загрузки на сервер. На самом деле я иногда можно увидеть, как это происходит в браузере, как есть короткая пауза, в то время как более 20 продуктов нагрузки, а затем еще 20 и т.д.

Вопрос:

Как я могу получить доступ через HtmlAgilityPack или иначе, полный набор разделов продукта присутствует после того, как все скрипты завершены?

ответ

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

Чтобы загрузить данные и пакет гибкости, вы можете использовать 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 для более подробной информации

+0

Спасибо @swestner - Выглядит многообещающе. К сожалению, я делаю приложение WPF, поэтому System.Windows.Forms не сразу доступен мне, но я подозреваю, что для этого есть работа. Тем временем я стучу что-то подобное вместе, используя пакет Selenium, который я только что обнаружил. Я опубликую результат этого ниже. – ifinlay

Смежные вопросы