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 @ 2022-04-08 16:59  极客船长  阅读(61)  评论(0编辑  收藏  举报