如何使用 Selenium 和 Java 加载和收集所有评论

问题描述 投票:0回答:1

我有一个 Java 应用程序,它使用 Selenium Web 驱动程序从 Google Play 商店应用程序中抓取/抓取信息。我有大约 30 个来自应用程序的链接,并且我在从每个应用程序收集ALL评论时遇到问题。 例如,this应用程序需要大量滚动才能加载所有评论,但其他一些应用程序需要更少/更多滚动。 如何动态加载每个应用程序的所有评论?

java selenium-webdriver web-scraping web-crawler
1个回答
0
投票

由于您尚未共享示例代码,我将共享 javascript 片段,然后提供一个 C# 实现,您可以在参考 Java Selenium 项目时使用它。

示例 JavaScript 代码

let i=0;
var element = document.querySelectorAll("div>span[jsname='bN97Pc']")[i];
var timer = setInterval(function()
{
    console.log(element);
    element.scrollIntoView();

        i++;
        element = document.querySelectorAll("div>span[jsname='bN97Pc']")[i];
        if(element===undefined)
            clearTimeout(timer);

},500);

一旦您进入包含共享评论的应用程序页面,在控制台中运行上述代码将滚动到页面末尾,同时在控制台上打印出每个评论。

带有 Selenium C# 绑定的示例代码:

static void Main(string[] args)
        {
            ChromeDriver driver = new ChromeDriver();
            driver.Navigate().GoToUrl("https://play.google.com/store/apps/details?id=com.plokia.ClassUp&hl=en&showAllReviews=true");

            ExtractComments(driver);
            driver.Quit();
        }

        private static void ExtractComments(ChromeDriver driver,int startingIndex=0)
        {
            IEnumerable<IWebElement> comments = driver.FindElementsByCssSelector(@"div>span[jsname='bN97Pc']");

            if (comments.Count() <= startingIndex)
                return; //no more new comments hence return.

            if (startingIndex > 0)
                comments = comments.Skip(startingIndex); //skip already processed elements


            //process located comments
            foreach (var comment in comments)
            {
                string commentText = comment.Text;
                Console.WriteLine(commentText);
                (driver as IJavaScriptExecutor).ExecuteScript("arguments[0].scrollIntoView()", comment);
                Thread.Sleep(250);
                startingIndex++;
            }

            Thread.Sleep(2000); // Let more comments load once we have consumed existing
            ExtractComments(driver,startingIndex); //Recursively call self to process any further comments that have been loaded after scrolling
        }

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.