.NET4.5 WFP中用WebBrowser获取/操作网页html代码
引言
想给自己之前写的网页小说爬虫程序更新换代,之前一直是用winform的形式写的程序,因此这一次更新打算把UI换成WPF(因为听说WPF很漂亮),顺便也以此引入WPF的学习。
那么作为网页爬虫程序,最重要的就是html源码的获取了,通常的获取方式有几种:HttpWebRequest、WebRequest、WebClient、WebBrowser等。由于我这里写的爬虫软件针对的网站需要先登录才能看到小说内容,而我一次爬取的内容不多都是短篇小说,因此不需要考虑到爬取的速度,因此自然是打算使用WebBrowser来实现登陆后获取网页源码。而为了加快爬取速度我考虑多开几个WebBrowser线程,同时对多个页面进行采集,暂时不知道这个思路是否能够实现,这是后话了。(题外话,如果你要快速爬取大量网页,可以考虑使用WebClient,若有登录需求则进行模拟登录记录cookie,不过这样挺麻烦的)
问题
新建WPF项目后,第一件事就是吧WebBrowser控件拖一个到窗口中,由于我熟悉网站开发,因此xaml对我来说倒不是什么难事。可是在获取网页源代码这一步就坑爹了,WPF中WebBrowser的属性和方法似乎没有能够获取html 的!
实践
遇到问题先问搜索引擎,然而网上大家似乎都没有类似需求,全是WPF中如何用webbrowser操作html元素的,大概就是通过IHTMLElement接口操作DOM。不过既然都操作了DOM,那么获取html也是没问题的了。
1.引用中添加Microsoft.mshtml.dll
在中找到需要引用的项目
2.操作Html
之后就可以用HTMLDocument来操作Html了,记得要引用命名空间:mshtml。之后的内容以代码的形式贴上。
using mshtml; …… webBrowser.Navigate("http://www.baidu.com/"); // ……等待网页加载…… HTMLDocument doc = this.wb3.Document as HTMLDocument;
//获取body内的html代码
string html = doc.body.innerHTML;
//暂时没搞明白应该怎么获取所有的html代码 //根据ID获取元素
//根据id获得input
IHTMLElement inputSearch = (IHTMLElement)doc.all.item("kw");
//为input设置value属性
inputSearch.setAttribute("value","设置搜索内容");
//获得搜索按钮
IHTMLElement submitSearch = (IHTMLElement)doc.all.item("su");
//点击按钮
submitSearch.click();
//获取窗体
mshtml.IHTMLWindow2 window = (mshtml.IHTMLWindow2)doc.parentWindow;
//注入javascript
window.execScript("alert(123);", "javascript");
//注入禁止弹窗等
window.execScript("function alert(){return;}", "javascript");
window.execScript("function confirm(){return;}", "javascript");
//第二次的alert将不会执行
window.execScript("alert(456);", "javascript");
/// <summary>
/// 这个方法据说可以屏蔽掉JS,在Navigated事件中调用,未测试
/// </summary>
/// <param name="wb"></param>
/// <param name="Hide"></param>
public void HideScriptErrors(WebBrowser wb, bool Hide)
{
FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
if (fiComWebBrowser == null) return;
object objComWebBrowser = fiComWebBrowser.GetValue(wb);
if (objComWebBrowser == null) return;
objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide });
}
.NET4.5 WFP中用WebBrowser获取/操作网页html代码的更多相关文章
- webBrowser中操作网页元素全攻略
原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...
- JS获取整个网页html代码
var test=document.getElementsByTagName('html')[0].innerHTML; alert(test);
- C# 网络编程之webBrowser获取网页url和下载网页中图片
该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试瞎子啊网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识.正则表达式实现浏览.获取url. ...
- VBS脚本和HTML DOM自动操作网页
VBS脚本和HTML DOM自动操作网页 2016-06-16 10:24 1068人阅读 评论(0) 收藏 举报 分类: Windows(42) 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- C#使用WebBrowser对指定网页截图
使用webbrowser获取html,然后输出的位图即可. WebBrowser wb = new WebBrowser(); // 创建一个WebBrowser wb.ScrollBarsEnabl ...
- Python实训day07pm【Selenium操作网页、爬取数据-下载歌曲】
练习1-爬取歌曲列表 任务:通过两个案例,练习使用Selenium操作网页.爬取数据.使用无头模式,爬取网易云的内容. ''' 任务:通过两个案例,练习使用Selenium操作网页.爬取数据. 使用无 ...
- 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github
不知不觉,版本以每周更新一次的脚步进行着,接下来应该是重构我的代码及框架的结构,有朋友反应代码有点乱,确实如此,当时写的时候只是按照订阅号来写的,后来才慢慢增加到支持API接口.目前还在开发第三方微信 ...
- linux中用shell获取昨天、明天或多天前的日期
linux中用shell获取昨天.明天或多天前的日期 时间 -- :: BlogJava-专家区 原文 http://www.blogjava.net/xzclog/archive/2015/12/0 ...
随机推荐
- TCP/IP、Http、Socket的区别
1.标准网络层次 网络由下往上分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP. ...
- 1393: Robert Hood 旋转卡壳 凸包
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1393 http://poj.org/problem?id=2187 Beauty Contest ...
- New Concept English 1-10
Lesson 10 The loss of Titanic The great ship, Titanic, sailed for New York from Southampton on April ...
- springMVC--@requestBody
springMVC支持将前端传来的json字符串直接自动解析,注意点如下: 后台 1,在需要自动解析的参数前加上“@requestBody”,例如“public boolean updateOnePd ...
- C++多级指针与多维数组详细介绍
多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下: int val=10; int *ptr=&val; int **pptr= ...
- 在ie与火狐的兼容性
1.在火狐下 document.getElementById("id").textContent可以获取当前获取id下的内容 而在ie下则为:document.getElem ...
- s3c2440液晶屏驱动 (非内核自带) linux-4.1.24
对于,不想逐一检查内核自带驱动,想自己编写驱动. 1,make menuconfig 去掉 编译到内核,改为 M 编译为 模块(因为要用到里面的3个.ko 驱动) Device Drivers --- ...
- 【转】mysql对large page的支持
昨天同事问我关于大页内存的事,我也只是有个模糊的概念,从别的博客转过来的,先记录下 在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TL ...
- Tomcat重启脚本restart.sh停止脚本stop.sh
Tomcat重启脚本restart.sh停止脚本stop.sh Tomcat本身提供了 startup.sh(启动)shutdown.sh(关闭)脚本,我们在部署中经常会出现死进程形象,无法杀掉进程需 ...
- hibernate 入门
工程截图 1.jar包 和 hibernate配置文件 /src/hibernate.cfg.xml , /src/log4j.properties , /src/db.sql < ...