【200分】HttpWebRequest/Response/WebClient获取的不是期望的页面

CsToD 2012-11-07 01:16:30
比如这样一个页面(台湾网址,不用代理的话,国内IP有时候能访问,有时候访问不了):
http://mybid.ruten.com.tw/credit/rule_p?wzappleom2
用WebClient(HttpWebReuest/HttpWebResponse结果一样)得到的页面只是一个“中间/等待”页面,显示:
商品搜尋處理中

但用IE打开,是一个正常的页面,而如果网速比较慢,也会时示那个“中间/等待”页面,似乎是这样:
访问这个网址后,先显示一个等待页面,后台查询完后,返回给你结果页面,因为一般情况网速正常的话,几乎是马上返回结果页面,所以就看不见等待页面,而用编程的方式取到的就是等待页,有什么办法能获取最后的页面吗?

需要强调的是,这不是一个跳转页面,因为url没有任何变化,而且WebClient/HttpWebReuqest默认就是自动跳转的,所以应该不是跳转的问题,大概网页是这样显示的吧:

Page_Load()
{
Output("正在查询");
res=Query();//
Clear("正在查询");
Output(res);
}

当然,我只是猜的

怎么才能取到正确的页面呢?
...全文
459 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yonglaixiazaide 2012-11-09
  • 打赏
  • 举报
回复
是这样的,通过js写的cookie,以及Asp.net网站输出的cookie你这样写是不行的,你没有执行js,对于asp.net的,response.Headers["Set-Cookie"]
引用 15 楼 CsToD 的回复:
我封装过一个WebClient,本来不需要专门去处理Cookie的,因为我本来就用通用的方式处理过,不知道为什么对这个程序无效: class WebClientEx:WebClient { .... protected override System.Net.WebResponse GetWebResponse(System.Net.WebRequest request) ……
zhujiawei7 2012-11-08
  • 打赏
  • 举报
回复
以前做过这方面的工作。用fiddler2工具监视URL,有时候虽然IE上的URL没变,但是fiddler2会监视到所有该页面经过的请求。找到真正的请求,查看它的get、post或头部信息。接下来你知道该怎么做了吧
四惠大战僵尸 2012-11-08
  • 打赏
  • 举报
回复
引用 2 楼 CsToD 的回复:
我的代码如下: C# code123456WebClient wc = new WebClient();wc.Encoding = Encoding.GetEncoding("big5");wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.……
目测做了防采集的处理,站外链接不能直接访问网站,这样搜索引擎也不能抓取它的页面(当然也可以对来源单独设置过滤)。但是我们却通过浏览器访问网站,这是为什么呢,因为它在服务器上对每一次访问请求都做了判断,如果是站内链接过来的访问,就可以直接访问;如果不是那么就做一次重定向,定向到当前的页面(相当于产生了来自站内的链接访问请求,回到了上一步),这样就实现了既可以防止采集,又不影响浏览的目的了。 关于破解,兄弟是这样想的: 基于以上的推测,我们只要把访问请求的来源地址,改为他的域名就行了, 也就是这个玩意 HttpContext.Current.Request.UrlReferrer 我没弄过,查查资料应该是可以改的,
liuhongdeyy 2012-11-08
  • 打赏
  • 举报
回复
好像有个内部跳转。 "http://mybid.ruten.com.tw/credit/rule_p?louis061100 访问后跳转到其他页面。。
CsToD 2012-11-08
  • 打赏
  • 举报
回复
有人遇到过这种情况吗
四惠大战僵尸 2012-11-08
  • 打赏
  • 举报
回复
之前想复杂了,确实cookie就可以搞定了,
wc.Headers[HttpRequestHeader.Cookie] = "_ts_id=31053D04360E370033";
但是他们这样做应该也是为了防采集。
CsToD 2012-11-08
  • 打赏
  • 举报
回复
我封装过一个WebClient,本来不需要专门去处理Cookie的,因为我本来就用通用的方式处理过,不知道为什么对这个程序无效: class WebClientEx:WebClient { .... protected override System.Net.WebResponse GetWebResponse(System.Net.WebRequest request) { WebResponse res = base.GetWebResponse(request); HttpWebResponse hRes = res as HttpWebResponse; if (hRes != null) { this.container.Add(hRes.Cookies); Response = hRes; } return res; } protected override System.Net.WebRequest GetWebRequest(Uri address) { WebRequest req = base.GetWebRequest(address); HttpWebRequest hReq = req as HttpWebRequest; if (hReq != null) { hReq.CookieContainer = container; Request = hReq; } return req; } } 这是我原来封装的,根本不需要单独处理Cookie
yonglaixiazaide 2012-11-08
  • 打赏
  • 举报
回复
确认了:http://ts.ruten.com.tw/ts_sender.php 这个地址会存cookie 不过这个cookie可以伪造 你访问这个页面拿到31053D053C0D3D0B33,就可以伪造了 'setCookie': function(c_name,value,expiredays) { var exdate=new Date(); exdate.setDate(exdate.getDate()+expiredays); document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString())+";path=/;domain=ruten.com.tw"; } }; _ts_sender_fn.setCookie('_ts_id','31053D053C0D3D0B33',365);
CsToD 2012-11-08
  • 打赏
  • 举报
回复
嗯,在此之前,我已经解决了,设置一下Cookie即可 _ts_id=。。。 不过我不清楚客户端怎么会有这么个Cookie
yonglaixiazaide 2012-11-08
  • 打赏
  • 举报
回复
http://mybid.ruten.com.tw/credit/rule_p?wzappleom2 (Request-Line) GET /credit/rule_p?wzappleom2 HTTP/1.1 Host mybid.ruten.com.tw User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding gzip, deflate Connection keep-alive http://mybid.ruten.com.tw/credit/rule_p?wzappleom2 (Request-Line) GET /credit/rule_p?wzappleom2 HTTP/1.1 Host mybid.ruten.com.tw User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding gzip, deflate Connection keep-alive Referer http://mybid.ruten.com.tw/credit/rule_p?wzappleom2 Cookie _ts_id=31053D053D0D3F0D3B
yonglaixiazaide 2012-11-08
  • 打赏
  • 举报
回复
我两次抓包的对比,你看下: 其它的不用看,第二次 比第一次多了个refer,还有一个cookie,这个cookie没发现是那个地方下载下来的, 自从访问http://mybid.ruten.com.tw/favicon.ico后, 这个cookie就开始了

http://mybid.ruten.com.tw/credit/rule_p?wzappleom2

(Request-Line)	GET /credit/rule_p?wzappleom2 HTTP/1.1
Host	mybid.ruten.com.tw
User-Agent	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding	gzip, deflate
Connection	keep-alive


http://mybid.ruten.com.tw/credit/rule_p?wzappleom2

(Request-Line)	GET /credit/rule_p?wzappleom2 HTTP/1.1
Host	mybid.ruten.com.tw
User-Agent	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding	gzip, deflate
Connection	keep-alive
Referer	http://mybid.ruten.com.tw/credit/rule_p?wzappleom2
Cookie	_ts_id=31053D053D0D3F0D3B
yonglaixiazaide 2012-11-08
  • 打赏
  • 举报
回复
我看下。。。
引用 9 楼 CsToD 的回复:
上一回复中,我把地址写错了,实际上这段脚本里面的地址,跟原来的地址是一样的: XML/HTML code 123 <script type="text/javascript" language="JavaScript"> setTimeout("location.href='http://mybid.ruten.com.tw/credit/rule_p?l……
CsToD 2012-11-08
  • 打赏
  • 举报
回复
上一回复中,我把地址写错了,实际上这段脚本里面的地址,跟原来的地址是一样的:
  <script type="text/javascript" language="JavaScript">
    setTimeout("location.href='http://mybid.ruten.com.tw/credit/rule_p?louis061100'",200);
  </script>
CsToD 2012-11-08
  • 打赏
  • 举报
回复
我找到关键点了,用我的方法下载下来的html,末尾有一段脚本: [code=html] <script type="text/javascript" language="JavaScript"> setTimeout("location.href='http://search.ruten.com.tw/search/s000.php?k=%b4%d6%a6%e7&t=0&p=1'",200); </script> [/0000000000code] 直接运行保存下来的html文件,会得到正确的结果,而如果把这段脚本删除,就只显示“商品搜寻中”了 而且这个延时是无所谓的,改成0也行 这种情况下,程序要怎么改呢?
CsToD 2012-11-07
  • 打赏
  • 举报
回复
string res = wc.DownloadString(@"http://mybid.ruten.com.tw/credit/rule_p?louis061100"); 这个网址我写成跟上面不一样了,不过结果都一样,用哪个都行
CsToD 2012-11-07
  • 打赏
  • 举报
回复
我的代码如下:

WebClient wc = new WebClient();
wc.Encoding = Encoding.GetEncoding("big5");
wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
wc.Headers[HttpRequestHeader.Accept] = "text/html, application/xhtml+xml, */*";
string res = wc.DownloadString(@"http://mybid.ruten.com.tw/credit/rule_p?louis061100");
止境 2012-11-07
  • 打赏
  • 举报
回复
好吧,看到标题我就知道我不会了,所以,友情帮顶。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧