尝试通过htmlUnit
加载页面时,我总是得到一个301 error
,即使完全相同的页面在浏览器中正常加载。
给我错误的代码是
public String getPage(String url) {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setRedirectEnabled(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
// webClient.getOptions().setTimeout();
final HtmlPage page = webClient.getPage(url);
return page.asText();
} catch (IOException ex) {
Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex);
} catch (FailingHttpStatusCodeException ex) {
Logger.getLogger(Worker.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
其中url
为http://www.instagram.com/name
(也尝试过https,同样的错误)
返回的错误是
> Jul 20, 2015 1:52:20 PM com.gargoylesoftware.htmlunit.WebClient
> printContentIfNecessary INFO: statusCode=[301] contentType=[text/html]
> Jul 20, 2015 1:52:20 PM com.gargoylesoftware.htmlunit.WebClient
> printContentIfNecessary INFO: <html> <head><title>301 Moved
> Permanently</title></head> <body bgcolor="white"> <center><h1>301
> Moved Permanently</h1></center> <hr><center>nginx</center> </body>
> </html>
然而,当我从浏览器转到http://www.instagram.com/name时,它会很好地加载。我听说Jsoup
可能对我想要做的事情有用(获取页面文本),但我对htmlUnit
更熟悉。如果你有我的代码或其他方法的修复,那么我很乐意尝试。
答案 0 :(得分:1)
我刚刚在浏览器中查看过。 301也在普通浏览器中发生。 301是永久性的&#34;重定向到
https://instagram.com/name
您可以通过
设置selenium webdriver的重定向行为webClient.getOptions().setRedirectEnabled(true);
关于Jsoup:
如果您尝试解析的页面是直接加载的,并且AJAX没有填充重要的DOM元素,那么Jsoup确实是更好的选择。它比硒实例快得多。我尽可能地更喜欢Jsoup。如果您需要更灵活地获取页面,那么您可能需要查看Apache HttpClient,我经常使用它来获取页面。我仍然使用JSoup,但仅用于解析,而不是实际上从网上获取页面。但是,如果工作很简单,并且您的网络访问不受代理和类似的阻碍,您可以简单地使用JSoup连接。 Selenium非常适合测试以及需要运行客户端JavaScript的情况。这个价格是它的记忆饥渴和缓慢。