使用 HTMLUnit Java 进行网页抓取
Web Scraping with Java using HTMLUnit
我正在尝试网络抓取 https://www.nba.com/standings#/
这是我的代码
我想使用的是 page.getByXPath("//caption[@class='standings__header']/span")
哪个应该拉回东区和西区,却什么也没拉回我不明白是不是我的Xpath有问题?
package Standings;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Standings {
private static final String baseUrl = "https://www.nba.com/standings#/";
public static void main(String[] args) {
WebClient client = new WebClient();
client.getOptions().setJavaScriptEnabled(false);
client.getOptions().setCssEnabled(false);
client.getOptions().setUseInsecureSSL(true);
String jsonString = "";
ObjectMapper mapper = new ObjectMapper();
try {
HtmlPage page = client.getPage(baseUrl);
System.out.println(page.asXml());
page.getByXPath("//caption[@class='standings__header']/span")
} catch (IOException e) {
e.printStackTrace();
}
}
}
您尝试抓取的页面需要 Javascript 才能正常显示。如果禁用它,大多数元素将不会加载。
换行
client.getOptions().setJavaScriptEnabled(false);
到
client.getOptions().setJavaScriptEnabled(true);
应该可以解决问题
已使用此代码验证您的问题:
public static void main(String[] args) throws IOException {
final String url = "https://www.nba.com/standings#/";
try (final WebClient webClient = new WebClient()) {
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setUseInsecureSSL(true);
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000);
System.out.println(page.asXml());
}
}
当运行这时,我在日志中收到了一堆警告和错误。
(顺便说一句:当 运行 真正的浏览器时,该页面也会产生许多 error/warnings。似乎该页面的维护者对质量有一个有趣的看法)
我猜有问题的错误是这个
TypeError:无法修改只读 属性:构造函数。 (https://www.nba.com/ng/game/main.js#1)
HtmlUnit (https://sourceforge.net/p/htmlunit/bugs/1897/) 的 javascript 支持存在一个已知错误。因为错误是从 main.js 抛出的,所以我猜这会在生成您要查找的内容之前停止页面 javascript 的处理。
到目前为止我没有时间修复这个问题(看起来这必须在 Rhino 中修复)但是这个在列表中。
查看 https://twitter.com/HtmlUnit 了解更新。
我正在尝试网络抓取 https://www.nba.com/standings#/
这是我的代码
我想使用的是 page.getByXPath("//caption[@class='standings__header']/span")
哪个应该拉回东区和西区,却什么也没拉回我不明白是不是我的Xpath有问题?
package Standings;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Standings {
private static final String baseUrl = "https://www.nba.com/standings#/";
public static void main(String[] args) {
WebClient client = new WebClient();
client.getOptions().setJavaScriptEnabled(false);
client.getOptions().setCssEnabled(false);
client.getOptions().setUseInsecureSSL(true);
String jsonString = "";
ObjectMapper mapper = new ObjectMapper();
try {
HtmlPage page = client.getPage(baseUrl);
System.out.println(page.asXml());
page.getByXPath("//caption[@class='standings__header']/span")
} catch (IOException e) {
e.printStackTrace();
}
}
}
您尝试抓取的页面需要 Javascript 才能正常显示。如果禁用它,大多数元素将不会加载。 换行
client.getOptions().setJavaScriptEnabled(false);
到
client.getOptions().setJavaScriptEnabled(true);
应该可以解决问题
已使用此代码验证您的问题:
public static void main(String[] args) throws IOException {
final String url = "https://www.nba.com/standings#/";
try (final WebClient webClient = new WebClient()) {
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setUseInsecureSSL(true);
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000);
System.out.println(page.asXml());
}
}
当运行这时,我在日志中收到了一堆警告和错误。
(顺便说一句:当 运行 真正的浏览器时,该页面也会产生许多 error/warnings。似乎该页面的维护者对质量有一个有趣的看法)
我猜有问题的错误是这个
TypeError:无法修改只读 属性:构造函数。 (https://www.nba.com/ng/game/main.js#1)
HtmlUnit (https://sourceforge.net/p/htmlunit/bugs/1897/) 的 javascript 支持存在一个已知错误。因为错误是从 main.js 抛出的,所以我猜这会在生成您要查找的内容之前停止页面 javascript 的处理。
到目前为止我没有时间修复这个问题(看起来这必须在 Rhino 中修复)但是这个在列表中。
查看 https://twitter.com/HtmlUnit 了解更新。