2012-02-29 7 views
2

Я пытаюсь выяснить WATIR. Вот ситуация. Я хочу отслеживать рекламу на нескольких сайтах, но очищать их нелегко, потому что они находятся в iframe, тогда есть еще одна ссылка iframe, которая создается с помощью javascript. Только тогда приходит страница, которую я хотел бы получить.Javascript внутри iframe. Скребок с watir

Вот код на главной странице:

<iframe width="300" height="250" scrolling="no" frameborder="0" 
id="adbottomleft" src="/ad/left1" name="adbottomleft"></iframe> 

Вот что IFrame говорит:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title></title> 
<style type="text/css"> 

body { 
    background-color: black; 
    margin:0; 
    padding:0; 
}</style> 
</head> 
<body> 
<!-- Rubicon Project Tag --> 
<!-- Site: MangaReader Zone: ROS_BTF_LEFT Size: Medium Rectangle --> 
<div id="adfooter" style="width:300px;height:250px;"></div> 
<script language="JavaScript" type="text/javascript"> 
function tl(){ 
    var loaded = 0; 
    try { 
     loaded = parent.document['adver']; 
    } catch(e) { loaded = 0; } 
    if (loaded != 1) { 
     setTimeout(tl, 25); 
    } else { 
      var dest = document.getElementById('adfooter'); 
      var lframe = document.createElement('iframe'); 
      lframe.setAttribute('id','adbleft'); 
      lframe.setAttribute('width','300'); 
      lframe.setAttribute('height','250'); 
      lframe.setAttribute('scrolling','no'); 
      lframe.setAttribute('frameborder', '0'); 
      lframe.setAttribute('src', 'http://ad.mangareader.net/btleft1'); 
      dest.appendChild(lframe); 
    } 
} 
(function(){ 
tl(); 
}()); 
</script> 
</body> 
</html> 

Это делает генерировать другой IFRAME, который выглядит следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title></title> 
<style type="text/css"> 
       * { 
      margin:0; 
      padding:0; 
     } 
     body { 
      margin-left: 0px; 
      margin-top: 0px; 
     } 
     </style> 
</head> 
<body> 
<!-- Rubicon Project Tag --> 
<!-- Site: MangaReader Zone: ROS_BTF_LEFT Size: Medium Rectangle --> 
<script language="JavaScript" type="text/javascript"> 
var cb = Math.random(); 
var d = document; 
var iframe = "&fr=" + (window != top); 
var ref = ""; 
try { 
    if (window != top) { 
     ref = "&rf="+escape(d.referrer); 
    } 
} catch (ignore) { } 
d.write("<iframe id='25504.15' name='25504.15' src='' framespacing='0' frameborder='no' scrolling='no' align='middle' width='300' height='250' marginheight='0' marginwidth='0'></iframe>"); 
d.getElementById('25504.15').src='http://optimized-by.rubiconproject.com/a/8240/13310/25504-15.html?cb='+cb+ref; 
</script> 
</body> 
</html> 

Только тогда наступает заключительная страница, которую мне интересно соскрести.

<html> 
    <head> 
    <meta http-equiv="Pragma" content="no-cache"> 
    <meta http-equiv="expires" content="0"> 
    <style type="text/css"> body {margin:0px; padding:0px;} </style> 
    <script type="text/javascript"> 
     rubicon_cb = Math.random(); rubicon_rurl = document.referrer; if(top.location==document.location){rubicon_rurl = document.location;} rubicon_rurl = escape(rubicon_rurl); 
     window.rubicon_ad = "3260765" + "." + "js"; 
     window.rubicon_creative = "3299047" + "." + "js"; 
    </script> 
    </head> 
    <body> 

<a href="http://optimized-by.rubiconproject.com/t/8240/13310/25504-15.3260765.3299047?url=http%3A%2F%2Fwww.animepremium.net" target="_blank"><img src="http://assets.rubiconproject.com/campaigns/100/91/16/5/1325630095ap_300.jpg" border="0" alt="AnimePremium.net" /></a><script defer="defer" type="text/javascript"> 
{ 
    if (Math.floor(Math.random()*100) < 1) 
    { 
     var url; 
     var iframe = (window != top); 
     url = "http://tap.rubiconproject.com/stats/iframes?pc=8240/13310&ptc=25504&upn="+iframe; 
     setTimeout(function(){ new Image().src = url }, 1000); 
    } 
} 
</script> 
<script>var _comscore = _comscore || []; _comscore.push({ c1: "8", c2: "6135404", c3: "28", c4: "13310", c10: "3299047" }); (function() { var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true; s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js"; el.parentNode.insertBefore(s, el); })();</script><DIV STYLE="height:0px; width:0px; overflow:hidden"><IFRAME SRC="http://tap2-cdn.rubiconproject.com/partner/scripts/rubicon/emily.html?rtb_ext=1&pc=8240/13310&geo=eu" FRAMEBORDER="0" MARGINWIDTH="0" MARGINHEIGHT="0" SCROLLING="NO" WIDTH="0" HEIGHT="0" style="height:0px; width:0px"></IFRAME></DIV> 
    </body> 
</html> 

Невозможная задача?

вот что я делаю.

irb 
require "watir-webdriver" 
browser = Watir::Browser.new :ff 
browser.goto "mangareader.net" 
browser.frame(:id, "adbottomleft").html - Works! 

Если я хочу, чтобы получить еще один слой вниз, я получаю ошибку

irb 
require "watir-webdriver" 
browser = Watir::Browser.new :ff 
browser.goto "mangareader.net" 
browser.frame(:id, "adbottomleft").frame(:id, "adleft").html -> Don't work. 

Элемент принадлежит другой кадр, чем текущая - переключение на нее, содержащей раму, чтобы использовать его. Что нужно изменить во втором коде, чтобы прочитать следующий iframe?

Я искал дни. Начал с селена, затем htmunit с C#, затем попробовал механизировать с помощью python, но не смог добиться желаемых результатов.

Я продолжаю прыгать. Наконец-то я подумал, что смогу добиться того, чего хочу от WATIR. Мне нужна помощь, чтобы сделать это. Какие-нибудь советы?

+1

Я бы порекомендовал вам начать с меньшего количества с помощью нескольких сценариев концептуальной концепции, чтобы ознакомиться с WATIR. browser.html выплевывает HTML-страницу страницы. Он делает то, что он должен был сделать. Watir/Watir-Webdriver может абсолютно выполнить то, что вы просите, в нескольких строках кода, но сначала вам нужно фундаментальное понимание библиотеки. –

ответ

1

Идентификатор кадра, созданного сценария «adbleft» не «adleft», которые могли бы быть ваша проблема

browser.frame(:id => "adbottomleft").frame(:id => "adbleft").html 

Если идентификатор последнего кадра не является статическим, вы, возможно, придется выбрать его по индексу

browser.frame(:id => "adbottomleft").frame(:id => "adbleft").frame(:index => 0) 
+0

Да, это сработало! И спасибо за наконечник индекса. Это поможет мне! – user1237898

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