当前位置: 移动技术网 > IT编程>开发语言>.net > .net 信息采集ajax数据

.net 信息采集ajax数据

2018年08月26日  | 移动技术网IT编程  | 我要评论

聚美优品多假货,比中国足球更sb的球队,年年好节节高

.net 信息采集ajax数据

关于.net信息采集的资料很多,但是如果采集的网站是ajax异步加载数据的模式,又如何采集呢?今天就把自己做信息采集时,所遇到的一些问题和心得跟大家分享一下。

采集网站的几种方式与利弊:

  1. httpwebrequest

利用系统自带httpwebrequest对象,采集网站内容,优点是采集效率快,但是如果网站是ajax异步加载数据的方式,是采集不到网页内容的,并且网站没有采用ajax的方式,在网页中用到了javascript,比如说:网页内容用document.write的方式输出到网页中的,这种情况也是获取不到内容的。其次还需要知道对方网站的编码格式(就是网页头部中<meta charset="utf-8"/>),如果采集时网站编码格式错误的话,会导致采集的内容是乱码。但这个是小问题,我自己当时查阅资料时找到了别人封装好的方法,但是很惭愧因为不知道作者是谁了,我会把相应的代码下载链接提供给大家。以上的问题是因为js和ajax是需要浏览器去解析的,所以导致了获取不到网页内容。

help.httphelp.httprequest("采集的网址");

源码下载地址

          2.浏览器控件

因为当时我开发的时候,用的是cs模式,相信大家同样也会用cs的模式去开发这个功能。既然是cs模式(不考虑美观)的情况下肯定是winform,winform中有自带的浏览器控件,这个是不好用的,我当时用的是geckofx,基于火狐内核的一款浏览器控件,但是这方面的资料很少,当时遇到了一些问题都找不到解决方法,但后来还是都解决了。用了该控件就可以获取到ajax异步加载的数据,在网页加载完成之后,延迟几秒钟获取网页内容,就可以很方便的获取到网页内容,缺点是相对第一种方案来说的话会慢一些,因为它是一个浏览器控件,需要渲染html和解析js等操作。

geckofx下载

geckowebbrowser webbrowser = null;

        private void form1_load(object sender, eventargs e)
        {
            string xulrunnerpath = appdomain.currentdomain.basedirectory + "\\bin";
            xpcom.initialize(xulrunnerpath);
            //设置为3阻止所有的弹出窗口,
            geckopreferences.user["privacy.popups.disable_from_plugins"] = 3;
            //禁止加载图片
            geckopreferences.user["permissions.default.image"] = 2;

            webbrowser = new geckowebbrowser();
            webbrowser.navigate("http://www.baidu.com");
            webbrowser.documentcompleted += documentcompleted;
        }

        private void documentcompleted(object sender, gecko.events.geckodocumentcompletedeventargs e)
        {
            var time = new system.windows.forms.timer();
            time.interval = 2000;
            time.tick += (a, b) =>
            {
                time.stop();
                string html = "";
                //页加载完成
                geckohtmlelement element = null;
                var geckodomelement = webbrowser.document.documentelement;
                if (geckodomelement != null && geckodomelement is geckohtmlelement)
                {
                    element = (geckohtmlelement)geckodomelement;
                    //网页内容
                    html = element.innerhtml;
                    txthtml.text = html;
  /*
                    //通过xpath 查找class为btnlogin的元素
                    geckonode btnlogin = webbrowser.document.selectfirst(".//*[@class='btnlogin']");
                    if (btnlogin != null)
                    {
                        geckohtmlelement ie = btnlogin as geckohtmlelement;
                        //手动触发点击事件
                        ie.click();
                    }*/ } }; time.start(); }

 

         3.phantomjs

phantomjs可以把它理解为也是一个浏览器控件,只不过它使用qtwebkit作为它核心浏览器的功能,使用webkit来编译解释执行javascript代码。利用该组件就可以很方便的获取到网页内容,同时也包括了ajax加载的数据,如果是分页的情况下,首次加载不需要延迟,如果获取第2页及以上内容的话同样也需要延迟才能获取到,并且它可以很方便的完成网页快照(就是网页截屏),至于其他的功能大家可以自己查阅一下资料。

phantomjs下载地址

  iwebdriver driver = null;

        private void btngo_click(object sender, eventargs e)
        {
            string phantomjsdire = appdomain.currentdomain.basedirectory;

            phantomjsdriverservice service = phantomjsdriverservice.createdefaultservice(phantomjsdire);
            service.ignoresslerrors = true;
            service.loadimages = false;
            service.proxytype = "none";

            driver = new phantomjsdriver(phantomjsdire);
            /*iwindow iwindow = driver.manage().window;
            iwindow.size = new size(10,10);
            iwindow.position = new point(0, 600);*/

            driver.navigate().gotourl(textbox1.text);
            string html = driver.pagesource;
            txthtml.text = html;

            //driver.close();
            //driver.quit();
        }

        private void btnpage_click(object sender, eventargs e)
        {
            //  .//*[@class='next'][text()='下一页']
            //  .//*[@class='text']
            //  .//*[@class='button']
            //iwebelement element = driver.findelement(by.xpath(".//*[@class='text']"));
            //给网页中文本框赋值
            //element.sendkeys("4");

            iwebelement btnelement = driver.findelement(by.xpath(".//*[@class='next'][text()='下一页']"));
            btnelement.click();

            var time = new system.windows.forms.timer();
            time.interval = 2 * 1000;
            time.tick += (a, b) =>
            {
                time.stop();
                string html = driver.pagesource;
                txthtml.text = html;
            };
            time.start();
        }

 网站内容中url地址如果是相对地址的话,就是../../a.html,这种情况要想获取绝对地址的话,可以用以下方法:

        /// <summary>
        /// 获取绝对url地址
        /// </summary>
        /// <param name="baseuri">当前页地址</param>
        /// <param name="relativeuri">相对路径地址</param>
        /// <returns></returns>
        public static string getrealurl(string baseuri, string relativeuri)
        {
            try
            {
                baseuri = system.web.httputility.urldecode(baseuri);
                relativeuri = system.web.httputility.urldecode(relativeuri);
                uri baseurimodel = new uri(baseuri);
                uri uri = new uri(baseurimodel, relativeuri);
                string result = uri.tostring();
                baseurimodel = null;
                uri = null;
                return result;
            }
            catch (exception ex)
            {
            }
            return relativeuri;
        }

 

  总结:

以上说的第2、3种方式都可以获取到ajax异步加载的内容,同时还能通过xpath模式查找网页中的元素,例如分页标签和按钮,找到元素之后可以调用click点击事件,就能轻松的解决分页问题。好多网站分页分到最后一页的时候,处理的情况都不一样,需要自己去处理,例如有的隐藏下一页按钮、有的是禁用等等。

获取到网页内容之后,要想获取自己需要的内容,可以通过htmlagilitypack插件,它是通过xpath的模式查找内容。

以下我会将自己开发的信息采集系统截图发出来。

 

欢迎任何形式的转载,但请务必注明出处。

文案功底有限,码字不易,不喜勿喷,如果文章和代码有表述不当之处,还请不吝赐教。

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网