JAVA读取网页内容串行的问题

fatiezhe 2009-08-09 09:45:55
首先代码如下:
Spider类

public class Spider implements Runnable{

HttpURLConnection huc;
InputStream is;
BufferedReader reader;
String url;

public Spider(String str){
try {
url=str;
} catch (Exception e) {
e.printStackTrace();
}
try {
huc=(HttpURLConnection)new URL(url).openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

new Thread(this).start();
}

public void run() {
try {
huc.setRequestMethod("GET");
huc.setRequestProperty("user-agent","mozilla/4.0 (compatible; msie 6.0; windows 2000)");
} catch (ProtocolException e) {
e.printStackTrace();
}
try {
huc.setUseCaches(true);
huc.connect();

} catch (IOException e) {
e.printStackTrace();
}
try {
is=huc.getInputStream();
reader=new BufferedReader(new InputStreamReader(is,huc.getContentType().equals("text-html; charset=gb2312")?"gb2312":"UTF-8"));
String str;
System.out.flush();
while((str=reader.readLine())!=null){
System.out.println(str);
System.out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
reader.close();
is.close();
huc.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
return;
}
}


结果在输出的结果与右键点浏览器查看源码的结果比较发现:
输出的结果如下:
<html>
<title>XXXXXXXXXXXXX</title>
</head>
<body >

<head>

原本应该在第二行的<head>跑到了后面,发生了串行的现象,不只为何,而且串行的位置也不固定,也就是说每次运行得到的结果都不一致,求高人解答
...全文
354 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
南南北北 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fatiezhe 的回复:]
或者有达人有什么方法读取网页内容也可告知小弟一下,只要能得到稳定正确的结果就行,感激涕零!
[/Quote]

直接用htmlparser不就好了.
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhang_yu_qin 的回复:]
引用 7 楼 fatiezhe 的回复:
或者有达人有什么方法读取网页内容也可告知小弟一下,只要能得到稳定正确的结果就行,感激涕零!



set一下值 然后在get一下值不是可以取到页面内容了吗???
[/Quote]
愿闻其详?
zhang_yu_QIN 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fatiezhe 的回复:]
或者有达人有什么方法读取网页内容也可告知小弟一下,只要能得到稳定正确的结果就行,感激涕零!
[/Quote]


set一下值 然后在get一下值不是可以取到页面内容了吗???
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
up
xiaohuli1984 2009-08-10
  • 打赏
  • 举报
回复
Mark
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yanbin1016 的回复:]
你是想访问一个网站然后把访问的这个页面的源代码获得到是吗?如果是的话 试试这个:
Java codepublicstatic String cc(String leibie, String num) {
StringBuffer temp=new StringBuffer();try {
System.out.println(leibie);
System.out.println(num);
String url="http://www.yb983.com/jiaojing/ser.php";
HttpURLConnection uc= (HttpURLConnection)new URL(url).
openConnection();
uc.setConnectTimeout(10000);
uc.setDoOutput(true);
uc.setRequestMethod("GET");
uc.setUseCaches(false);
DataOutputStream out=new DataOutputStream(uc.getOutputStream());// 要传的参数 String s= URLEncoder.encode("ra","GB2312")+"="+
URLEncoder.encode(leibie,"GB2312");
s+="&"+ URLEncoder.encode("keyword","GB2312")+"="+
URLEncoder.encode(num,"GB2312");// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面 out.writeBytes(s);
out.flush();
out.close();
InputStream in=new BufferedInputStream(uc.getInputStream());
Reader rd=new InputStreamReader(in,"Gb2312");int c=0;while ((c= rd.read())!=-1) {
temp.append((char) c);
}
System.out.println(temp.toString());
in.close();

}catch (Exception e) {
e.printStackTrace();
}return temp.toString();
}publicstaticvoid main(String[] a){
test.cc("1","吉H");
}

复制粘贴 可以运行看下控制台输出的效果 把URL换成你要抓取的网页的地址 传入对应的参数 可以用POST或GET方法。不知道你要的是这个东西不
[/Quote]

这个我试了下,结果多出来了600多行重复的,不知为何
anyway,谢谢啦~
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 rascalboy520 的回复:]
Java code
发现我之前用的代码也和你一样的,能不能把地址发一下给我,我用我的试一下:/**
* 处理页面,得到页面的源码
*@param tempurl
*@return - 页面内容*/publicstatic String getHtml(String tempurl, String code) {try {
URL url=new¡­
[/Quote]

Perfect!搞定了,没有串行了!
可是为嘛,我之前的代码似乎也差不多啊?为什么会串行呢?
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 rascalboy520 的回复:]
Java code
发现我之前用的代码也和你一样的,能不能把地址发一下给我,我用我的试一下:/**
* 处理页面,得到页面的源码
*@param tempurl
*@return - 页面内容*/publicstatic String getHtml(String tempurl, String code) {try {
URL url=new¡­
[/Quote]
呃还在,我在那这个网页测试:http://v.youku.com/v_show/id_XMTg2NjM4MTI=.html
万分感谢!
rascalboy520 2009-08-10
  • 打赏
  • 举报
回复

发现我之前用的代码也和你一样的,能不能把地址发一下给我,我用我的试一下:
/**
* 处理页面,得到页面的源码
* @param tempurl
* @return - 页面内容
*/
public static String getHtml(String tempurl, String code) {

try {
URL url = new URL(tempurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, code));
String line = "";
StringBuffer resultBuffer = new StringBuffer();
while ((line = br.readLine()) != null) {
resultBuffer.append(line);
}
br.close();
is.close();
conn.disconnect();
return resultBuffer.toString();
} catch (Exception e) {}
return null;
}
rascalboy520 2009-08-10
  • 打赏
  • 举报
回复
楼主还在不?
rascalboy520 2009-08-10
  • 打赏
  • 举报
回复
所以最好还是按字节读吧,不要按行读了,
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 rascalboy520 的回复:]
while((str=reader.readLine())!=null){
                System.out.println(str);
                System.out.flush();
            }
(str=reader.readLine())!=null
读取网页数据时,页面上有时会有很大的空白,但不是空,不知道这里会不会有影响
[/Quote]
我也觉得可能会有影响,有时候偶尔会跳出异常指向这一行,像这样:
java.io.IOException: Stream closed
at java.io.BufferedReader.ensureOpen(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Spider.run(Spider.java:44)
at java.lang.Thread.run(Unknown Source)
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yanbin1016 的回复:]
你是想访问一个网站然后把访问的这个页面的源代码获得到是吗?如果是的话 试试这个:
Java codepublicstatic String cc(String leibie, String num) {
StringBuffer temp=new StringBuffer();try {
System.out.println(leibie);
System.out.println(num);
String url="http://www.yb983.com/jiaojing/ser.php";
HttpURLConnection uc= (HttpURLConnection)new URL(url).
openConnection();
uc.setConnectTimeout(10000);
uc.setDoOutput(true);
uc.setRequestMethod("GET");
uc.setUseCaches(false);
DataOutputStream out=new DataOutputStream(uc.getOutputStream());// 要传的参数 String s= URLEncoder.encode("ra","GB2312")+"="+
URLEncoder.encode(leibie,"GB2312");
s+="&"+ URLEncoder.encode("keyword","GB2312")+"="+
URLEncoder.encode(num,"GB2312");// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面 out.writeBytes(s);
out.flush();
out.close();
InputStream in=new BufferedInputStream(uc.getInputStream());
Reader rd=new InputStreamReader(in,"Gb2312");int c=0;while ((c= rd.read())!=-1) {
temp.append((char) c);
}
System.out.println(temp.toString());
in.close();

}catch (Exception e) {
e.printStackTrace();
}return temp.toString();
}publicstaticvoid main(String[] a){
test.cc("1","吉H");
}

复制粘贴 可以运行看下控制台输出的效果 把URL换成你要抓取的网页的地址 传入对应的参数 可以用POST或GET方法。不知道你要的是这个东西不
[/Quote]
先谢谢了,我试试O(∩_∩)O~
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 rascalboy520 的回复:]
byte [] buffer=new byte[1024];
int read = 0;
while ((read = is.read(buffer)) != -1) {
.............................
}
is.close();
is = null;
[/Quote]
嗯我试试,怎么看输出呢?
rascalboy520 2009-08-10
  • 打赏
  • 举报
回复

while((str=reader.readLine())!=null){
System.out.println(str);
System.out.flush();
}
(str=reader.readLine())!=null
读取网页数据时,页面上有时会有很大的空白,但不是空,不知道这里会不会有影响
yanbin1016 2009-08-10
  • 打赏
  • 举报
回复
你是想访问一个网站然后把访问的这个页面的源代码获得到是吗?如果是的话 试试这个:

public static String cc(String leibie, String num) {
StringBuffer temp = new StringBuffer();
try {
System.out.println(leibie);
System.out.println(num);
String url = "http://www.yb983.com/jiaojing/ser.php";
HttpURLConnection uc = (HttpURLConnection)new URL(url).
openConnection();
uc.setConnectTimeout(10000);
uc.setDoOutput(true);
uc.setRequestMethod("GET");
uc.setUseCaches(false);
DataOutputStream out = new DataOutputStream(uc.getOutputStream());

// 要传的参数
String s = URLEncoder.encode("ra", "GB2312") + "=" +
URLEncoder.encode(leibie, "GB2312");
s += "&" + URLEncoder.encode("keyword", "GB2312") + "=" +
URLEncoder.encode(num, "GB2312");
// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面
out.writeBytes(s);
out.flush();
out.close();
InputStream in = new BufferedInputStream(uc.getInputStream());
Reader rd = new InputStreamReader(in, "Gb2312");
int c = 0;
while ((c = rd.read()) != -1) {
temp.append((char) c);
}
System.out.println(temp.toString());
in.close();

} catch (Exception e) {
e.printStackTrace();
}
return temp.toString();
}

public static void main(String[] a){
test.cc("1","吉H");
}


复制粘贴 可以运行看下控制台输出的效果 把URL换成你要抓取的网页的地址 传入对应的参数 可以用POST或GET方法。不知道你要的是这个东西不
rascalboy520 2009-08-10
  • 打赏
  • 举报
回复
byte [] buffer=new byte[1024];
int read = 0;
while ((read = is.read(buffer)) != -1) {
.............................
}
is.close();
is = null;
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
另外我用的是英文正版XP,为了读取中文字符,在Eclipse中右键点工程选Properties -> Text file encoding 中选择了UTF-8,不知道这会不会有影响?
rascalboy520 2009-08-10
  • 打赏
  • 举报
回复
也不要这样读,str=reader.readLine())!=null
页面是解析出来的,你这样读不对,按字节读,
fatiezhe 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 rascalboy520 的回复:]
  System.out.flush();
把这个去掉,
[/Quote]
还是一样……
加载更多回复(13)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧