抓取iframe内数据(C#)

      当时企图抓取这iframe数据还费了不少劲,早就想记录下来,但是由于自身懒得让人惊叹,结果一直拖到现在。

      需求是要获取到一些网站上的大批数据,这些数据都是分很多页的。最初思路就是用web程序一页一页抓取,保存到Excel中。通常情况下用以下代码就能取到网页HTML文档:

WebRequest rqt =WebRequest.Create("http://www.xxxx.com");

WebResponse res = rqt.GetResponse();

Stream resStream = res.GetResponseStream();

StreamReader sr =newStreamReader(resStream, System.Text.Encoding.UTF8);

string strHtml = sr.ReadToEnd();   //获取到的HTML

resStream.Close();

sr.Close();

再解析HTML,截取需要的部分存储。

但发现,部分网页数据必须嵌套在iframe内才能显示正确结果,直接访问就显示“非法操作!”,且不论GET还是POST方式。

iframe弄成服务器控件,试图后台获取它的InnerHtml,但得不到iframe内的文档。再用JS取试试:document.frames["iframe1"].document.body.innerHTML,在iframe内嵌套的是站内网页的情况下,这种方式是能取到数据的。若是站外的网页,会提示错误:“拒绝访问。”,这个是JS跨域问题造成的。搜下资料,有说jQuery能通过jsonp解决跨域问题,不由欣喜地认真地学习实战了一番,结果证实尼玛这是忽悠呢。jQuery要求被访问的URL最终返回jsonp数据才能解析。这对我的情况明显不实用,我要能控制请求的页面,还抓什么数据啊,直接到数据库操作不就行了。而且jsonp的实质是使用htmlscript标记来进行跨域请求,又回到前面的问题,这个URL只能嵌套在iframe内才能得到正确结果,绕一圈原来是白忙一气!

在有点泄气的时候,用IE的开发人员工具查看iframe内的文档,惊觉:C/S程序权限高更容易实现?!立马就想到WebBrowser控件,动手建立WinForm项目,一番捣鼓运行测试,哈,豁然开朗!WebBrowser操作iframeJS顺畅N多,整理一下用法:

     1.读取iframe内HTML文档

  如:webBrowser1.Document.Window.Frames["iframe1"].Document.Body.InnerHtml

     2.读取iframe内元素的HTML

  如:webBrowser1.Document.Window.Frames["iframe1"].Document.GetElementsByTagName("table")[1].OuterHtml

     3.点击iframe内按钮

  如:webBrowser1.Document.Window.Frames["iframe1"].Document.GetElementsByTagName("input")[0].InvokeMember("click");

     4.改变iframe的目标文档(翻页时可用到)

  如:webBrowser1.Document.GetElementsByTagName("iframe")["iframe1"].SetAttribute("src","javascript:goto(2);");

你可能感兴趣的:(.NET)