2013-09-20 2 views
3

Я пытаюсь использовать безгласный браузер для сканирования, чтобы добавить функции SEO в проект с открытым исходным кодом, который я разрабатываю.Безглавые браузеры и Windows Azure Веб-сайты

Сайт примера проекта развернут через веб-сайты Azure.

Я попытался несколько способов заставить задачу работать с использованием различных решений, таких как Selenium .NET (PhantomJSDriver, HTMLUnitDriver, ...) или даже автономного файла phantomJs .exe.

Я использую браузер без браузера, потому что сайт основан на DurandalJS, поэтому ему нужно выполнить сценарии и ждать, пока условие будет истинным, чтобы вернуть сгенерированный HTML. По этой причине вы не можете использовать такие вещи, как классы WebClient/WebResponse или HTMLAgilityPack, которые отлично подходят для работы с сайтами, отличными от javascript.

Все вышеперечисленные методы работают в моей локальной сети devbox, но проблема возникает при загрузке сайта на Azure Websites. При использовании автономных phantomjs сайт зависает при доступе к конечной точке url и через некоторое время возвращает ошибку HTTP 502. В случае использования Selenium WebDriver i'm Получение

OpenQA.Selenium.WebDriverException: Unexpected error. System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:XXXX 

Я думаю, что проблема с запуском EXE-файлы в Azure и не с кодом. Я знаю, что можно запускать .exe-файлы в Azure CloudServices через WebRole/WebWorkers, но вам нужно остаться на сайтах Azure, чтобы все было просто.

Возможно использование безгласного браузера на сайтах Azure? У кого-нибудь есть опыт в этой ситуации?

Моего кода для решения автономного PhantomJS является

//ASP MVC ActionResult 

public ActionResult GetHTML(string url) 
{ 
    string appRoot = Server.MapPath("~/"); 

    var startInfo = new ProcessStartInfo 
    { 
     Arguments = String.Format("{0} {1}", Path.Combine(appRoot, "Scripts\\seo\\renderHTML.js"), url), 
     FileName = Path.Combine(appRoot, "bin\\phantomjs.exe"), 
     UseShellExecute = false, 
     CreateNoWindow = true, 
     RedirectStandardOutput = true, 
     RedirectStandardError = true, 
     RedirectStandardInput = true, 
     StandardOutputEncoding = System.Text.Encoding.UTF8 
    }; 
    var p = new Process(); 
    p.StartInfo = startInfo; 
    p.Start(); 
    string output = p.StandardOutput.ReadToEnd(); 
    p.WaitForExit(); 
    ViewData["result"] = output; 
    return View(); 
} 

// PhantomJS script 

var resourceWait = 300, 
    maxRenderWait = 10000; 

var page = require('webpage').create(), 
    system = require('system'), 
    count = 0, 
    forcedRenderTimeout, 
    renderTimeout; 

page.viewportSize = { width: 1280, height: 1024 }; 

function doRender() { 
    console.log(page.content); 
    phantom.exit(); 
} 

page.onResourceRequested = function (req) { 
    count += 1; 
    //console.log('> ' + req.id + ' - ' + req.url); 
    clearTimeout(renderTimeout); 
}; 

page.onResourceReceived = function (res) { 
    if (!res.stage || res.stage === 'end') { 
     count -= 1; 
     //console.log(res.id + ' ' + res.status + ' - ' + res.url); 
     if (count === 0) { 
      renderTimeout = setTimeout(doRender, resourceWait); 
     } 
    } 
}; 

page.open(system.args[1], function (status) { 
    if (status !== "success") { 
     //console.log('Unable to load url'); 
     phantom.exit(); 
    } else { 
     forcedRenderTimeout = setTimeout(function() { 
      //console.log(count); 
      doRender(); 
     }, maxRenderWait); 
    } 
}); 

и для опции Селена

public ActionResult GetHTML(string url) 
{ 
    using (IWebDriver driver = new PhantomJSDriver()) 
    { 
     driver.Navigate().GoToUrl(url); 

     WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 

     IWebElement myDynamicElement = wait.Until<IWebElement>((d) => 
     { 
      return d.FindElement(By.CssSelector("#compositionComplete")); 
     }); 

     var content = driver.PageSource; 

     driver.Quit(); 

     return Content(content); 
    }      
} 

Спасибо !!

ответ

3

Вы не можете выполнять exe-файлы в среде общего веб-сайта, либо вам нужно использовать веб-службы, либо вам нужно настроить правильную (лазурную) виртуальную машину.

Служба бесплатного общего пользования на самом деле является базовой и не сокращает ее, когда вам требуется более совершенная функциональность.

Смотрите этот вопрос и ответ на принятый более усложненный ответ: Can we run windowservice or EXE in Azure website or in Virtual Machine?

+1

Эй, спасибо за ответ. Я думаю что. Поскольку я хотел бы остаться на веб-сайтах Azure, я попытаюсь пойти с онлайн-службой, запущенной фантомом вроде Blitline, которая, похоже, работает нормально. – yagopv

+1

Этот ответ неверен. Я успешно использовал узел на сайтах Azure, так как для PhantomJs - попытка заставить его работать в данный момент, текущая проблема заключается в том, что PhantomJs не видит имена сетей и без установленного таймаута, сценарий не остановится –

+0

@DmitryDzygin Have вы нашли решение?У меня такая же проблема – Freshblood

0

Я не уверен, что общий и основной сайт среды, но я успешно запустить ffmpeg.exe с сайта Standart среды. Несмотря на то, что все еще фантомы и даже сам хромидра не работают. Однако я могу успешно запустить драйвер Firefox. Для этого

Я скопировал последний каталог firefox с моего локального сайта и на веб-сайт, а ниже код работал хорошо.

var binary = new FirefoxBinary("/websitefolder/blabla/firefox.exe"); 
var driver = new FirefoxDriver(binary, new FirefoxProfile()); 
driver.Navigate().GoToUrl("http://www.google.com"); 
+0

Я получаю «Не удалось запустить сокет в течение 45000 мс. Попытался подключиться к следующим адресам: 127.0.0.1:7055» при запуске вашего кода в Azure Web Job. Какие-либо предложения? – jimbo

+0

Я не использовал его в Azure Web Job ... просто попробуйте его в среде веб-сайта. – Freshblood

+0

Просто попробовал это в среде веб-сайта. Я получаю сообщение об ошибке: «System.Net.Sockets.SocketException: попытка получить доступ к сокету запрещена правами доступа» – jimbo

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