我正在使用HtmlUnit作为网站的Web Scraper。基本上我正在编写代码来证明它(并向我自己证明我可以做到),但是我将在实际项目中使用的一些代码。我遇到了一个在即将到来的项目中非常重要的问题。发生的事情是我正在浏览网站以访问网站上的搜索功能。这需要登录。我已经创建了一个虚拟的Gmail帐户来登录该网站。唯一的问题是,单击登录按钮有时可以正常工作,有时会抛出错误消息。使用print语句,无论代码是否抛出错误消息,我都可以看到该按钮是相同的。这是我的代码:
public static void main (String args[] ) throws Exception {
WebClient webClient = new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
String url = "http://tappedout.net/";
HtmlPage page = webClient.getPage(url);
HtmlAnchor deckBuilderLink = (HtmlAnchor) page.getByXPath("//a").get(3);
HtmlPage deckBuilderPage = deckBuilderLink.click();
url = deckBuilderPage.toString().substring(9).substring(0, 38);
HtmlAnchor advancedSearchLink = (HtmlAnchor) deckBuilderPage.getByXPath("//a[@class=\"btn btn-primary btn-block active\"]").get(0);
HtmlPage advancedSearchPage = advancedSearchLink.click();
HtmlInput usernameInput = (HtmlInput) advancedSearchPage.getByXPath("//input[@name=\"username\"]").get(0);
usernameInput.setValueAttribute("tappedoutScraper");
HtmlInput passwordInput = (HtmlInput) advancedSearchPage.getByXPath("//input[@name=\"password\"]").get(0);
passwordInput.setValueAttribute("&tappedoutScraper3");
System.out.println(advancedSearchPage);
HtmlInput button = (HtmlInput) advancedSearchPage.getByXPath("//input[@value=\"Log in\"]").get(0);
System.out.println(button);
advancedSearchPage = button.click();
System.out.println(advancedSearchPage);
}
那么,为什么会这样呢?我该如何解决?在此先感谢并抱歉任何格式不正确的代码,这就是我学习格式化的方法。
编辑: 这是错误消息:
线程“main”中的异常com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException:503 https://tappedout.net/mtg-decks/search/暂时不可用的服务 在com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java:590) 在com.gargoylesoftware.htmlunit.WebClient.loadDownloadedResponses(WebClient.java:2255) 在com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:945) 在com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.processPostponedActions(JavaScriptEngine.java:1035) 在com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:1032) 在com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:973) 在com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:903) 在com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:884) 在com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:865) 在Test.main(Test.java:43)
答案 0 :(得分:1)
获取503响应代码是在服务器端完成的。看起来有点像服务器进行某种报废或拒绝服务检测,如果他认为请求是攻击,则将网址内容声明为暂时不可用。已经看到有人在对同一个网址的下一个请求之间进行了一些随机长度暂停。