C#利用phantomJS抓取AjAX动态页面

Posted lbxob-tom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#利用phantomJS抓取AjAX动态页面相关的知识,希望对你有一定的参考价值。

 

在C#中,一般常用的请求方式,就是利用HttpWebRequest创建请求,返回报文。但是有时候遇到到动态加载的页面,却只能抓取部分内容,无法抓取到动态加载的内容。

如果遇到这种的话,推荐使用phantomJS无头浏览器。

开发之前,先准备两样东西。

1. phantomJS-2.1.1   官方下载地址:http://phantomjs.org/download.html

    技术分享图片

2. JS脚本文件,本人命名为codes.js.内容如下。起初我并没有配置page的settings信息,导致在抓取有些异步页面卡死。主要原因是由于没有配置请求头部信息。

var page = require(‘webpage‘).create(), system = require(‘system‘);
var url = system.args[1];
var interval = system.args[2];
var settings = {
    timeout: interval,
    encoding: "gb2312",
    operation: "GET",
    headers: {
        "User-Agent": system.args[3],
        "Accept": system.args[4],
        "Accept-Language": "zh-CN,en;q=0.7,en-US;q=0.3",
        "Connection": "keep-alive",
        "Upgrade-Insecure-Requests": 1,
        "Connection": "keep-alive",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "Referer": system.args[5]
    }
}
page.settings = settings;
page.open(url, function (status) {
    phantom.outputEncoding = "gb2312";
    if (status !== ‘success‘) {
        console.log(‘Unable to post!‘);
        phantom.exit();
    } else {
        setTimeout(function () {
            console.log(page.content);
            phantom.exit();
        }, interval);
    }
});

 准本完成之后,需要将这两份文件放到你的项目中。如下:

技术分享图片

这些都没问题了,就可以开始写后台代码了。

/// <summary>
        /// 利用phantomjs 爬取AJAX加载完成之后的页面
        /// JS脚本刷新时间间隔为1秒,防止页面AJAX请求时间过长导致数据无法获取
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string GetAjaxHtml(string url, HttpConfig config, int interval = 1000)
        {
            try
            {
                string path = System.AppDomain.CurrentDomain.BaseDirectory.ToString();
                ProcessStartInfo start = new ProcessStartInfo(path + @"phantomjsphantomjs.exe");//设置运行的命令行文件问ping.exe文件,这个文件系统会自己找到  
                start.WorkingDirectory = path + @"phantomjs";

                ////设置命令参数
                string commond = string.Format("{0} {1} {2} {3} {4} {5}", path + @"phantomjscodes.js", url, interval, config.UserAgent, config.Accept, config.Referer);
                start.Arguments = commond;
                StringBuilder sb = new StringBuilder();
                start.CreateNoWindow = true;//不显示dos命令行窗口  
                start.RedirectStandardOutput = true;//  
                start.RedirectStandardInput = true;//  
                start.UseShellExecute = false;//是否指定操作系统外壳进程启动程序  
                Process p = Process.Start(start);

                StreamReader reader = p.StandardOutput;//截取输出流                 
                string line = reader.ReadToEnd();//每次读取一行  
                string strRet = line;// sb.ToString();
                p.WaitForExit();//等待程序执行完退出进程  
                p.Close();//关闭进程   
                reader.Close();//关闭流  
                return strRet;
            }
            catch (Exception ex)
            {
                return ex.Message.ToString();
            }
        }
        public class HttpConfig
        {
            /// <summary>
            /// 网站cookie信息
            /// </summary>
            public string Cookie { get; set; }

            /// <summary>
            /// 页面Referer信息
            /// </summary>
            public string Referer { get; set; }

            /// <summary>
            /// 默认(text/html)
            /// </summary>
            public string ContentType { get; set; }

            public string Accept { get; set; }

            public string AcceptEncoding { get; set; }

            /// <summary>
            /// 超时时间(毫秒)默认100000
            /// </summary>
            public int Timeout { get; set; }

            public string UserAgent { get; set; }

            /// <summary>
            /// POST请求时,数据是否进行gzip压缩
            /// </summary>
            public bool GZipCompress { get; set; }

            public bool KeepAlive { get; set; }

            public string CharacterSet { get; set; }

            public HttpConfig()
            {
                this.Timeout = 100000;
                this.ContentType = "text/html; charset=" + Encoding.UTF8.WebName;

                this.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36";
                this.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
                this.AcceptEncoding = "gzip,deflate";
                this.GZipCompress = false;
                this.KeepAlive = true;
                this.CharacterSet = "UTF-8";
            }
        }

  这些也是本人今天才接触到的,整理下自己的想法。有错误之处还希望能够指出。

 

以上是关于C#利用phantomJS抓取AjAX动态页面的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

C#使用Selenium+PhantomJS抓取数据

C#使用Selenium+PhantomJS抓取数据

如何用JAVA爬取AJAX加载后的页面

scrapy实战4抓取ajax动态页面(以糗事百科APP为例子):

java爬虫怎么抓取js动态生成的内容