求助高手,winfrom如何,自动把网页解析成dom。

wulimin212 2013-03-23 04:19:38
最近在弄个网页填表的软件。
那这个WebBrowser是必不可少的。

WebBrowser,按我的理解大概是以下几个功能的结合体。

1.下载目标网页地址的html文档。
2.解析下载完的文档(css,js,html,等网络元素),形成一个DOM对象(好像是),给js引擎调用。
3.渲染界面,显示出来给ie可视窗口。
4.HTTP处理功能。(get,post,head)
5.Cookie管理功能。

基本填表的时候,很简单,不太麻烦。网上资料也多。但是这个WebBrowser控件有个非常巨大的问题。就是内存占用过大(开始没事,等运行久了,你会发现他要崩溃,内存在一直涨),导致程序一会就崩溃了,搜索各种解决ie控件的内存占用问题的知识。得出结论,此问题基本无解,算是一个bug吧。

WebBrowser最浪费的cpu和内存,就是界面渲染是罪魁过手。怎么能把界面渲染去掉呢,在后台分析dom元素。
意思就是去掉WebBrowser,也行。提交post用异步提交。

现在有两个库,微软的。winnet,winhttp。

winnet 是ie的底层,能自动管理cookie,
winhttp 是winnet的升级版(好像是),不能自动管理cookie,需要自己实现。

怎么能像浏览器那样,自动组织post数据内容呢,而不用抓包就能实现。就像我们在这里发帖子似的,无需关心里面的post数据,里面的js自动处理。我们就管填完帖子必须的内容,点击提交就发表帖子了。至于是ajax post,还是普通的post都不需关心。

怎么能实现这样的呢。总的意思就是没有UI的浏览器。

有人说直接http模拟不就行了,这个肯定不行,需要抓包(一个网站可以,要是1万个网站,岂不累死)。还有另外的js问题,有个网站加密,解密的。也需要自己分析。如果自动分析出来了,就不需要这些工作。

隐藏ie控件,根本就是跟不隐藏一样。反正目前IE控件内存是个问题,基本无解。

网上找资料,找不到啊,听说这里高人多,能指点一二吗?起码有个头绪。



谢谢!
...全文
148 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
APM60- 2013-03-25
  • 打赏
  • 举报
回复
如果只需要获取并分析DOM的话,mshtml可以实现。 以下是我以前做的分析缓存页面内容的一部分。 其中htmlContent为string类型的网页内容。 using mshtml; HTMLDocument htmlDoc = new HTMLDocumentClass(); IHTMLDocument2 doc2 = (IHTMLDocument2)htmlDoc; doc2.write(htmlContent); doc2.close(); // 然后就可以把htmlDoc作为Dom分析了 如 foreach (IHTMLImgElement image in htmlDoc.images) …… 把远程的网页内容保存为string类型,可以试试用WebClient。
菜牛 2013-03-24
  • 打赏
  • 举报
回复
我看你的意思,没有界面给用户输入,又没有抓包分析数据,那你怎么知道该发送什么数据?
菜牛 2013-03-24
  • 打赏
  • 举报
回复
引用 6 楼 wulimin212 的回复:
引用 5 楼 Mackz 的回复:我看你的意思,没有界面给用户输入,又没有抓包分析数据,那你怎么知道该发送什么数据? 浏览器就能知道发什么数据啊。只是不需要界面渲染的功能。想在ie控件上做文章。没找到相关资料。 或者把ie的界面只加载一次,post请求,全变成异步请求也行。填写表单就像winfrom填写数据似的。填一条点击提交就异步post一条。就不用刷新界面……
浏览器只不过提供一个界面,那数据还不是人去填?
lxllb8 2013-03-24
  • 打赏
  • 举报
回复
引用 6 楼 wulimin212 的回复:
引用 5 楼 Mackz 的回复:我看你的意思,没有界面给用户输入,又没有抓包分析数据,那你怎么知道该发送什么数据? 浏览器就能知道发什么数据啊。只是不需要界面渲染的功能。想在ie控件上做文章。没找到相关资料。 或者把ie的界面只加载一次,post请求,全变成异步请求也行。填写表单就像winfrom填写数据似的。填一条点击提交就异步post一条。就不用刷新界面……
如果你打开的页面没有session等服务器端的参数,就可以用你这种方法,连续post
wulimin212 2013-03-24
  • 打赏
  • 举报
回复
引用 5 楼 Mackz 的回复:
我看你的意思,没有界面给用户输入,又没有抓包分析数据,那你怎么知道该发送什么数据?
浏览器就能知道发什么数据啊。只是不需要界面渲染的功能。想在ie控件上做文章。没找到相关资料。 或者把ie的界面只加载一次,post请求,全变成异步请求也行。填写表单就像winfrom填写数据似的。填一条点击提交就异步post一条。就不用刷新界面了。ie只要一刷新,内存就狂彪。这也是没办法的办法。
lxllb8 2013-03-23
  • 打赏
  • 举报
回复
不过你可以写个程序去分析提交的参数,然后进行归类,哪些是需要js加密的,哪些是有验证码的。。。。。。
lxllb8 2013-03-23
  • 打赏
  • 举报
回复
没有这样的。抓包你又嫌麻烦,还想要傻瓜似的,估计够呛。
yaotomo 2013-03-23
  • 打赏
  • 举报
回复
做成BS系统不行吗?
江湖评谈 2013-03-23
  • 打赏
  • 举报
回复
基本无解的browser

110,565

社区成员

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

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

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