黑马程序员技术交流社区

标题: 请各位帮忙看下我的爬虫小程序,求解答 [打印本页]

作者: 一碗小米周    时间: 2013-12-7 17:17
标题: 请各位帮忙看下我的爬虫小程序,求解答
本帖最后由 一碗小米周 于 2013-12-8 12:32 编辑
  1. package regex;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintWriter;
  7. import java.net.MalformedURLException;
  8. import java.net.URL;
  9. import java.net.URLConnection;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;

  12. //爬虫小程序
  13. public class Carwler {
  14.         public static void main (String[] args) throws Exception{
  15.                 URL url = new URL("http://tieba.baidu.com/p/2711844440");
  16.                 URLConnection urlcon = url.openConnection();
  17.                 BufferedReader br = new BufferedReader(new InputStreamReader(urlcon.getInputStream()));
  18.                 PrintWriter pw = new PrintWriter(new File("E:\\carwler.txt"));
  19.                 String regex="\\w+@\\w+(\\.\\w+)+";
  20.                
  21.                 Pattern p = Pattern.compile(regex);
  22.                 String line=null;
  23.                 while((line=br.readLine())!=null){
  24.                         Matcher mm = p.matcher(line);
  25.                         while(mm.find()){
  26.                                 //System.out.println(mm.group());   <font color="#ff0000">//这里出现了一点问题,可以直接在控制台上打印,可以为什么不能写入到一个文件中呢??</font>
复制代码


作者: aion2013tian    时间: 2013-12-7 20:59
  1. package Reg;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.InputStreamReader;
  8. import java.io.PrintWriter;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. import java.net.URLConnection;
  12. import java.util.regex.Matcher;
  13. import java.util.regex.Pattern;

  14. //爬虫小程序
  15. public class Carwler {
  16.         public static void main(String[] args) throws Exception {
  17.                 URL url = new URL("http://tieba.baidu.com/p/2711844440");
  18.                 URLConnection urlcon = url.openConnection();
  19.                 BufferedReader br = new BufferedReader(new InputStreamReader(
  20.                                 urlcon.getInputStream()));
  21.                
  22.                 //PrintWriter是打印流,打印数据方便,写出数据就要定义FileWriter
  23. //                PrintWriter pw = new PrintWriter(new File("E:\\carwler.txt"));
  24.                
  25.                 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\carwler.txt"));
  26.                 String regex = "\\w+@\\w+(\\.\\w+)+";

  27.                 Pattern p = Pattern.compile(regex);
  28.                 String line = null;
  29.                 while ((line = br.readLine()) != null) {
  30.                         Matcher mm = p.matcher(line);
  31.                         while (mm.find()) {
  32.                                 // System.out.println(mm.group()); <font color="#ff0000">
  33.                                 // 这里出现了一点问题,可以直接在控制台上打印,可以为什么不能写入到一个文件中呢??</font>
  34.                                 //调用writer(String str)的方法,将mm.group()返回的字符串写出到目标文件中
  35.                                 bw.write(mm.group());
  36.                                 //换行
  37.                                 bw.newLine();
  38.                                 //刷新数据
  39.                                 bw.flush();
  40.                                
  41.                         }
  42.                 }
  43.                 //关闭资源
  44.                 br.close();
  45.                 bw.close();
  46.                
  47.         }
  48. }
复制代码

楼主上面代码是我改正的,将数据写出到文件中最好用的是FileWriter流,而不是PrintWriter流
作者: 朱神必    时间: 2013-12-7 21:07
好深奥啊
作者: 朱神必    时间: 2013-12-7 21:07
积分怎么拿?
作者: 一碗小米周    时间: 2013-12-7 21:27
aion2013tian 发表于 2013-12-7 20:59
楼主上面代码是我改正的,将数据写出到文件中最好用的是FileWriter流,而不是PrintWriter流 ...

恩。谢谢你。但是为什么不能用pw.println()呢?我在上面都是可以直接用pw.println()打印网页内容到一个文件中呢。
作者: doitforyou    时间: 2013-12-7 21:59
^_^,其实可以用printl的,只不过你在定义PrintWriter时,需要使用自动刷新才可以,你可以查看API,
其实使用这个会简便很多,我推荐使用这个。
下面给你提供两种解决办法,只需要修改一行代码即可,重要的时候构造函数中要传入boolean参数。
方法1:PrintWriter pw = new PrintWriter(new FileWriter("mail.txt"),true);使用FileWriter
方法2:PrintWriter pw = new PrintWriter(new FileOutputStream("mail.txt"),true); 使用FileOutputStream
当参数为true时,就会带行自动刷新,你就可以直接使用println了,楼主那个其实也可以用,不过需要手动刷新的,我就没试。
  
作者: 一碗小米周    时间: 2013-12-8 12:32
doitforyou 发表于 2013-12-7 21:59
^_^,其实可以用printl的,只不过你在定义PrintWriter时,需要使用自动刷新才可以,你可以查看API,
其实使 ...

额。我没太注意。。果然是这样的。谢谢你。
作者: 一碗小米周    时间: 2013-12-8 12:40
doitforyou 发表于 2013-12-7 21:59
^_^,其实可以用printl的,只不过你在定义PrintWriter时,需要使用自动刷新才可以,你可以查看API,
其实使 ...

那个的确是不能自动刷新。那么您帮忙看下我下面的代码为什么没有自动刷新,却写入了数据呢?
  1. package regex;

  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintWriter;
  7. import java.net.MalformedURLException;
  8. import java.net.URL;
  9. import java.net.URLConnection;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;
  12. public class Carwler {
  13.         public static void main (String[] args) throws Exception{
  14.                 URL url = new URL("http://tieba.baidu.com/p/2711844440");
  15.                 URLConnection urlcon = url.openConnection();
  16.                 BufferedReader br = new BufferedReader(new InputStreamReader(urlcon.getInputStream()));
  17.                 PrintWriter pw = new PrintWriter((new File("E:\\carwlerr.txt")));
  18.                 String regex="\\w+@\\w+(\\.\\w+)+";
  19.                
  20.                 Pattern p = Pattern.compile(regex);
  21.                 String line=null;
  22.                 while((line=br.readLine())!=null){
  23.                         pw.println(line);//这里没有刷新呢。为什么写入了呢?
  24.                 }
  25.                 br.close();       
  26.                 }
  27.                
  28.         }

复制代码

作者: doitforyou    时间: 2013-12-8 14:31
一碗小米周 发表于 2013-12-8 12:40
那个的确是不能自动刷新。那么您帮忙看下我下面的代码为什么没有自动刷新,却写入了数据呢?
...

刚刚试了下,确实是,百度了没有满意的答案,我说下自己的理解吧,你参考就行,如果以后碰到好的解答告诉我下。
之所以需要刷新是因为pw在写数据的时候都先写入缓冲区,最后由缓冲区再写到文件中,
而构造方法中直接传入文件File的话,相当于直接写入,不经过缓冲区,所以不用刷新,如果文件较大的话,
这样效率是比较低的。
这是我个人的愚见,可能会完全错误,所以借鉴就好,找到比较权威的解释我再告诉你,你找到也记得和我说下
作者: 一碗小米周    时间: 2013-12-8 15:21
doitforyou 发表于 2013-12-8 14:31
刚刚试了下,确实是,百度了没有满意的答案,我说下自己的理解吧,你参考就行,如果以后碰到好的解答告诉 ...

恩。我中午和我同学交流了一下,发现当我要读取的网页内容比较小的时候,如果不加flush是不能显示网页内容的,而当网页内容比较大时候,比如我上面链接的那个网页,你打开那个写入到的文件中的时候会发现它并没有显示完全的网页内容,只显示了一部分。所以我和我同学就猜想,可能是当读取一个文件的时候,会先放入缓冲区中,而这个缓冲区是有大小的,当这个缓冲区存满了之后,会自动将缓冲区中的内容写入到文件中。所以会出现那两种情况,即当网页内容较少时,并没有存满缓冲区,所以不会自动写入到文件中。而当网页内容较大时,最后一下,缓冲区并没有存满,所以会出现写入不完整情况。我刚刚上网也查了一下。这个缓冲区具体有多大,你可以参考下这个链接http://blog.sina.com.cn/s/blog_9158a5410100x0lh.html。语言表达的不好,如果有表达不正确的地方也欢迎提出。谢谢。
作者: doitforyou    时间: 2013-12-8 21:51
一碗小米周 发表于 2013-12-8 15:21
恩。我中午和我同学交流了一下,发现当我要读取的网页内容比较小的时候,如果不加flush是不能显示网页内 ...

恩,收到,表达的很清楚的。
谢谢啦,共同学习。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2