数据采集时会遇到一些通过js脚本跳转的页面,最典型的例子就是用.net制作的网站。譬如:如果用一个按钮来实现分页操作,那么这个按钮最终生成的就是一个js脚本,通过js脚本来实现下一页的请求操作。当然也许是站长通过js隐藏了地址,防止数据被采集到。
在Soukey采摘中正在实现自动翻页的功能,在自动翻页时就会遇到此类问题,当然可以通过变通的方法来解决,就是查看POST数据,根据POST数据的规则进行页面的请求,但如果这样进行,自动翻页的功能就无法实现了,需要用户手工捕获POST数据,并完善其参数。达不到预期目的。查了很多资料,当前并未找到很好的解决方法,仅记录一下现有的成果:
js脚本是需要编译执行的,就表示要支持js脚本就必须要有js引擎(浏览器都内置了js引擎),如果仅仅实现在本地执行js脚本并不是很难,当前有很多方法,也可以利用很多的js引擎来实现js脚本的编译执行操作(MSScriptControl或其他,也可以使用mshtml.IHTMLWindow2.execScript来实现)。但对于网页数据采集的情况,是不太适合的。 当前有一种比较不爽的方法可以实现:
利用mshtml + webbrowser 可以实现 。使用webbrowser加载页面,并把html文档加载到mshtml.IHTMLDocument2中,调用IHTMLWindow2.execScript方法执行js,此时webbrowser也会自动刷新请求后的页面,此时再获取Url就可以了,此种方式最为保险,因为实际这种方式就是模拟手工的操作,但此种方式效率及稳定性都不是很好,同时也可能会带来其他的问题。但除此方法,还未找到比较好的方法可以实现此类页面的跳转操作。
总结一下:执行js的方法:
1、利用msscriptcontrol执行js,网上有很多说明,且有实际的例子,不做说明了。
2、同时在codeproject上也有一个.net 与 javascript通讯的例子, 可以参考一下。http://www.codeproject.com/KB/vb/vb_jscript_communication.aspx
3、利用mshtml操作(mshtml是个com组件,在.net下进行了封装,microsoft.mshtml.dll,如果仅有.net framework 2.0 的运营环境,是不支持mshtml的,需要了解)
mshtml.IHTMLDocument2 htmlDoc= (mshtml.IHTMLDocument2)this.webBrowser.Document.DomDocument;
mshtml.IHTMLWindow2 htmlWin= (mshtml.IHTMLWindow2)htmlDoc.parentWindow;
htmlWin.execScript(JavaFunction, "javascript");
还有一种方式,正在尝试。
即把采集的源码加载到 IHTMLDocument2中,然后调用execScript执行,正在测试,不知是否可以成功。但现在是不行。如果是通过源代码加载到IHTMLDocument2中,需先设置designMode = "On",否则会执行页面中的操作。
先说这么多,做个记号,看看这个问题能不能解决。