有没有办法用 Actionscript 抓取网页???我收到一个安全错误

Posted

技术标签:

【中文标题】有没有办法用 Actionscript 抓取网页???我收到一个安全错误【英文标题】:Is there a way to grab a webpage with Actionscript??? I get a SecurityError 【发布时间】:2010-07-11 07:27:34 【问题描述】:

我正在尝试使用 actionscript 抓取网页,但不断收到此错误(尝试抓取 github.com 的示例):

[SWF] /get-webpage.swf - 解压后 2,708 字节 错误:请求者从 http://github.com 请求资源 http://localhost:4567/get-webpage.swf 由于缺少策略文件权限而被拒绝。

* 违反安全沙盒 * 与http://github.com 的连接已停止 - 不允许来自http://localhost:4567/get-webpage.swf

有什么方法可以在 Actionscript 中实现这一点? crossdomain.xml 文件是如何发挥作用的?据我了解,网站将crossdomain.xml 放在其根目录下,指定 swf 可以访问其内容。那是对的吗?我需要做什么才能完成上述工作?我正在使用的代码基本上是这样的:

var request:URLRequest = new URLRequest("http://github.com")
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, complete);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, error);
loader.load(request);

function complete(event:Event):void 
  trace(event.target.data);


function error(event:SecurityErrorEvent):void 
  trace(event.text);

html 文件中添加:

var flashvars = ;
var params = allowscriptaccess: "always";
var attributes = id: "my_flash", name: "my_flash";
swfobject.embedSWF("/get-webpage.swf", "flash_content", "50%", "50%", "10.0.0", "playerProductInstall.swf", flashvars, params, attributes, swfHasLoadedSir);

是否有可能绕过该安全错误?

【问题讨论】:

【参考方案1】:

简短的回答,不。

中等答案,没有。 我看到 github 这里有一个跨域 xml 策略。 https://github.com/crossdomain.xml

这是 Flash 在尝试从另一个域获取内容时自动加载的文件。

这个xml文件是说,只允许github上的flash去吸数据。所以github已经明确表示他们不希望你使用flash来加载他们的任何内容。

<?xml version="1.0" encoding="UTF-8"?>
<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
  <allow-access-from domain="github.com" />
    <allow-access-from domain="gist.github.com" />
    <site-control permitted-cross-domain-policies="master-only"/>
</cross-domain-policy>

我认为这种 flash 行为的原因是人们 + 公司会信任 flash。我认为这种机制可以防止大规模的 DOS 攻击(想想在新闻网站上加载的 Flash 横幅,比如 github,它可能会导致大量负载)。

您可以向 github 发送电子邮件并将您的域添加到他们在跨域文件中的列表中,但这可能需要一些时间和大量的政治。

长答案,是的。 您可以使用 php 或其他东西创建一个 HTTP 代理来拉入网页。 PHP 或代码必须在您加载 SWF 文件时在同一个域上运行。例如 youdomain.com/folder/proxy.php 。您基本上必须要求此代理以 PHP 获取您的网页并将结果返回到 Flash。整个过程有点痛苦,尤其是当您使用必须发送参数或 HTTP 标头的 Web 服务时。网上有开源的PHP代理文件可以安装。

祝你好运!回到与梅根福克斯一起看变形金刚2。哦对了。

【讨论】:

是的。在这种情况下,请使用代理(PHP、BlazeDS 或 Apache 都可以正常工作)。跨域策略可能会使网站面临严重的安全威胁:jamesward.com/2009/11/08/… 是的,这是正确的答案。只是你没有解释为什么。它是防止这种情况发生的同源政策。

以上是关于有没有办法用 Actionscript 抓取网页???我收到一个安全错误的主要内容,如果未能解决你的问题,请参考以下文章

用Python 抓取的UTF8网页无法decode('utf-8')

Python抓取网页数据的终极办法!你值得拥有!

网页抓取具有动态 javascript 内容的网站

抓取js动态生成数据

如何用Java抓取网页的具体内容

使用 R 从网页中抓取可下载文件的链接地址?