使用Flash插件在网站上进行网络抓取尝试

时间:2013-06-12 00:18:43

标签: c# httpwebrequest web-scraping httpwebresponse shockwave

我正在尝试抓一个网站,它有一些闪存插件,在我检索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。

3 个答案:

答案 0 :(得分:1)

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

也就是说,我也看过加载到Flash电影中的数据是用二进制协议完成的情况(尽管不是很常见),这使得事情变得更加困难。 AMF通常是这些情况下使用的协议。 Charles代理将检测此协议,因此这可能是在这种情况下使用的工具。前段时间我在extracting data that's delivered via AMF写了一篇博客文章。它处理Java库,但您可以在.NET中找到相同的东西。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用Firebug和/或TamperData,像往常一样使用闪存加载页面,并等待Flash进行HTTP POST / GET以获取数据。

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

  • 套接字
  • HTTP GET
  • HTTP POST

你可以随时愚弄这件事。只需确保您的请求包含所有这些小事:

  • 方法(GET或POST)
  • 缓存
  • 表单值(为什么?会话状态,例如)
  • 网址推荐人
  • 用户代理
  • 自定义HTTP标头? (有些人可能会把这个放在HTTP请求中,所以没人能“欺骗”服务器)

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

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

如果内容是通过套接字传递的,那就算了。