使用Web浏览器保存页面源与C#中的HttpWebRequest类

时间:2009-10-03 22:25:36

标签: c# httpwebrequest

当我从IE保存网页源时,它与我在C#app中由HttpWebRequest下载的源不同。

我保存了两个文件以供参考。从IE保存的是here,HttpWebRequest保存的是here

它们在格式化和内容本身方面有所不同。似乎HttpWebRequest下载的那个被破坏了,并且不包含有效数据(从IE保存时非常完美)。

我不知道为什么我无法使用IE实现良好的格式化源。

Reagrds 马里乌什

3 个答案:

答案 0 :(得分:1)

我怀疑使用IE下载的那个已经通过手动访问该站点时设置的cookie或会话变量获得了与之关联的状态。使用C#下载的那个将具有所有内容的默认值,因此具有不同的内容。

这很可能是因为file_web文件包含一个名为“LastViewedHotels”的部分,其中包含Arora Manchester的条目。

此外,看起来有用于显示广告的动态内容,这两个文件之间有所不同。

答案 1 :(得分:1)

通常,当您导航到的网站通过Ajax或框架加载其他内容时会发生这种情况。

要解决此问题并始终获取IE看到的内容,您可以使用WebBrowser控件导航并从中获取源。

这是一个 Example

答案 2 :(得分:1)

更新

通过在你提供的资源上运行KDiff,看起来有一个主要的差异:

<link rel="alternate" type="text/html" hreflang="de"...

看起来它有一个从会话(cookie)生成的ID,所以如果不复制IE cookie标题,你就无法做到这一点。

以前的回答

“引擎盖下”,IE和HttpWebRequest都执行相同的简单任务,即通过套接字将端口80上的以下文本请求发送到HTTP服务器:

  

GET / HTTP / 1.1

(或1.0 - 以及主机标题)。

如果你在Windows上,你可以尝试一下。安装内置的Windows telnet客户端(添加/删除程序 - > windows功能)或putty然后键入:

  

GET / HTTP / 1.1(换行符)
  主持人:yahoo.com

来自这个,IE和HttpWebRequest类的源将完全相同。如果IE将cookie传递给服务器,以及通常包括的任何额外标头,唯一的区别就在于:

  • 用户代理
  • 接受*/*
  • Gzip已
  • Cookie或会话变量(包括会话变量 - 在IE关闭时过期的Cookie)

对于格式化,IE可能会将标签变为空格,反之亦然。 HttpWebRequest将返回原始结果而不进行任何格式化。