PhantomJs自动化请求页面,加入了重启机制避免内存耗尽

复制代码
 private static PhantomJSDriverService GetPhantomJSDriverService()
        {
            PhantomJSDriverService pds = PhantomJSDriverService.CreateDefaultService("D:/");//Phantomjs.exe 需要放到指定的路径下面
            pds.LoadImages = false;
            pds.HideCommandPromptWindow = true;
            pds.IgnoreSslErrors = true;
            //设置代理服务器地址
            //pds.Proxy = $"{ip}:{port}";  
            //设置代理服务器认证信息
            //pds.ProxyAuthentication = GetProxyAuthorization();
            return pds;
        }
        private static void RunTask(Dictionary<string, DataTable> dic)
        {
            IWebDriver driver = new PhantomJSDriver(GetPhantomJSDriverService());
            foreach (var urlTemplate in dic.Keys)
            {
                DataTable dt = dic[urlTemplate];
                int times = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    times++;
                    if (times % 50 == 0)
                    {
                        driver.Quit();
                        driver = new PhantomJSDriver(GetPhantomJSDriverService());
                        Console.WriteLine("重启浏览器");
                    }
                    var url = string.Format(urlTemplate, Dc.ToInt(dr["ID"]));
                    driver.Navigate().GoToUrl(url);
                    try
                    {
                        Console.WriteLine(driver.Title);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("遇到异常:" + ex.Message);
                        driver.Quit();
                        driver.Dispose();
                        driver = new PhantomJSDriver(GetPhantomJSDriverService());
                    }
                }
            }
            if (driver != null)
            {
                driver.Quit();
            }
        }
        static ConsoleEventDelegate handler;   // Keeps it from getting garbage collected
        static bool ConsoleEventCallback(int eventType)
        {
            if (eventType == 2)
            {
                List<Process> pList = Process.GetProcessesByName("phantomjs").ToList();
                pList.ForEach(i => i.Kill());
            }
            return false;
        }
        private delegate bool ConsoleEventDelegate(int eventType);
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
复制代码

 

posted @   极客船长  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示