Java语言:用正则表达式获取百度帖子中的邮箱

**此代码用来获取百度贴吧中某一个帖子中的所有邮箱.**

![运行测试:](https://img-blog.csdn.net/20170103152859778?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbW9vbXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170103153126548?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbW9vbXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170103153136873?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbW9vbXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
package regex;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.filechooser.FileSystemView;

public class NetSpider2 {

    public static void main(String[] args) throws IOException {



        long begin = System.currentTimeMillis();
        /**
         * 爬取百度贴吧帖子中的邮箱 v1.0 第一次测试耗时:19818毫秒 第二次测试耗时:15259毫秒 
         * 思路: 
         * 1,在浏览器中找到帖子链接
         * 2,在html中找到其表示总页的标签内容 如 百度贴吧 </span>回复贴,共<spanclass="red">30</span>页</li> 
         * 3,用正则表达式提取其中的 页码  30  并将页码值赋给 pnMax 同时锁上页码获取代码
         * 4,遍历同时用正则表达式筛选合格的E-mail 账号并存储到集合中
         * 5,返回集合
         * 6,用获取页码的方法获取标题       <title>要的留邮箱</title>
         * 7,将集合和标题 传给输出文件方法
         * 8,获取当前系统桌面路径 并创建  E_mailFile文件夹   
         * 9,将时间+标题作为文件名   保存.txt文件
         */
        System.out.println("请输入地址:");
        // 定义帖子链接(帖子第一页,或者其他页码去掉?pn=1)
//      String url_str = "http://tieba.baidu.com/p/4232750852"; // 页码加 ?pn=1
        String url_str =new BufferedReader(new InputStreamReader(System.in)).readLine();
        // 定义邮箱正则表达式
        String str_mail = "\\w+@\\w+(\\.\\w+)+";

        // 定义页码包含字符串
        // 网页中的总页数为</span>回复贴,共<span class="red">30</span>页</li> //30 为总页数
        String pn_regex = ".*</span>回复贴,共<span class=\"red\">(\\d++)</span>页</li>.*";

        // 定义存储字符串集合
        Set<String> set_mail = new HashSet<String>();

        // 获取标题
        String title = getTitleForNet(url_str);
        System.out.println("帖子标题: "+title);


        // **抓取该贴中的邮箱
        set_mail = getEmilForNet(url_str, str_mail, pn_regex);

        // **输出到桌面
        toDesktopFile(set_mail, url_str, title);

        /*
         * for (String str : set_mail) { System.out.println(str); }
         */

        long end = System.currentTimeMillis() - begin; // 这段代码放在程序执行后
        System.out.println("耗时:" + end/1000 + "秒");
    }

    /**
     * 获取该网页的标题 内容参考获取邮箱中的获取页码
     * 
     * @param url_str
     * @return
     * @throws IOException
     */
    public static String getTitleForNet(String url_str) throws IOException {

        // 2,将页码值添加到地址字符串中并初始化URL
        URL url = new URL(url_str);

        // 1,打开链接
        URLConnection conn = url.openConnection();

        // 2,获取读取流
        InputStream in = conn.getInputStream();

        // 3,创建缓冲区
        BufferedReader bufr = new BufferedReader(new InputStreamReader(in,
                "UTF-8"));

        // 4,读取文件
        String line = null;
        while ((line = bufr.readLine()) != null) {
            if (line.matches(".*<title>.*</title>.*")) { // 如果找到

                // 定义临时操作对象
                String temp = line;
                // 将临时字符串替换为文本中的标题
                temp = temp.replaceAll(".*<title>(.*)</title>.*", "$1");
//              System.out.println(temp);
                return temp;
            }

        }
        return null;
    }

    /**
     * 将集合中的内容写入到桌面的
     * 
     * @param set_mail
     * @param url_str
     * @param title
     * @throws IOException
     */
    public static void toDesktopFile(Set<String> set_mail, String url_str,
            String title) throws IOException {
        // 获取系统桌面目录
        File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory();
        String desktopPath = desktopDir.getAbsolutePath();
        // System.out.println(desktopPath);//J:\Users\fei\Desktop

        // 创建目录
        File file = new File(desktopPath + "\\E-mailFile");
        if (!file.exists() && !file.isDirectory()) {
            System.out.println("目录不存在,正在创建");
            file.mkdir();
            System.out.println("创建成功!");
        } else {

        }
        // 创建文件 格式为 日期.txt
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyy_MM_dd");
        String time = format.format(date);
        BufferedWriter bufw = new BufferedWriter(new FileWriter(
                file.getAbsolutePath() + "\\" + time + title + ".txt"));
        //打印文件路径
        System.out.println("文件地址:"+file.getAbsolutePath()+file.getAbsolutePath() + "\\" + time + title + ".txt");
        // 遍历存储
        for (String str : set_mail) {
            bufw.write(str);
            bufw.newLine();
            bufw.flush();
        }
        bufw.close();
        System.out.println("存储完毕!");
    }

    public static Set<String> getEmilForNet(String url_str, String str_mail,
            String pn_regex) throws IOException {

        // 定义邮箱文本集合
        Set<String> set_mail = new HashSet<String>();
        // 1,定义页码计数器
        int pnNum = 1;
        // 定义页码初始总数
        int pnMax = 65535;
        // 2,定义邮件正则表达式对象
        Pattern p = Pattern.compile(str_mail);
        // 3,定义总页查找器锁
        boolean lock = true;
        // 当没有到达总页时

        while (pnNum <= pnMax) {

            // 2,将页码值添加到地址字符串中并初始化URL
            URL url = new URL(url_str + "?pn=" + pnNum);

            // *****打印测试
//          System.out.println(url);

            // 1,打开链接
            URLConnection conn = url.openConnection();

            // 2,获取读取流
            InputStream in = conn.getInputStream();

            // 3,创建缓冲区
            BufferedReader bufr = new BufferedReader(new InputStreamReader(in,
                    "UTF-8"));
            // 4,读取文件
            String line = null;
            while ((line = bufr.readLine()) != null) {
                if (lock) {
                    if (line.matches(".*</span>回复贴,共<span class=\"red\">\\d++</span>页</li>.*")) { // 如果找到

                        // System.out.println("*****找到了********");
                        // 定义临时操作对象
                        String temp = line;
                        // 将临时字符串替换为文本中的总页
                        temp = temp.replaceAll(pn_regex, "$1");
                        // 将总页码转为int赋值
                        pnMax = Integer.valueOf(temp).intValue();

                        // ****打印测试
                        // System.out.println(pnMax);
                        lock = false; // 不再查找总页数
                    }
                }
                Matcher m = p.matcher(line);
                while (m.find()) { // 依次查找,直到找完当前行
                    set_mail.add(m.group()); // 将找到的子序列添加到集合中

                    // ****打印测试
//                  System.out.println(m.group());
                }
            }
            // 页码计数器增加 查看下一页
            System.out.println("正在爬取第 "+pnNum+" 页,共 "+pnMax+" 页.");

            pnNum++;
            bufr.close();
            in.close();
        }

        return set_mail;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值