在java中下载网页的问题?

时间:2012-12-06 22:17:35

标签: java web

所以我试图用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屏幕。

有人可以帮忙解释一下吗?任何帮助将不胜感激。

2 个答案:

答案 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);
        }
    }
}