2

我正在使用 C# WebClient 将登录详细信息发布到页面并阅读所有结果。

我要加载的页面包括 flash(在浏览器中,它会转换为 HTML)。我猜它是为了避免被搜索引擎收录而闪现???

我感兴趣的 Flash 只是文本(不是图像/视频)等,当我在 Firefox 中“查看选择源”时,我确实在 HTML 中看到了我想看到的文本。

(有趣的是,当我查看整个页面的源代码时,我在 HTML 中看不到我想看到的文本。这可能是相关的吗?)

目前,在我发布了我的登录详细信息并重新加载了 HTML 之后,我看到了不显示 flash HTML 的页面(就像我查看了整个页面的源代码一样)。

提前致谢,

吉姆

PS:我应该指出POST实际上是有效的,我的登录是成功的。

4

2 回答 2

9

Fiddler(或类似工具)对于追踪这样的屏幕抓取问题非常有用。使用普通浏览器并激活 fiddler,查看在登录和导航过程中发出的所有请求以获取所需数据。在这两者之间,您可能会看到您的代码执行的一项或多项操作与服务器响应不同,从而向您显示与真实客户端不同的 HTML。

下面的内容列表(将其视为“抓取 101”)是您要查找的内容。下面的大部分内容可能是您已经在做的事情,但为了完整起见,我将所有内容都包括在内。

为了有效地抓取,您可能需要处理以下一项或多项:

  1. cookie 和/或隐藏字段。当您出现在站点上的任何页面时,您通常会得到一个会话 cookie 和/或隐藏的表单字段,这些字段(在普通浏览器中)将在所有后续请求中传播回服务器。您可能还会获得一个持久性 cookie。在许多站点上,如果请求显示时没有正确的 cookie(或使用“无 cookie 会话”的站点的表单字段),该站点会将用户重定向到“无 cookie”用户界面、登录页面或其他不需要的位置(来自刮板应用程序的视角)。始终确保捕获在初始请求中设置的 cookie,并在后续请求中忠实地将它们发送回服务器,除非其中一个后续请求更改了 cookie(在这种情况下,改为传播该新 cookie)。
  2. 身份验证令牌上面的一个特例是表单身份验证 cookie 或隐藏字段。确保您正在捕获登录令牌(通常是 cookie)并将其发回。
  3. POST 与 GET这很明显,但请确保您使用的是与真实浏览器相同的 HTTP 方法。
  4. 表单字段(尤其是隐藏字段!)我确定您已经这样做了,但请确保发送真实浏览器所做的所有表单字段,而不仅仅是可见字段。确保字段正确地进行了 HTML 编码。
  5. HTTP 标头。您已经检查了这一点,但再次检查以确保(非 cookie)标头相同可能是有意义的。我总是从完全相同的 headers 开始,然后开始一个一个地拉出 headers,只保留导致请求失败或返回虚假数据的 headers。这种方法简化了您的抓取代码。
  6. 重定向。这些可以来自服务器,也可以来自客户端脚本(例如“如果用户没有加载 Flash 插件,则重定向到非 Flash 页面”)。请参阅WebRequest:如何使用针对此 ContentType="application/xhtml+xml, text/xml, text/html; charset=utf-8" 的 WebRequest 查找邮政编码?有关重定向如何绊倒屏幕刮板的疯狂示例。请注意,如果您使用 .NET 进行抓取,则需要使用 HttpWebRequest(而不是 WebClient)进行依赖于重定向的抓取,因为默认情况下 WebClient 不会为您的代码提供将 cookie 和标头附加到第二个的方法(重定向后)请求。有关更多详细信息,请参阅上面的线程。
  7. 子请求(框架、ajax、flash 等) ——通常,页面元素(不是主要的 HTTP 请求)最终会获取您想要抓取的数据。您将能够通过查看哪个 HTTP 响应包含您想要的文本来弄清楚这一点,然后向后工作,直到您找到页面上实际发出对该内容的请求为止。一些网站在子请求中做了非常疯狂的事情,比如通过 ajax 请求压缩或加密的文本,然后使用客户端脚本对其进行解密。如果是这种情况,您将需要做更多的工作,例如逆向工程客户端脚本正在执行的操作。
  8. 排序- 这一点很明显:按照浏览器客户端的相同顺序发出 HTTP 请求。这并不意味着您需要提出每个请求(例如图像)。通常,您只需要发出返回 text/html 内容类型的请求,除非您想要的数据不在 HTML 中并且在 ajax/flash/etc 中。要求。
于 2009-10-05T17:15:59.947 回答
0

(有趣的是,当我查看整个页面的源代码时,我在 HTML 中看不到我想看到的文本。这可能是相关的吗?)

这通常意味着差异是由页面加载后通过 javascript 进行的一些 DOM 操作引起的。尝试关闭 javascript 并查看它的外观。

于 2009-10-05T17:25:50.597 回答