代码之家  ›  专栏  ›  技术社区  ›  BIDeveloper

C WebClient-查看源代码问题

  •  2
  • BIDeveloper  · 技术社区  · 15 年前

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

    我试图加载的页面包括Flash(在浏览器中,它转换为HTML)。我猜这是为了避免被搜索引擎抓到????

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

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

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

    事先谢谢,

    吉姆

    PS:我要指出的是,这篇文章确实有效,我的登录是成功的。

    2 回复  |  直到 11 年前
        1
  •  8
  •   Community CDub    7 年前

    Fiddler (或类似的工具)对于跟踪这样的屏幕刮擦问题是非常有价值的。使用普通浏览器并激活fiddler,在登录和导航过程中查看所有请求,以获取所需的数据。在这两者之间,您可能会看到一个或多个代码所做的事情与服务器响应的方式不同,因此显示的HTML与真实客户机不同。

    下面列出的东西(把它看作是“刮101”)是你想要寻找的。下面的大部分内容可能是你已经做过的,但为了完整起见,我把所有内容都包括在内。

    为了有效地刮除,您可能需要处理以下一个或多个问题:

    1. cookies和/或隐藏字段。 当您出现在站点上的任何页面上时,通常会得到一个会话cookie和/或隐藏的表单字段,该字段(在普通浏览器中)会在所有后续请求时传播回服务器。你可能还会得到一个持久的cookie。在许多站点上,如果一个请求没有合适的cookie(或使用“无cookie会话”的站点的表单字段)出现,那么该站点会将用户重定向到“无cookie”用户界面、登录页面或其他不需要的位置(从scraper应用程序的角度来看)。始终确保捕获在初始请求上设置的cookie,并在后续请求上如实地将其发送回服务器,除非其中一个后续请求更改了cookie(在这种情况下,传播新的cookie)。
    2. 身份验证令牌 上面的一个特殊情况是表单认证cookie或隐藏字段。确保您捕获了登录令牌(通常是cookie)并将其发送回。
    3. POST与VET 这很明显,但要确保使用的HTTP方法与真正的浏览器相同。
    4. 表单域(特别是隐藏域!) 我肯定你已经在做了,但是一定要把 全部的 真正的浏览器所做的表单字段,而不仅仅是可见字段。确保字段的HTML编码正确。
    5. HTTP报头。 您已经检查过这个,但是再次检查可能有意义,只是为了确保(非cookie)头是相同的。我总是从完全相同的报头开始,然后逐个拉出报头,并且只保留那些导致请求失败或返回虚假数据的报头。这种方法简化了您的抓取代码。
    6. 重定向。 这些可以来自服务器,也可以来自客户机脚本(例如,“如果用户没有加载闪存插件,请重定向到非闪存页”)。见 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和头附加到第二个(post redirect)请求的方法。有关详细信息,请参阅上面的线程。
    7. 子请求(帧、Ajax、Flash等) -通常,页面元素(而不是主要的HTTP请求)最终会获取您想要获取的数据。您可以通过查看哪个HTTP响应包含您想要的文本来确定这一点,然后向后工作,直到您发现页面上的内容实际上正在请求该内容为止。一些站点在子请求中做了非常疯狂的事情,比如通过Ajax请求压缩或加密的文本,然后使用客户端脚本对其进行解密。如果是这样的话,您需要做更多的工作,比如逆向工程客户端脚本正在做什么。
    8. 订购 -这一点很明显:按照浏览器客户机的相同顺序发出HTTP请求。这并不意味着你需要 每一个 请求(例如图像)。通常,您只需要发出返回文本/HTML内容类型的请求,除非您想要的数据不在HTML中并且在Ajax/Flash/etc.请求中。
        2
  •  0
  •   recursive    15 年前

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

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