日期:2014-05-20  浏览次数:20680 次

再次提问:关于如何获得网页源文件的问题
我前几天在CSDN提过这个问题,当时认为解决了,所以把帖子结了。但是现在觉得还有问题。
上次问题详见
http://community.csdn.net/Expert/topic/5477/5477582.xml?temp=.1753656

我按照他们说的写了如下程序,但测试时有问题
import   java.io.BufferedReader;
import   java.io.IOException;
import   java.io.InputStreamReader;
import   java.net.URL;

public   class   TestUrl2   {
public   static   void   main(String[]   args)   throws   IOException{
URL   url   =   new   URL( "https://catalog.invitrogen.com/index.cfm?fuseaction=viewCatalog.viewProductDetails&productDescription=30495& ");
BufferedReader   br   =   new   BufferedReader(new   InputStreamReader(url.openStream()));
String   str   =   null;
while   ((str   =   br.readLine())   !=   null)
System.out.println(str);
br.close();
}
}
我把该程序打印出的结果(也就是通过程序得到的源文件)复制下了,粘贴到记事本。然后在浏览器的地址栏里直接输入以下以下地址https://catalog.invitrogen.com/index.cfm?fuseaction=viewCatalog.viewProductDetails&productDescription=30495&并点浏览器的查看--查看源文件。也得到的一个文本文件。我发现两个文件是不一样的。说明这个程序有局限性,我测试过,只有纯静态网页才能得到正确的源文件,而对某些动态网页则不行,大家看一下怎么修改才好。谢谢

------解决方案--------------------
两个文件哪些地方是不一样的?
------解决方案--------------------
需要把页面内要提交的property都加到你的请求request的里面来仿真原来页面的提交,如果提交的property不全,很可能被对方拦截器给拦截下来,从而把你的请求转到错误页面去~
另外你可以看看HttpClient方式~
------解决方案--------------------
动态网页?解释脚本要浏览器支持的吧。你可以用COM来操作IE,或者改改Mozilla的源代码


------解决方案--------------------
你第一次通过浏览器访问该网站的时候把你的选择保存在cookie中了,所以再访问的时候不必再选择语言
------解决方案--------------------
public static void main(String[] args) {
// TODO Auto-generated method stub
String url= "https://catalog.invitrogen.com/index.cfm?fuseaction=viewCatalog.viewProductDetails&productDescription=30495& ";
URL destURL=null;
URLConnection urlConn=null;
StringBuffer result = new StringBuffer( " ");
try{
destURL = new URL(url);
urlConn = (URLConnection) destURL.openConnection();
InputStream inStream = urlConn.getInputStream();
inStream = new BufferedInputStream(inStream);
Reader reader = new InputStreamReader(inStream, "GBK ");
int ch;
while ((ch = reader.read()) > = 0) {
result.append((char) ch);
}
inStream.close();
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(result.toString());
}
试一下,两次获得的文件大小差不多