【问题标题】:How to optimize the scroll-down code in java using selenium如何使用 selenium 优化 java 中的向下滚动代码
【发布时间】:2025-12-10 04:30:01
【问题描述】:

我正在使用 JavaMAVEN 中开展一个项目。 我必须获取一个 URL,向下滚动它们,然后获取该网页中其他项目的所有链接。

到目前为止,我使用 Selenium 动态获取页面,并向下滚动它们,并获取链接。但这需要太多时间。请帮我优化一下。

示例:-,我正在处理一个页面,其链接是here

我的问题:-

  1. 使用 selenium 滚动网页非常慢。我该如何优化呢? (建议任何其他方法
    做同样的事情或帮助我优化这个)

提前致谢。期待您的善意回应。

动态获取和滚动页面的代码:-

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import com.google.common.collect.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

/**
 *
 * @author jhamb
 */
public class Scroll_down {

    private static FirefoxProfile createFirefoxProfile() {
        File profileDir = new File("/tmp/firefox-profile-dir");
        if (profileDir.exists()) {
            return new FirefoxProfile(profileDir);
        }
        FirefoxProfile firefoxProfile = new FirefoxProfile();
        File dir = firefoxProfile.layoutOnDisk();
        try {
            profileDir.mkdirs();
            FileUtils.copyDirectory(dir, profileDir);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return firefoxProfile;
    }



    public static void main(String[] args)  throws InterruptedException{
        String url1 = "http://www.jabong.com/men/shoes/men-sports-shoes/?source=home-leftnav";
        System.out.println("Fetching %s..." + url1);
        WebDriver driver = new FirefoxDriver(createFirefoxProfile());


        driver.get(url1);  

        JavascriptExecutor jse = (JavascriptExecutor)driver;
        jse.executeScript("window.scrollBy(0,250)", "");
        for (int second = 0;; second++) {
            if (second >= 60) {
                break;
            }
            jse.executeScript("window.scrollBy(0,200)", "");
            Thread.sleep(1000);
        }
            String hml = driver.getPageSource();
        driver.close();


        Document document = Jsoup.parse(hml);

            Elements links = document.select("div");

        for (Element link : links) {
            System.out.println(link.attr("data-url"));
        }
    }
}

【问题讨论】:

  • @All 请帮帮我。向下滚动过程需要大量时间。
  • 滚动有什么好处?怎么有必要?
  • @EliranMalka 我正在处理在线购物网站数据,如亚马逊、Flipkart 等。而且,当我们向下滚动时,页面会加载,它会显示更多产品,所以如果我提供任何 URL,那么它滚动到 end ,然后获取其中存在的所有链接。我编写了整个功能,但这很慢。告诉我如何在我的代码中优化这个滚动部分。请。

标签: java javascript selenium web-crawler jsoup


【解决方案1】:

Selenium 滚动是基于 Javascript 的。不过,我不知道您使用 selenium 的目标,您没有断言可以比较代码中的任何内容吗? 当您确信您的数据获取速度如此之快时,请不要使用任何睡眠方法。 睡眠方法使硒变慢,但是是的,它正在等待元素正确加载..... 这取决于你,但要测试什么

【讨论】:

  • 我想向下滚动页面,当它到达最后,然后使用Jsoup获取其他产品的所有内部链接。你知道任何其他相同的优化方法吗?如果我删除睡眠,那么此代码并非在每种情况下都变得可靠。所以请告诉我任何可靠且优化的方法。
  • 我看到了你的链接,问题是每页的产品数量没有限制,所以基本上页面到达结束后仍然会继续加载。至于回答您的问题,为什么不将滚动像素增加一点。但正如我所说,慢是因为页面中没有项目限制!
  • 请您解释一下您的倒数第二行。如果您有比我更好的想法,您能否提供一些实现线索?
  • JavascriptExecutor jse = (JavascriptExecutor)驱动程序; jse.executeScript("window.scrollBy(0,250)", ""); for (int second = 0;; second++) { if (second >= 60) { break; } jse.executeScript("window.scrollBy(0,200)", "");线程.sleep(1000); } 字符串 hml = driver.getPageSource();这段代码为什么不写 0,200 而不是 0,1000,更大 == 更快:D
  • 将值从 200 更改为 1000 是否会导致互联网连接速度变慢?
【解决方案2】:

向下翻页怎么样?

ele.sendKeys(Keys.PAGE_DOWN);   //WebElement ele = <Any existing element>

重复此操作,直到找到该特定项目。

【讨论】: