【发布时间】: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