我最近一直在從事一個專案,該專案涉及從網站上抓取特定產品并報告可用性狀態(如果有人好奇,請使用顯卡)。使用 JSOUP,我一直在通過瀏覽產品串列頁面、抓取所有鏈接并過濾掉適當的鏈接來做到這一點。對于某些網站,我的代碼完全可以正常作業,但對于其他網站,我的代碼會抓取一些甚至沒有鏈接。
作業示例:
- https://www.bhphotovideo.com/c/buy/Graphic-Cards/ci/6567
非作業示例:
- 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();
}
}
}
我知道我正在做的事情絕不是有效的,所以如果有人對我如何以更好的方式做到這一點有任何建議,請告訴我:)
uj5u.com熱心網友回復:
在這種情況下,您需要一個允許等待加載 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"));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407901.html
標籤:
下一篇:使用HtmlUnit抓取整行
