Jsoup 超链接抓取不适用于某些网站
Jsoup hyperlink scraping not working for some websites
我最近一直在做一个项目,涉及从网站上抓取特定产品并报告可用性状态(如果有人好奇的话,是显卡)。
使用 JSOUP,我一直通过浏览产品列表页面、抓取所有链接并过滤掉适当的链接来做到这一点。对于某些网站,我的代码完全可以正常工作,但对于其他网站,我的代码会抓取一些甚至没有链接。
工作示例:
非工作示例:
- https://www.bestbuy.com/site/computer-cards-components/video-graphics-cards/abcat0507002.c?id=abcat0507002
- 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"));
}
}
我最近一直在做一个项目,涉及从网站上抓取特定产品并报告可用性状态(如果有人好奇的话,是显卡)。 使用 JSOUP,我一直通过浏览产品列表页面、抓取所有链接并过滤掉适当的链接来做到这一点。对于某些网站,我的代码完全可以正常工作,但对于其他网站,我的代码会抓取一些甚至没有链接。
工作示例:
非工作示例:
- https://www.bestbuy.com/site/computer-cards-components/video-graphics-cards/abcat0507002.c?id=abcat0507002
- 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"));
}
}