Jsoup 超链接抓取不适用于某些网站

Jsoup hyperlink scraping not working for some websites

我最近一直在做一个项目,涉及从网站上抓取特定产品并报告可用性状态(如果有人好奇的话,是显卡)。 使用 JSOUP,我一直通过浏览产品列表页面、抓取所有链接并过滤掉适当的链接来做到这一点。对于某些网站,我的代码完全可以正常工作,但对于其他网站,我的代码会抓取一些甚至没有链接。

工作示例:

  1. https://www.bhphotovideo.com/c/buy/Graphic-Cards/ci/6567

非工作示例:

  1. https://www.bestbuy.com/site/computer-cards-components/video-graphics-cards/abcat0507002.c?id=abcat0507002
  2. https://www.evga.com/products/productlist.aspx?type=0

以下是负责抓取链接的代码片段:

public class LinkScrapeLite {

    public static void main(String[] args) {
        try {

            Document doc = Jsoup.connect("https://www.evga.com/products/productlist.aspx?type=0").get(); //Evga gives me no output whatsoever

            String title = doc.title();
            System.out.println("title: " + title);

            Elements links = doc.select("a[href]");
            for (Element link : links) {
                // get the value from the href attribute
                System.out.println("nlink: " + link.attr("href"));
                System.out.println("text: " + link.text());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我知道我正在做的事情绝不是有效的,所以如果有人对我如何以更好的方式做到这一点有任何建议,请告诉我:)


在这种情况下,您需要一个允许等待加载 javascript 的库,例如我们可以使用 htmlunit

这是 evga 站点的解决方案:

String url = "https://www.evga.com/products/productlist.aspx?type=0";

        try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
            webClient.getOptions().setThrowExceptionOnScriptError(false);
            webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
            webClient.getOptions().setPrintContentOnFailingStatusCode(false);
            HtmlPage htmlPage = webClient.getPage(url);
            webClient.waitForBackgroundJavaScript(1000);
            webClient.waitForBackgroundJavaScriptStartingBefore(1000);
            final List<DomElement> hrefs = htmlPage.getByXPath("//a");
            for (DomElement element : hrefs) {
                System.out.println(element.getAttribute("href"));
            }
        }