从网站加载内容到MATLAB,包括内部框架(iframe)

3
我正在使用MATLAB中的urlread函数加载网站内容,并搜索其中的信息。
然而,我遇到了一个特殊情况:所需的内容位于嵌入在index.php文件中的内部框架中,该框架通过<iframe>实现。
当我将urlread与似乎嵌入在主文件中的文件的URL一起使用时,我仍然只能获取index.php的内容,而不是targetframecontent.php的内容。
我猜urlread可能不是这个问题的正确解决工具,或者我可能忽略了其他使我的尝试不成功的事情。是否有办法将这样一个内部框架的内容获取到MATLAB中呢?
编辑:更详细地说,
我通常使用以下代码将网站内容读入到MATLAB工作区中:
data = urlread('http://[...]index.php')

但是这样做,我只能获取父级index.php的内容,而不能获取嵌入的targetframecontent.php的内容。当我查看网站源代码时,发现了这一点,因为我感兴趣的网站部分加载到一个框架中:

<iframe src="http://[...]targetframecontent.php" width="850px" height="1000px" border="0" frameborder="0"></iframe>

因此,我尝试直接使用urlread和加载在特定目标框架中的url。但是,当我这样做时,我仍然得到与加载index.php相同的内容。因此,每当我尝试使用targetframecontent.php的直接url时,似乎会将urlread重定向回index.php。当我尝试在浏览器中加载targetframecontent.php时也是如此。谢谢任何帮助。

urlread 会获取您提供的任何URL。如果您在浏览器中打开iframe的URL,能够获取嵌入式内容吗?如果无法预测“targetframecontent.php”的URL,您需要手动解析<iframe>目标。MATLAB可能不是处理这种任务的最佳语言... 你可以使用其他语言下载内容并将其手动馈入MATLAB吗? - Taj Morton
如果我打开目标框架的 URL,仍然会进入主 index.php 页面。看起来我被自动重定向到那里了。 - abel
你能分享一下你正在尝试提取信息的页面的URL吗?还是它是内部的?听起来他们在做一些诡计。 - Taj Morton
exp 是一个例子。 - abel
1个回答

4

看起来,被访问的网站检查了HTTP请求的来源。如果使用wget,可以通过传递--referer选项来下载<iframe>

$ wget --referer="http://www.sf.tv/sfmeteo/lokalprognosen/index.php?q=Gen%C3%A8ve" -O test_ref "http://www.sf.tv/sfmeteo/lokalprognosen/detailprognose.php?id=&q=Gen%C3%A8ve&max=&drs=0&kiosk=&js=&deeplink=&f="
$ cat test_ref
[...]
<body class="sf">

<!-- referrer:http://www.sf.tv/sfmeteo/lokal -->

    <script type="text/javascript"> <!-- 
        var keineprognose = '0'; 
        // -->
    </script>   


<p class="inv">
    <a href="#anker_cm">zum Inhalt</a><br />
</p>

然而,如果你使用wget时没有发送引用者信息,你会得到以下结果:
wget -O test_noref "http://www.sf.tv/sfmeteo/lokalprognosen/detailprognose.php?id=&q=Gen%C3%A8ve&max=&drs=0&kiosk=&js=&deeplink=&f="
 <body class="sf" role="application">

<p class="inv">
    <a href="#anker_cm">zum Inhalt</a><br />
</p>
<!--googleoff: all-->    <div id="HEADWRAP" class="sf-header">
  <div class="INNERWRAP">
    <h1 class="inv">SF Schweizer Fernsehen - Navigation</h1>

这是原始的、父页面。

所以,要将其导入MATLAB中,您需要设置Referer HTTP头信息。不幸的是,我现在手头没有MATLAB,但是此页面似乎提供了如何在MATLAB HTTP请求中发送头信息的好介绍:http://undocumentedmatlab.com/blog/expanding-urlreads-capabilities/

编辑:因为那个页面上并不是非常明显,所以在这里提供一个链接到urlread2函数的链接,其中还包括一些示例:http://www.mathworks.com/matlabcentral/fileexchange/35693-urlread2/content/urlread2.m


2
谢谢!我花了一些时间才弄清楚该做什么,但经过几次尝试,最终成功了。这是我最终如何使用urlread2及其辅助函数http_createHeader的方法:header = http_createHeader('referer', 'http://www.sf.tv/sfmeteo/lokalprognosen/index.php?q=Gen%C3%A8ve') data = urlread2('http://www.sf.tv/sfmeteo/lokalprognosen/detailprognose.php?q=Gen%C3%A8ve','', '', header) - abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接