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



我最近一直在做一个项目,该项目涉及从网站上抓取特定产品并报告可用性状态(如果有人好奇,请使用显卡(。使用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"));
}
}

最新更新