iframe 内的 JavaScript。用watir刮擦

问题描述 投票:0回答:1

我正在尝试找出 WATIR。 这是一个情况。我想监控几个网站中的广告,但抓取它们并不是一件容易的事,因为它们位于 iframe 中,然后还有另一个用 javascript 生成的 iframe 链接。然后才会出现我想要获得的页面。

这是主页中的代码:

<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?

我已经找了好几天了。开始使用 selenium,然后使用 c# 进行 htmunit,然后尝试使用 python 进行机械化,但无法达到想要的结果。

我一直在跳。我终于认为通过 WATIR 一定能够实现我想要的目标。 我需要一些帮助才能完成这件事。有小费吗?

javascript web-scraping watir
1个回答
1
投票

脚本创建的框架的ID是“adbleft”而不是“adleft”,这可能是你的问题

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

如果最终帧的 id 不是静态的,您可能必须通过索引来选择它

browser.frame(:id => "adbottomleft").frame(:id => "adbleft").frame(:index => 0)
© www.soinside.com 2019 - 2024. All rights reserved.