【问题标题】:How to keep phantomjs webdriver from using up all of my ports如何防止 phantomjs webdriver 用完我的所有端口
【发布时间】:2017-02-07 03:26:19
【问题描述】:

我正在尝试从无限滚动的页面中抓取数据。该页面显示最终可以从无限滚动中加载的项目总数。鉴于这些需求/环境,我在循环中使用了 phantomjs 的 webdriver 来向下滚动,抓取所有项目,并检查我们是否已经达到最大值。不幸的是,我的代码不断出现错误说明

Only one usage of each socket address (protocol/network address/port) is normally permitted

据我所知,我的代码导致所有端口在短时间内在单个请求中被用完,并且在此处https://blogs.msdn.microsoft.com/dgorti/2005/09/18/only-one-usage-of-each-socket-address-protocolnetwork-addressport-is-normally-permitted/ 概述的 4 分钟默认时间之前未释放端口。

我的应用程序需要部署在 Azure Web 应用程序上,我找不到任何文档来演示如何使端口立即在该平台上可供重用。

我的问题是如何让我的应用程序重用端口,这样我就不会用完它们,或者如何使端口立即可供重用。违规代码如下

            var driver = new PhantomJSDriver();
        List<string> links = new List<string>();
        try
        {
            driver.Navigate().GoToUrl(SEARCH_URL);

            var countOfProjects = Convert.ToInt32(driver.FindElementByClassName("count").GetAttribute("innerHTML").ToString().Replace(",", ""));

            var loadMoreDiv = driver.FindElementByClassName("load_more");
            var loadMoreLink = loadMoreDiv.FindElement(By.ClassName("btn--border-gray"));
            loadMoreLink.Click();

            IJavaScriptExecutor js = (IJavaScriptExecutor)driver;

            var projects = driver.FindElementsByClassName("project-thumbnail-wrap");
            links = projects.Select(x => x.GetAttribute("href")).ToList();

            js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");

            do
            {
                links.AddRange(driver.FindElementsByClassName("project-thumbnail-wrap").Select(x => x.GetAttribute("href")).ToList());

                links = links.Distinct().ToList();

                js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);");

            }
            while (links.Count() < countOfProjects);
        }
        catch(Exception ex)
        {
            Console.WriteLine("Failed to download entire list");
            return links;
        }
        return links;

【问题讨论】:

    标签: c# azure selenium phantomjs port


    【解决方案1】:

    我找到了一个解决方法,暂时为我解决了这个问题。我在循环中删除了对 js.ExecuteScript 的调用。相反,我运行了将连续向下滚动的 javascript 脚本,并在我的循环中添加了 500 毫秒的睡眠,因此它以与我的 javascript 相同的速度更新。这导致错误消失,但我不知道为什么调用 javascript 会占用一个端口。

    如果有人发现了答案,我将更改我接受的答案。

    var timeId=setInterval(function(){window.scrollTo(0,document.body.scrollHeight)},500);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      相关资源
      最近更新 更多