从静态网页上抓取数据,并写成csv格式

       最近好像老是跟读写操作打交道。。。。第一份工作第一件要做的事居然就是从静态网页上抓取数据,并写成csv格式。。因此,特意写一篇博客,纪念一下。。

       首先从静态网页抓取数据,其实这个很简单,先贴下代码:

      URL url = null;

        HttpURLConnection conn = null;

        InputStreamReader isr = null;

        BufferedReader br = null;

        try {

            url = new URL(urlString);

            conn = (HttpURLConnection) url.openConnection();

            isr = new InputStreamReader(conn.getInputStream());  //BufferedReader每次读取一行字符,而InputStreamReader一次读取一个字节,各种流的详情请看 https://www.cnblogs.com/redick/p/6644594.html(不知道是哪位道友奉献的,盗用了实在不好意思。。。)

            br = new BufferedReader(isr);

        } catch (Exception e) {

            e.printStackTrace();

        }

              此处的urlConnection对象实际上是根据URL的请求协议(此处是http)生成的URLConnection类 
的子类HttpURLConnection,故此处最好将其转化为HttpURLConnection类型的对象。

   接下来就是写了,先贴代码:

 public static void write(String urlString, String filePath, String[] head,
            boolean flag) {

        int count = 0;
        StringBuffer html = new StringBuffer();
        try {
            File outFile = new File(filePath);  //首先定义文件路径,比如:C:/Users/Desktop/zcx/data.csv
            BufferedWriter writer = null;
            BufferedReader br = getData(urlString); //上面那个方法为getData()
            if (flag) { //flag用来区分是在原来文件上追加还是直接覆盖原来的文件
           writer = new BufferedWriter(new FileWriter(outFile));//上面这个加了一个缓冲,缓冲写满后在将数据写入硬盘这样做极大的提高了性能 ,如果不用缓冲,就会读一次写一次,性能会很差。
                for (int i = 0; i < head.length; i++) {
                    writer.write(head[i].toString() + ",");
                }
                writer.newLine(); //写完表头后换行
            } else {
                writer = new BufferedWriter(new FileWriter(outFile, true));//这里跟上面那行相比多了true,代表在原文件上追加
            }

            String line;
            if (br == null) {
                System.exit(0);
            }
            while ((line = br.readLine()) != null) { // Just read a line every time.
                html.append(line); 
            }
            Pattern p = Pattern.compile("<td.*?/td>");//正则表达式,匹配条件为所有带有<td></td>的字符串
            Matcher m = p.matcher(html); //在html中匹配
            while (m.find()) {       //boolean find() 对字符串进行匹配,匹配到的字符串可以在任何位置. 
                String tmp = m.group(); //group()返回匹配到的子字符串 
                tmp = tmp.replaceAll("</?[a-zA-Z]+[^><]*>", "");//给匹配成功的字符串去掉所有的样式及标签,只留下数据
                if (tmp.contains(",") || tmp.contains("&nbsp;")) {
                    tmp = "\"" + tmp + "" + "\"";     //如果数据中存在“,”,就会出现一个格子分成多个格子的情况,因为“,”是分隔符,解决办法就是将数据整体用“ ”双引号括起来。
                    tmp = new String(tmp.getBytes()).replaceAll("\\&nbsp;", "");   //如果数据为空,就会以“&nbsp;”的形式出现,解决办法就是,使用转义符
                }
                tmp += ",";     //所有的数据用逗号隔开,逗号即为分隔符,写入文件会以这个来分隔
                writer.write(tmp);  //将匹配到的数据处理后一个个写入文件
                count++;  
                if (count % head.length == 0) {  //每隔表头个元素就换行
                    writer.newLine(); // change to next line
                }
            }
            writer.close(); //重中之重,如果掉了就无法写文件,因为我们使用了缓冲Bufferwriter,数据是先写到缓冲之后再写入硬盘的,因此,如若不关闭,是不会写入硬盘的!!!
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

        以上就是本仙女入职之后的第一个小任务,如若有错误,还请各位道友不吝赐教呀。。。。手动笔芯。。。

xml解析:https://blog.csdn.net/sdksdk0/article/details/51555090

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值