C#WebClient - 查看源代码问题

BID*_*per 2 c# screen-scraping webclient httpwebrequest winforms

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

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

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

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

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

提前致谢,

吉姆

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

Jus*_*ant 9

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

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

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

  1. 饼干和/或隐藏的字段.当您在网站上的任何页面上显示时,您通常会获得会话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:如何使用针对此ContentType的WebRequest查找邮政编码="application/xhtml + xml,text/xml,text/html; charset = utf-8"?一个关于重定向如何绊倒屏幕刮板的疯狂例子.请注意,如果您使用.NET进行抓取,则需要使用HttpWebRequest(而非WebClient)进行与重定向相关的抓取,因为默认情况下,WebClient不会为您的代码提供将Cookie和标头附加到第二个的方法(重定向后)请求.有关详细信息,请参阅上面的主题.
  7. 子请求(帧,ajax,flash等) - 通常,页面元素(不是主HTTP请求)将最终获取您想要抓取的数据.你可以通过查看哪个HTTP响应包含你想要的文本来解决这个问题,然后再向后工作,直到你发现页面上的内容实际上是在发出对该内容的请求.一些网站在子请求中做了很多疯狂的事情,比如通过ajax请求压缩或加密的文本,然后使用客户端脚本来解密它.如果是这种情况,您需要做一些更多的工作,比如逆向工程客户端脚本正在做什么.
  8. 排序 - 这个很明显:以与浏览器客户端相同的顺序发出HTTP请求.这并不意味着您需要提出每个请求(例如图像).通常,您只需要发出返回text/html内容类型的请求,除非您想要的数据不在HTML中并且位于ajax/flash/etc中.请求.