有些网站的比较重要的内容可能会采用javascript动态加载内容,防止采集,获取其中的信息,但是我们在采集的时候还需要获取到这些内容, 下面就介绍三种可以获取到javascript内容的方法,三种方式的原理其实是一样的,就是通过浏览器引擎来解析javascript。 1)、利用WebBrowser控件 这个方式大家也都知道,也就不多说了,说几个比较重要的地方。首先,我要在DocumentCompleted事件里面完成内容获取的工作,因为该控件 是在文档加载完成后触发的。其次,这个事件有个问题,就是说如果在页面中有iframe框架之类的,如果这个iframe加载完成也会触发这个事件,所以我们要做个判断 if (wb.ReadyState == WebBrowserReadyState.Complete && e.Url.ToString() == wb.Url.ToString()) 这个判断就是说在控件所有内容加载完并且是本页面加载完,而不是某个iframe加载完。然后就可以通过 wb.Document.Body.InnerHtml; 来获取内容啦! 2)利用phantomjs这个开源项目 这个项目的地址:http://phantomjs.org/ 。这个项目说的通俗点就是一个无界面的基于webkit内核的浏览器,既然是浏览器当然就能获取 javascript加载的内容。至于这个开源项目更多的细节还需要大家自己来阅读这个文档,里面写的很全面,也很易懂! 我先简单的介绍下在win7下怎么用这个项目 1、下载windows版本,地址http://phantomjs.org/download.html,现在的版本是1.9.1 2、下载完,解压缩,放到某个文件夹下 3、配置环境变量,把这个文件夹的根目录配置到环境变量中。 下面我们看怎么用C#来调用,这里用到Process类,具体看代码: Process p = new Process(); //启用命令行 p.StartInfo.FileName = @"cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); //输入各种命令 p.StandardInput.WriteLine(@"cd D:\Program Files\phantomjs\examples"); p.StandardInput.WriteLine(@"d:"); p.StandardInput.WriteLine("phantomjs --output-encoding=gbk test.js www.xxxx.com"); p.StandardInput.Close(); p.StandardInput.Dispose(); //获取结果 string strRst = p.StandardOutput.ReadToEnd(); p.Close(); Console.WriteLine(strRst); 上面代码中用到了一个test.js的文件,这个文件的写法需要参考一下phantomjs的api或者它自带的例子,很简单,比较好理解。 ttest。js的代码 var page = require('webpage').create(), system = require('system'), url; url = system.args[1]; page.open(url, function (status) { var title = page.evaluate(function () { return document.getElementById('contact').innerHTML; //return document.title; }); console.log('Page title is ' + title); //必须要退出,否则在c#调用的时候会卡死 phantom.exit(); }); 3)利用phantomjs的一个包装类库 这个类库很全面,有基于各种浏览的驱动,当然也包括phantomjs,我们就用PhantomJSDriver类来操作。当然这个类库信息很多,还需要大家 自己来看,我也是看了一点点,没有看的太详细!当然需要先下载类库,地址:http://docs.seleniumhq.org/download/,下载完添加引用, (发现貌似只用3.5和4.0版本的,老的版本中是否支持2.0),api文档地址:http://selenium.googlecode.com/git/docs/api/dotnet/index.html,下面看调用,很简单,几行代码就可以搞定! PhantomJSDriver driver = driver = new PhantomJSDriver(); driver.Url = "url"; string pagesource = driver.PageSource; driver.Quit(); driver.Dispose();
相关推荐
这是一个treeview的控件。 展开节点通过AJAX动态获取节点。并通过JavaScript添加上。
Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格...这篇文章主要介绍了DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等),需要的朋友可以参考下
在页面的渲染中,我们经常用遇到动态添加的DOM元素,那么在获取这些元素的时候或则为这些DOM元素的时候,我们有下面三种处理方法: 1. 在模板引擎里面添加行内事件 2. 利用事件的委托获取(常用) 3. 在ajax的监听...
提供了完整的echarts图表通过ajax的方式获取数据。做此记录,以供参考学习。里面有两种方式,大同小异。
Springboot框架中ajax动态加载分页,使用ajax请求后台,获取值追加给td,Springboot官方文档给的很全,主要是根据自己的需求,和ajax的写法
ajax-tab(动态加载tab) 切换
动态生成二级菜单树: [removed] jQuery(function($) { /********** 获取未处理报警信息总数 **************/ var result; $.ajax({ async:false, cache:false, url: "alarm_findPageAlarm.do",//访问后台接口取...
看到网上很多想用ajax的树的例子,很奇怪,明明TreeView自带AJAX功能,取非要自己去写一大堆代码, 工作量增加了,而性能又没有提高多少 正好自己这次用到了,就做了一个例子,供大家一起研究参考 注:顺便下载了一...
jQuery无限级ajax加载菜单代码是一款通过ajax调用方法异步获取json数据内容,可自定义编辑添加多级树形菜单内容代码。
本篇内容主要给大家讲解了Android Webview拦截ajax请求的详细讲解,需要的朋友一起来学习一下。
主要介绍了JQuery实现Ajax加载图片的方法,涉及jQuery基于缓存获取图片的技巧,需要的朋友可以参考下
功能:ajax获取后台返回数据给table动态添加tr/td html部分: <tbody></tbody> ajax部分: var year = $('#year').val();//下拉框数据 var province= $('#province').val();//下拉框数据 $('table tbody').html...
2. js部分,建一个function方法,利用ajax,指向 ‘getAllTypes.action’ 的servlet部分,获取传来的下拉列表的数据,动态填充 <span xss=removed> </span>function loadType(){ <span xss=removed> $.get( ...
动态加载数据动态加载的(FAQ 根据邮政编码获取地区信息、动态树形列表、多级联动菜单、 条件设置向导、 页面关键词提示) 改善客户体验(无刷新显示回帖、输入内容前提示、带进度的文件上传、大量数据动态浏览查询...
1、引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。...但是一些Ajax动态内容是在source code找不到的,就要找合适的程序库把异步或动态加载的内容加载上来,交给
使用ajax跨域获取资源,并实现本地懒加载,顺序加载
比较全面的ajax学习,适合于新手,包含内容包含如下: 第一章 动态加载数据 1.1动态加载的FAQ 1.2根据邮政编码获取地区信息 1.3动态树形列表 1.4多级联动菜单 1.5条件设置向导 1.6页面关键词提示 第二章 改善...
jQuery无限级ajax加载树形菜单代码,通过ajax调用方法异步获取json数据内容生成无限级树形菜单,可自定义编辑添加菜单项。
第一章 动态加载数据 1.1动态加载的FAQ 1.2根据邮政编码获取地区信息 1.3动态树形列表 1.4多级联动菜单 1.5条件设置向导 1.6页面关键词提示 第二章 改善用户体验 2.1无刷新显示回帖 2.2输入内容...