【问题标题】:Web scraping attempt at website with flash plugin使用 Flash 插件在网站上进行网络抓取尝试
【发布时间】:2013-06-07 23:54:33
【问题描述】:

我正在尝试抓取一个网站,该网站具有某种 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 数据。客户端上没有脚本可以引起我可以看到的刷新。我不明白是什么导致了这个更新。

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

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

谢谢。 JM.

【问题讨论】:

    标签: c# httpwebrequest web-scraping httpwebresponse shockwave


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我发现我可以在链接中添加一个参数,以便在将其发送给我之前加载此信息。我已将此答案标记为正确,因为这是我开始最终解决方案的过程,尽管所有答案都非常有帮助,谢谢大家:)
      【解决方案3】:

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

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

      • 套接字
      • HTTP GET
      • HTTP POST

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

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

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

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

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

      【讨论】:

      • 是的,我相信我可以骗过它,我只需要先了解它的工作原理。我更新了这个问题,因为我不认为 flash 对象是问题,它只是一个加载动画。谢谢:)
      • 无论如何,无论谁发出请求,都会通过 TamperData 或 Firebug。注意隐藏的 iFrame。您必须将此原则应用于任何 http 请求。会话状态是最难欺骗的,但它是可能的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      相关资源
      最近更新 更多