C#WebClient - 查看源代码问题

时间:2009-09-24 11:21:00

标签: c# winforms httpwebrequest screen-scraping webclient

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

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

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

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

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

提前致谢,

吉姆

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

2 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:0)

  

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

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