C#WebClient – 查看源代码问题

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

我试图加载的页面包括flash(在浏览器中,它转换为HTML)。 我猜它是闪存避免被搜索引擎捡起来???

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

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

目前,在我发布了我的登录详细信息并将HTML加载回来后,我看到的页面没有显示flash HTML(好像我已经查看了整个页面的源代码)。

提前致谢,

吉姆

PS:我应该指出POST实际上正在运行,我的登录成功。

Fiddler (或类似工具)非常有助于追踪像这样的屏幕抓取问题。 使用普通浏览器并使用fiddler激活,查看在您完成登录和导航过程时所做的所有请求,以获取所需的数据。 在这两者之间,您可能会看到一个或多个事物,您的代码正在以不同的方式执行服务器响应,因此显示的HTML与真实客户端不同。

下面的内容列表(将其视为“抓101”)是您想要寻找的。 下面的大部分内容可能都是你已经在做的东西,但我把所有内容都包含在内。

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

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

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

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