关于网页动态数据获取的知识学习(2)

三种获取js加载的动态内容的方法

有些网站的比较重要的内容可能会采用javascript动态加载内容,防止采集,获取其中的信息,但是我们在采集的时候还需要获取到这些内容,

下面就介绍三种可以获取到javascript内容的方法,三种方式的原理其实是一样的,就是通过浏览器引擎来解析javascript。

1)、利用WebBrowser控件

这个方式大家也都知道,也就不多说了,说几个比较重要的地方。首先,我要在DocumentCompleted事件里面完成内容获取的工作,因为该控件

是在文档加载完成后触发的。其次,这个事件有个问题,就是说如果在页面中有iframe框架之类的,如果这个iframe加载完成也会触发这个事件,所以我们要做个判断

1
if (wb.ReadyState == WebBrowserReadyState.Complete && e.Url.ToString() == wb.Url.ToString())

 这个判断就是说在控件所有内容加载完并且是本页面加载完,而不是某个iframe加载完。然后就可以通过

1
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类,具体看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
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,下面看调用,很简单,几行代码就可以搞定!

1
2
3
4
5
PhantomJSDriver driver = driver = new PhantomJSDriver();
driver.Url = "url" ;
string pagesource = driver.PageSource;
driver.Quit();
driver.Dispose();

 以上三个方式都经错测试可用!

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值