2011-12-08 93 views
1

这可能是一个愚蠢的问题,其答案显而易见......但我无法得到它。查看页面源代码vs HTTPURLConnection

我试图读取使用Java程序的网页srouce如下图所示:

URL url = new URL(urlValue); 
HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
BufferedInputStream buffer = new BufferedInputStream(urlc.getInputStream()); 
StringBuilder builder = new StringBuilder(); 
byte[] by = new byte[1024]; 
int byteRead; 
while ((byteRead = buffer.read(by)) != -1){ 
    builder.append(new String(by, 0, byteRead)); 
} 
buffer.close(); 

这是所有工作正常,我可以看到网页的源文件... 当我打开在同一网址浏览器并右键单击它并查看页面源代码。 Java程序的页面源与我从浏览器中看到的不一样。

我只是想知道原因。 我错过了什么吗? 我该怎么做才能从java程序中得到完全相同的结果?

感谢, 伊尔凡

+1

有什么不同?查看源代码显示浏览器在渲染过程中所做的更改,以及某些情况下脚本所做的更改,例如IE将剥离属性和正常化大小写的引号...... –

回答

0

根据网站的逻辑,也可以通过用户代理进行过滤应用程序。

尝试把不同的“用户代理”标头。

的另一个原因没有得到正确的页面是,你不处理重定向。例如,如果您打开wsj.com,您的浏览器会自动重定向到online.wsj.com。为了管理这种情况,请在apache httpclient库中查看实现此功能的位置。

+0

谢谢...我会检查该问题。 – irbash

0
  1. 我觉得你的页面必须内的其他页面的引用。虽然你的浏览器通过这些引用自动读取文件,你应该分析你已经有了HTML和人工读取引用(或使用一些框架)
  2. 网站(urlValue)可以理解,你是机器人(通过用户代理)和不要返回页面的内容。尝试通过tcpmon嗅探你的连接。
+0

谢谢...我会尝试设置用户代理并尝试... – irbash

+0

我正在尝试使用htmlUnit的相同的东西...我得到类似的结果,像java程序,以及... – irbash

0

我不会这么做。

builder.append(new String(by, 0, byteRead));

相反,读取所有字节为ByteArrayOutputStream,然后转换为字符串。

在UTF-8或类似的字符集的情况下,一个符号并不总是一个字节。读入缓冲区的最后一个字节可能是多字节字符的一部分。当您转换为字符串时,字符串可能不正确,因为最后一个字符未完成。

0
urlc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"); 

通过添加此行将解决您的问题。我在这方面的研究,我发现这个主题没有解决方案,但结束了我尝试了各种方法,这显示了我想要的。