网页抓取尝试在网站与flash插件



我试图刮一个网站,其中有某种flash插件,这是加载数据后,我检索html。在页面

中接收到以下对象
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="250" HEIGHT="20" id="Preloader"><PARAM NAME="movie" VALUE="/images/preloader.swf">
      <PARAM NAME="quality" VALUE="high">
      <PARAM NAME**strong text**="bgcolor" VALUE="#FFFFFF"><EMBED src="/images/preloader.swf" quality="high" bgcolor="#FFFFFF" WIDTH="250" HEIGHT="20" NAME="Preloader" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED></OBJECT>

我试图定位在wireshark上收到的数据,但没有运气。我对这个flash插件或它是如何工作的知识是零。我猜最坏的情况是我不能做这件事。

HttpWebRequest mainRequest = (HttpWebRequest)(WebRequest.Create(URL));
            mainRequest.Method = "GET";
            mainRequest.Proxy = null;
            WebResponse mainResponse = mainRequest.GetResponse();
            StreamReader dataReader = new StreamReader(mainResponse.GetResponseStream(), System.Text.Encoding.UTF8);
            string data = dataReader.ReadToEnd();
            dataReader.Close();
            mainResponse.Close();
            return data;

是否有人知道一种方式,我可以接收这个数据或使webresponse等待数据被注入到html之前,它被接收。任何帮助都将非常感激。

更新:看来我对闪光物体有点操之过急了。我想这只是表格填充时的加载动画。我一直在用fiddler来看看发生了什么。页面在请求后返回,其中包含一个加载div和flash对象。几秒钟后,当数据准备好时,将返回另一个包含数据的页面。从我能记住的(我不在家所以不能确认现在),新的页面有相同的请求头作为原来的。fiddler中没有json或ajax数据。客户端没有脚本导致刷新,我可以看到。我不明白是什么导致这个更新。

我简要地看了一下web浏览器对象,但我想当我抓取大约200个页面时,这将是相当大的性能打击,目前需要一分钟左右。我稍后将尝试amf查看器以确认flash对象不是更新的源。

我猜服务器在表准备好时导致重新发送此页面。如果服务器找到了加载div并将其替换为数据表,这是否会导致整个页面重新发送?或者这不会在ajax/json数据中显示?如果是服务器重新发送数据,我如何保持响应打开,直到它准备好发送新页面?

谢谢。JM。

如果内容是动态加载到Flash影片中,它很可能是通过标准的HTTP请求发生的。钢丝鲨可能有点过度检测这种东西。我建议使用捕获HTTP的实用程序,如Charles、HttpFox或screen-scraper。使用其中一个工具,观察内容加载时发生的HTTP请求。一旦你确定了它是哪个请求,你就可以在你的代码中复制它。

也就是说,我也见过这样的情况(虽然不是很常见),即加载到Flash影片中的数据是通过二进制协议完成的,这使得事情变得更加困难。AMF通常是在这些情况下使用的协议。Charles代理将检测此协议,因此在这种情况下可能会使用该工具。不久前,我写了一篇关于提取通过AMF传递的数据的博文。它处理的是一个Java库,但你也可以在。net中找到类似的东西。

您将无法使用普通的HttpWebRequest,因为Flash内容没有运行。您得到的响应只是HTML。它需要浏览器(或类似浏览器的对象)来实际执行、加载该对象并拉下内容。我知道有执行Javascript的库,但我不知道有什么可以让你在浏览器外运行Flash插件。

你最好使用一个WebBrowser对象。但是,即使它将执行Flash内容(老实说,我不知道它是否会),您也可能无法访问它。您必须查看DOM并查看

使用Firebug和/或TamperData,像往常一样用flash加载页面,并等待flash生成HTTP POST/GET来获取数据。

Flash有三个获取数据的选项:

  • 套接字
  • HTTP GET
  • HTTP POST

你随时都可以骗过这件事。只需要确保你的请求包含所有这些小的东西:

    方法(GET或POST)<
  • 饼干/gh>
  • 表单值(为什么?会话状态,例如)
  • URL引用
  • 用户代理
  • 自定义http头吗?(有些人可能会把这个放在HTTP请求中,所以没有人可以"愚弄"服务器)

这可能使响应与默认的html错误页面的数据有所不同。

最后一点:如果内容是通过HTTPS传递的,那么,不用担心,它只是一个额外的层,但仍然是可能的。

如果内容是通过套接字传递的,那么忘记它。

最新更新