C# 硒及;Chrome使用了太多内存

C# 硒及;Chrome使用了太多内存,c#,google-chrome,selenium,selenium-chromedriver,C#,Google Chrome,Selenium,Selenium Chromedriver,我正在使用Selenium/C#和Chrome来删除一个网站,我需要滚动一个列表,并删除其中的元素,现在当我不断滚动显示新元素时,由于有数千个元素,一旦数量达到50个元素,我就会删除旧元素,我正在使用Javascript(注入)实现这一点 while(elementscont>50) { ReadOnlyCollection first=driver.FindElements(By.XPath(“//div[@role='dialog']//ul/li[position()Selenium)将给

我正在使用Selenium/C#和Chrome来删除一个网站,我需要滚动一个列表,并删除其中的元素,现在当我不断滚动显示新元素时,由于有数千个元素,一旦数量达到50个元素,我就会删除旧元素,我正在使用Javascript(注入)实现这一点

while(elementscont>50)
{

ReadOnlyCollection first=driver.FindElements(By.XPath(“//div[@role='dialog']//ul/li[position()Selenium)将给web scraper带来很大的开销,因为它将依赖浏览器的内存开销来呈现内容并将其显示给Selenium驱动程序,无论您是否看到窗口

你有几个选择来解决这个问题

选项1 我建议在 有了这个敏捷包,您可以解析节点,获取更多的数据并相应地存储/操作

在下面的WebSpider示例中,我使用MongoDB C#驱动程序传递数据,但是您看到的HtmlDocument是HtmlAgility包的一部分

    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文件,等等)

选择2 您可以继续使用selenium,并尝试使用selenium或其他第三方工具提供的无头浏览器支持来执行代码


我相信PhantomJS是使用无头浏览器的一个非常好的方法,它将减少内存消耗

看起来你一直在添加
元素,然后再也不从中删除。@Titusrucretius元素实际上只是一个本地列表,它与ChromeCan无关。你可以发布你正在抓取的网站的URL,然后请提供更多关于您试图捕获的内容的信息?使用JS删除元素似乎是一种低效的方法。您是否尝试过手动执行此测试?使用脚本与手动的内存使用情况是否不同?如果元素与JavaScripts事件绑定,我想删除这些元素不会有帮助,因为它们将作为一个d保存在内存中etached DOM.@JeffC谢谢你的评论,我正在尝试捕获Instagram用户追随者的用户名!当你单击追随者按钮时,会出现一个对话框,其中有一个用户列表,这就是我滚动浏览的内容。谢谢你的回答!我没有使用HtmlAgiltyPack的原因是在你不断滚动的时候重新加载AJAX,所以我需要一个真正的浏览器来完成这项工作!我以前使用过PhantomJS,我从没想过它会比Chrome更好,我会尝试一下,让你知道Chrome有无头浏览功能now@TitusLucretiusChrome headless不会减少内存使用(2017年8月)。因此它不会有帮助。
    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;
   }