【问题标题】:How to load and collect all comments with Selenium and Java如何使用 Selenium 和 Java 加载和收集所有评论
【发布时间】:2018-04-11 16:38:28
【问题描述】:

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

【问题讨论】:

  • 那你有没有试过写代码
  • @Roushan45 是的,有 250 行代码,但这些行对 cme​​ts 来说并不重要。
  • @Roushan45 在加载所有 cmets 之前,我不知道如何滚动。那是我的问题
  • 我相信所有 cmets 都会在 table 中,所以只需解析 table 并过滤文本

标签: java selenium-webdriver web-crawler scrape


【解决方案1】:

由于您尚未共享示例代码,我将共享 javascript sn-p,然后提供一个 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);

在您使用已共享的 cmets 进入应用程序页面后,在控制台中运行上述代码将滚动到页面末尾,同时在控制台上打印出每条评论。

带有 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
        }

希望这会有所帮助。

【讨论】:

  • 我会试一试,让你知道它是否有效。谢谢。
猜你喜欢
  • 2021-08-29
  • 2022-01-16
  • 2021-04-03
  • 2021-02-27
  • 1970-01-01
  • 2021-02-20
  • 2020-10-25
  • 2022-06-25
  • 1970-01-01
相关资源
最近更新 更多