我想用C#获取一个网页自己发出的请求,
我的问题在http://bbs.csdn.net/topics/390771672?page=1#post-397318473
希望能获得答案,已经困住好几天了。
有没有人知道
看了一大堆回复,我觉得楼主有必要详细交代下需求。
我的理解:楼主有一个URL。
在浏览器打开这个URL应该是有一个flv格式的视频的。
楼住想下载这个视频,也就想做一个视频采集程序?
那个你去看我csdn的帖子不就行了吗
@芬达: 网页打开时,会自己发出HTTP的请求,我想用c#的代码捕获这些url。
类似Fiddler的功能。
我在百度上搜到可以调用Fiddler的api,我不会用
@zzx112358: CSDN的帖子我也看了,我想不是我一个人没弄清楚你想表达什么,回复的和你的问题完全不符合。
直到你说了“
网页打开时,会自己发出HTTP的请求,我想用c#的代码捕获这些url。类似Fiddler的功能。”
这句话,我想大家都会明白你的问题了。
好了废话不多说:
fiddler实现原理是通过代理,让所有请求通过这个代理连接web server,从而捕获这些请求。
既然知道了原理,给几个资料,参考下如何实现一个这样的proxy server:
http://www.oschina.net/code/snippet_12_660
https://github.com/Siyy/SharpProxy
http://bartdesmet.net/blogs/bart/archive/2007/02/22/httplistener-for-dummies-a-simple-http-request-reflector.aspx
@芬达: 就是这个意思。
我现在就想用Fiddler的插件来着
@zzx112358:
你可以使用fiddlercore 来实现
参考http://www.telerik.com/fiddler/fiddlercore
@芬达: 看不懂,不会用
@芬达: 这个是Fiddler的扩展类库吗?
直接引用就可以了吗
@zzx112358: 亲哥~~~,我发你的地址有文档,有demo,有源代码。你还要怎么样????
@zzx112358: core可以看出是核心内库。一般来说如果是扩展,会有extentions or ex 字样。
这个挺困难的,首先你用HttpWebRequest获取网页本身的HTML是没有问题的,下一步就比较麻烦了,因为你需要解析出来这个网页还调用了哪些资源,比如JS、CSS、图片、视频等,然后在JS和CSS中可能还调用了其他的各种文件,需要递归解析。
实际上,只是第一次解析,就已经近似于搞一个浏览器了,要解析HTML、要解析CSS、要执行JS(因为执行的JS可能还在调用其他JS)。
有一个歪招儿,没用过,不知道行不行得通:在winform中嵌一个webbrowser控件,然后让webbrowser加载你要处理的网页,通过监控和处理webbrowser的属性或方法什么的,来获取你想要的资源。你可以试试
这个能用GET请求做吗
@zzx112358: get只能解决获取一个资源(HTML、JS、CSS)的问题,解决不了解析的问题,你这个的难点在于从代码中解析出所有资源地址
@丁学: 我只要选中行的URL,在说可以多吃GET
@zzx112358: 你用 SOCKET 或 HttpWebRequest 得到只是 HTML 脚本,你必须写一个 HTML 和 JS 脚本解释器(IE 等浏览器的主要功能就是 HTML 和 JS 脚本解释器),解析出来的指令可能是绘制文字、图元,也可能是再请求一个到多个资源,或者调用系统的一个 API 等。
@Launcher: 呃,不太明白你的意思。
我只想知道GET可以吗?可以的话,怎么写?
@zzx112358: 是不是 GET 还不一定呢,你得看 HTML 里的脚本是咋写的,比如我有这样一个页面
http://q.cnblogs.com/q/62232/#c_712661,其内容为:
<html lang="zh-cn">
<head>
script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"/>
</head>
</html>
那么我先发起一个请求:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://q.cnblogs.com/q/62232/#c_712661");
此请求执行后,我得到的 HttpWebReponse 中的内容是这样(忽略了 HTTP HEADER):
<html lang="zh-cn">
<head>
script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"/>
</head>
</html>
然后我通过解析次内容,发现一条标记:<script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"/>,根据 HTML 协议的规定,此条脚本表示此页面需要引用 jquery.js 文件,并且此文件的绝对路径为:http://common.cnblogs.com/script/jquery.js,那么我再发起一次请求,如下:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://common.cnblogs.com/script/jquery.js");
req.Method = "GET"; // src
req.ContentType = "text/javascript" ; // type="text/javascript"
那么我再次请求,得到的就是 jquery.js 文件。
http://www.w3school.com.cn/tags/att_img_src.asp
PS:学习《编译原理》有助于你理解此问题。
@Launcher: 我想请求的资源是视频格式的
@Launcher:
而且资源是load的时候就加载上的
@zzx112358: 视频也一样,统称为资源,只是 HTML5 同之前的版本有些差别,你需要多解析一些标记:http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp。
@Launcher: 你有没有看那个图片我放在csdn上的图片,我用F12抓包抓包的。
@Launcher: 呃,能不能帮我解决下
是的,用Webbrowser空间可以勉强实现.最优解决方案是webkit吧,因为JS执行的中可以发出请求,
这种东西真要做,非常麻烦,只能自己动手做才行,说是没什么用的,最多就是说个思路,具体实现会遇到很多问题的
这个用GET 或者socket可以做吗
@zzx112358: 不可以的,第一个要解决的就是JS执行的问题.
加载的时候就执行了,不是我触发的事件
@吴瑞祥: 我现在是用httpwebrespense做的
你是想要获得网页的内容,还是要把网页程现出来?
如果是想得到内容,那css的内容就没必要加载其它的 资源 都是可以单独请求 用 HttpWebRequest 与 HttpWebResponse