0

我正在尝试抓取一个网站,该网站具有某种 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 的方法。任何帮助将不胜感激。

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

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

我猜测服务器在准备好表格时会导致重新发送此页面。如果服务器正在查找加载 div 并将其替换为数据表,这会导致整个页面被重新发送吗?或者这不会出现在 ajax/json 数据中吗?如果是服务器重新发送数据,我怎样才能保持响应打开,直到它准备好发送新页面?

谢谢。JM。

4

3 回答 3

1

如果内容被动态加载到 Flash 影片中,则很可能是通过标准 HTTP 请求发生的。Wire Shark 对于检测这样的东西可能有点矫枉过正。我建议使用能够捕获 HTTP 的实用程序,例如 Charles、HttpFox 或 screen-scraper。使用其中一种工具,观察加载内容时发生的 HTTP 请求。一旦确定是哪个请求,您就可以在代码中复制它。

也就是说,我还看到了一些案例(虽然不是很常见),加载到 Flash 电影中的数据是使用二进制协议完成的,这使事情变得更加困难。AMF 通常是在这些情况下使用的协议。Charles 代理会检测到这个协议,所以这可能是在这种情况下使用的工具。不久前,我写了一篇关于提取通过 AMF 传递的数据的博文。它处理 Java 库,但您可以在 .NET 中找到等效的东西。

于 2013-06-12T21:19:19.593 回答
0

HttpWebRequest由于 Flash 内容没有运行,您将无法使用纯文本执行此操作。您得到的响应只是 HTML。它需要一个浏览器(或类似浏览器的对象)来实际执行、加载该对象并下拉内容。我知道有用于执行 Javascript 的库,但我不知道任何可以让您在浏览器之外运行 Flash 插件的东西。

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

于 2013-06-12T02:08:10.850 回答
0

使用 Firebug 和/或 TamperData,像往常一样使用 Flash 加载您的页面,然后等待 Flash 发出 HTTP POST/GET 以获取数据。

Flash 提供三种获取数据的选项:

  • 插座
  • HTTP 获取
  • HTTP POST

你可以在任何一天愚弄这件事。只需确保您的请求包含所有这些小东西:

  • 方法(GET 或 POST)
  • 饼干
  • 表单值(为什么?例如会话状态)
  • 网址引荐来源网址
  • 用户代理
  • 自定义 HTTP 标头?(有些人可能会将它放在 HTTP 请求中,因此没有人可以“欺骗”服务器)

这可能会使带有数据的响应成为默认的 html 错误页面。

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

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

于 2013-06-13T11:12:26.630 回答