我使用Selenium / C#和Chrome来废弃一个网站,有一个我需要滚动的列表,并删除它的元素,现在当我继续滚动时,新的元素会显示出来,而且因为有数千个一旦计数达到50个元素,我将删除旧的元素,我用Javascript(注入)来实现这一点。
while (elementsCount > 50)
{
ReadOnlyCollection<IWebElement> first = driver.FindElements(By.XPath("//div[@role='dialog']//ul/li[position() <= 10]//div[@class='_gzjax']/a")); // select the first 10 elements
foreach (var item in first)
elements.Add(item.Text); // keep the elements before deleting them
// delete the first 10 elements
js.ExecuteScript("for(count = 0; count < 10; count++){ " +
"var elem = document.getElementsByClassName('_cx1ua')[0]; " +
"elem.parentNode.removeChild(elem); }");
}
这很有效!
因此,在大多数情况下,同时显示的元素不超过60个。现在,当我运行程序一段时间并且报废的元素超过10&000; Chrome的内存增加了有时它超过2gb。
我甚至尝试安装此extension来阻止图片下载(因为每个元素都附有图片),但仍然存在同样的问题。
在我不知情的情况下Chrome是否会存储?有没有办法删除它并保持当前页面的状态&#34;?
答案 0 :(得分:0)
Selenium会给网络抓取器带来很多开销,因为它会依赖浏览器的内存开销来呈现内容并将其显示给你的selenium驱动程序,无论你是否看到窗口。
您可以通过几种方法解决此问题。
我建议在http://html-agility-pack.net/?z=codeplex使用HtmlAgiltyPack 使用此敏捷包,您可以解析节点并获取更多数据并相应地存储/操作。
在下面我的网络蜘蛛的示例中,我使用MongoDB C#驱动程序来传递数据,但是你看到HtmlDocument是否是HtmlAgility Pack的一部分
BsonArray IPageCrawler.CrawlForTags(Uri url, HtmlDocument doc)
{
var bsonTagArray = new BsonArray();
if (doc.DocumentNode.SelectNodes("//*[self::h1 or self::h2 or self::h3]") == null)
{
return null;
}
foreach (var tag in doc.DocumentNode.SelectNodes("//*[self::h1 or self::h2 or self::h3]"))
{
if (tag.InnerHtml.Contains("href"))
{
var innerText = _contentHandler.CleanupString(tag.InnerText);
bsonTagArray.Add(new BsonDocument(new BsonElement(tag.Name, innerText)));
}
else
{
var tagAtt = _contentHandler.CleanupString(tag.WriteContentTo());
bsonTagArray.Add(new BsonDocument(new BsonElement(tag.Name, tagAtt)));
}
}
return bsonTagArray;
}
上面的代码将抓取页面中的所有超链接。我还有其他方法可以从任何页面中获取所有内容,到目前为止,即使在4Gb页面上也没有崩溃(因为下载的zip文件等)
您可以继续使用selenium并尝试使用selenium或其他第三方工具提供的无头浏览器支持来执行代码。 http://toolsqa.com/selenium-webdriver/headless-browser-testing-selenium-webdriver/
我相信PhantomJS是一种使用无头浏览器的好方法,它可以减少内存消耗http://phantomjs.org/