所以我试图用java下载aspx网页(Roblox)的文本。我的代码如下所示:
URL url;
InputStream is = null;
DataInputStream dis;
String line = "";
try {
System.out.println("connecting");
url = new URL("http://www.roblox.com");
is = url.openStream(); // throws an IOException
dis = new DataInputStream(new BufferedInputStream(is));
while ((line = dis.readLine()) != null) {
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
is.close();
} catch (IOException ioe) {}
}
它适用于www.roblox.com。但是,当我尝试导航到其他页面时http://www.roblox.com/My/Money.aspx#/#TradeCurrency_tab - 它不起作用,只需加载www.roblox.com屏幕。
有人可以帮忙解释一下吗?任何帮助将不胜感激。
答案 0 :(得分:0)
根据URL和#的使用来判断我怀疑这个页面是使用javascript来动态创建页面。
您可以使用类似http://seleniumhq.org/的内容来模拟网络浏览器(包括Cookie),对于任何类型的动态网络内容,这都是一种更可靠的方法。
// The Firefox driver supports javascript
WebDriver driver = new FirefoxDriver();
// Go to the roblox page
driver.get("http://www.roblox.com");
System.out.println(driver.getPageSource());
当然,有很多更好的方法可以通过Selenium的WebDriver API访问页面元素:http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.html
将JAR和所有deps下载到一个文件中:http://code.google.com/p/selenium/downloads/detail?name=selenium-server-standalone-2.27.0.jar
请注意,您可以通过代码导航到其他页面:http://seleniumhq.org/docs/03_webdriver.html -
WebElement link = driver.findElement(By.linkText("Click Here Or Whatever"));
link.click();
然后
System.out.println(driver.getPageSource());
将在下一页上获取页面文本。
答案 1 :(得分:0)
您在java中获得的内容与在浏览器中看到的不同,因为服务器会在响应中添加以下标题:
Location=https://www.roblox.com/Login/Default.aspx?ReturnUrl=%2fMy%2fMoney.aspx
如果存在“位置”标题,您应该从URLConnection获取标题值并手动重定向。据我所知,即使你使用了HttpConnection,你也不会自动重定向到'https'
已编辑:
你可以像这样使用smth(我删除了其他代码,例如异常处理只是为了专注于重定向,所以不要把它作为正确的'编码'示例):
public static void main(String[] args) throws Exception {
printPage("http://www.roblox.com/My/Money.aspx#/#TradeCurrency_tab");
}
public static void printPage(String address) throws Exception {
String line = null;
System.out.println("connecting to:" + address);
URL url = new URL(address);
URLConnection conn = url.openConnection();
String redirectAdress = conn.getHeaderField("Location");
if (redirectAdress != null) {
printPage(redirectAdress);
} else {
InputStream is = url.openStream();
DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
while ((line = dis.readLine()) != null) {
System.out.println(line);
}
}
}