c# 如何获取window.location.href跳转后的源码?跪求解决方案

hanjiang133 2017-11-21 02:08:12
网址:http://www.dataoke.com/search/?keywords=衣服&xuan=keyword
直接用webbrowser访问是没问题的

但是用WebRequest,webclient都获取不到像浏览器加载完的源码,只能获取到 "<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script>" 这句话

 
private string GetHtml(string url)
{
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse();
Stream resStream = response.GetResponseStream();
Encoding enc = Encoding.GetEncoding("utf-8");
StreamReader sr = new StreamReader(resStream, enc);
string ss = sr.ReadToEnd();
resStream.Close();
sr.Close();
return ss;
}

跳转的url和我要访问的url是同一个啊,请教一下要怎么获取到像浏览器加载完之后的那种源码? (排除webbrowser控件,效率太低了啊..) 百度了一个晚上都没解决.
...全文
694 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanjiang133 2017-11-22
  • 打赏
  • 举报
回复
谁给我丢段可行的代码啊...
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
谁给我丢段可行的代码啊...跪求啊
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.referer(VS.80).aspx MSDN自己参考参考。
  • 打赏
  • 举报
回复
如果你能看明白这是什么意思,我想你就知道解决方案了。
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 17 楼 xuzuning 的回复:
他返回的 http 头: [0] => HTTP/1.1 200 OK [1] => Server: Tengine [2] => Content-Type: text/html [3] => Content-Length: 99 [4] => Connection: close [5] => Date: Tue, 21 Nov 2017 10:34:19 GMT [6] => Vary: Accept-Encoding [7] => Set-Cookie: token=aaa777c68583aa2b2bbc46ad02436afb;expires=Tue, 21-Nov-17 10:39:19 GMT;path=/ [8] => Set-Cookie: random=5860;path=/ [9] => Via: cache12.l2et15[27,200-0,M], cache20.l2et15[28,0], kunlun6.cn192[42,200-0,M], kunlun8.cn192[44,0] [10] => X-Cache: MISS TCP_MISS dirn:-2:-2 mlen:-1 [11] => X-Swift-SaveTime: Tue, 21 Nov 2017 10:34:19 GMT [12] => X-Swift-CacheTime: 0 [13] => Timing-Allow-Origin: * [14] => EagleId: 3adad78815112604590435045e
这个接下来要怎么弄啊版主,我用webbrowser先打开网页,然后把webbrowser的cookie传给request,cookie里面也包含tooken, 也不行啊,结果一样.
xuzuning 2017-11-21
  • 打赏
  • 举报
回复
他返回的 http 头: [0] => HTTP/1.1 200 OK [1] => Server: Tengine [2] => Content-Type: text/html [3] => Content-Length: 99 [4] => Connection: close [5] => Date: Tue, 21 Nov 2017 10:34:19 GMT [6] => Vary: Accept-Encoding [7] => Set-Cookie: token=aaa777c68583aa2b2bbc46ad02436afb;expires=Tue, 21-Nov-17 10:39:19 GMT;path=/ [8] => Set-Cookie: random=5860;path=/ [9] => Via: cache12.l2et15[27,200-0,M], cache20.l2et15[28,0], kunlun6.cn192[42,200-0,M], kunlun8.cn192[44,0] [10] => X-Cache: MISS TCP_MISS dirn:-2:-2 mlen:-1 [11] => X-Swift-SaveTime: Tue, 21 Nov 2017 10:34:19 GMT [12] => X-Swift-CacheTime: 0 [13] => Timing-Allow-Origin: * [14] => EagleId: 3adad78815112604590435045e
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
显然他还需要传递 cookie,以确认身份。你做了吗?
试过了,也一样, 另外这个不需要登录就能搜索的,要cookie吗?
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 13 楼 xomix 的回复:
[quote=引用 12 楼 hanjiang133 的回复:] [quote=引用 11 楼 xuzuning 的回复:] 既然能取到 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> 那么再 GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") 不就行了? 不相信你连 http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 也截取不出来
关键是,我就是GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") ,返回的 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> ,你看一下9楼 第二图中左边圈起来的 两个一样的地址,上面一个的请求响应是<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> ,下面一个地址的请求响应才是我要的源码. 但两个地址是一样的啊,所以我请求返回的结果,老是跳转前的网页源码:<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> , 能明白我的意思吗,,感觉说的好乱, 说都不会话了.[/quote] GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") 的时候加一个Referer标志请求来源为http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 实验过吗?[/quote] 试过了,结果是一样的.
xuzuning 2017-11-21
  • 打赏
  • 举报
回复
显然他还需要传递 cookie,以确认身份。你做了吗?
  • 打赏
  • 举报
回复
引用 12 楼 hanjiang133 的回复:
[quote=引用 11 楼 xuzuning 的回复:] 既然能取到 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> 那么再 GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") 不就行了? 不相信你连 http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 也截取不出来
关键是,我就是GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") ,返回的 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> ,你看一下9楼 第二图中左边圈起来的 两个一样的地址,上面一个的请求响应是<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> ,下面一个地址的请求响应才是我要的源码. 但两个地址是一样的啊,所以我请求返回的结果,老是跳转前的网页源码:<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> , 能明白我的意思吗,,感觉说的好乱, 说都不会话了.[/quote] GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") 的时候加一个Referer标志请求来源为http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 实验过吗?
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
既然能取到 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> 那么再 GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") 不就行了? 不相信你连 http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 也截取不出来
关键是,我就是GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") ,返回的 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> ,你看一下9楼 第二图中左边圈起来的 两个一样的地址,上面一个的请求响应是<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> ,下面一个地址的请求响应才是我要的源码. 但两个地址是一样的啊,所以我请求返回的结果,老是跳转前的网页源码:<script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> , 能明白我的意思吗,,感觉说的好乱, 说都不会话了.
xuzuning 2017-11-21
  • 打赏
  • 举报
回复
既然能取到 <script>window.location.href='http://www.dataoke.com/search/?keywords=衣服&xuan=keyword';</script> 那么再 GetHtml("http://www.dataoke.com/search/?keywords=衣服&xuan=keyword") 不就行了? 不相信你连 http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 也截取不出来
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
想取得第2图那样的源码,怎么弄,急啊 可以直接丢段可行的代码给我吗~~
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 7 楼 xomix 的回复:
[quote=引用 6 楼 mirror030 的回复:]
请求这个地址得到这脚本,说明是在浏览器上跳转了的.
可以请求两次,一次拿到地址http://www.dataoke.com/search/?keywords=衣服&xuan=keyword
然后请求这地址拿到源码.当然 ,如果它又重定向了.或者里面有AJAX.那么就不好办了.需要分析脚本,再请求所有的AJAX地址,最终拼成整个网页.
用webbrowers的话,就不用这麻烦.等加载完直接操作webview拿到里面的源码

写一个递归调用,发现有重定向直接自调用即可。[/quote]

递归调用好像也不行

hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 6 楼 mirror030 的回复:
请求这个地址得到这脚本,说明是在浏览器上跳转了的. 可以请求两次,一次拿到地址http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 然后请求这地址拿到源码.当然 ,如果它又重定向了.或者里面有AJAX.那么就不好办了.需要分析脚本,再请求所有的AJAX地址,最终拼成整个网页. 用webbrowers的话,就不用这麻烦.等加载完直接操作webview拿到里面的源码
嗯,webbrowser是方便,不得已的时候再用他..
  • 打赏
  • 举报
回复
引用 6 楼 mirror030 的回复:
请求这个地址得到这脚本,说明是在浏览器上跳转了的. 可以请求两次,一次拿到地址http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 然后请求这地址拿到源码.当然 ,如果它又重定向了.或者里面有AJAX.那么就不好办了.需要分析脚本,再请求所有的AJAX地址,最终拼成整个网页. 用webbrowers的话,就不用这麻烦.等加载完直接操作webview拿到里面的源码
写一个递归调用,发现有重定向直接自调用即可。
mirrorspace 2017-11-21
  • 打赏
  • 举报
回复
请求这个地址得到这脚本,说明是在浏览器上跳转了的. 可以请求两次,一次拿到地址http://www.dataoke.com/search/?keywords=衣服&xuan=keyword 然后请求这地址拿到源码.当然 ,如果它又重定向了.或者里面有AJAX.那么就不好办了.需要分析脚本,再请求所有的AJAX地址,最终拼成整个网页. 用webbrowers的话,就不用这麻烦.等加载完直接操作webview拿到里面的源码
二月十六 2017-11-21
  • 打赏
  • 举报
回复
网页有js异步加载吧
  • 打赏
  • 举报
回复
他重定向就是要加一个Referer标志请求来源是自己…………你用WebRequest,webclient加上Referer再请求看看
hanjiang133 2017-11-21
  • 打赏
  • 举报
回复
引用 1 楼 xomix 的回复:
如果你能看明白这是什么意思,我想你就知道解决方案了。
看了MSDN不是很明白, Referer是标志请求来源,请求和响应的标头不是我想获得的,我是想获得源码,能详细说下怎么弄吗?

private string GetHtml(string url)
 {
           HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            myHttpWebRequest.Referer = url;
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            // Display the contents of the page to the console.
            Stream streamResponse = myHttpWebResponse.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
            string ss=streamRead.ReadToEnd();
            Char[] readBuffer = new Char[256];
            int count = streamRead.Read(readBuffer, 0, 256);
            //Console.WriteLine("\nThe contents of HTML page are.......");
            while (count > 0)
            {
                String outputData = new String(readBuffer, 0, count);
                //Console.Write(outputData);
                label1.Text += outputData;
                count = streamRead.Read(readBuffer, 0, 256);
            }
            MessageBox.Show(String.Format("\nHTTP Request  Headers :\n\n{0}", myHttpWebRequest.Headers));
            MessageBox.Show(string.Format("\nHTTP Response Headers :\n\n{0}", myHttpWebResponse.Headers));
            streamRead.Close();
            streamResponse.Close();
            // Release the response object resources.
            myHttpWebResponse.Close();
            MessageBox.Show(string.Format("Referer to the site is:{0}", myHttpWebRequest.Referer));
            return ss;
}

110,538

社区成员

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

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

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