网页爬虫

来源:互联网 发布:优优部屋 淘宝 编辑:程序博客网 时间:2024/05/24 00:41



/*
网页爬虫
如果要在程序中使用正则表达式,则必须依靠Pettern类和Matcher类,
这两个类都在java.util.regex保重定义。
Pettern类的主要作用是进行正则规范的编写,而Matcher类主要执行规范,校验一个字符串是否符合规范


Pettern类中的正则规范
"\w"表示字母、数字、下划线 
程序中的"\"字符需要转义,所以"\\"实际上是表示的"\"
"+"表示一位或多位


Pettern类中的常用方法
public static Pattern compile(String regex)   //指定正则表达式规则
public Matcher matcher(CharSequence input)    //返回Matcher类实例
public String[] split(CharSequence input)   //字符串拆分


Matcher类常用的方法
public boolean matches()                      //执行验证
public String replace(String replacement)     //字符串替换


BufferedReader
BufferedReader类用于从缓冲区读取内容,所有输入的字节数据都将放在缓冲区中
BufferedReader类中的常用方法
public BufferedReader(Reader in)             //接收一个Reader类的实例(构造函数)
public String readLine() throws IOException  //一次性从缓冲区中将内容全部读取出来
说明:
BufferedReader中定义的构造函数方法只能接收字符输入流的实例
所以有时用字符输入流和字节输入流的转换类InputStreamReader(Reader的子类)
将字节输入流转换为字符输入流
字符流操作时使用了缓冲区,而字节流操作时不使用缓冲区,在开发中字节流使用较为广泛


Reader本身是抽象类,如果要从文件中读取内容,则可以直接使用子类FileReader子类。
FileReader的构造方法如下:
public FileReader(File file) throws FileNoFoundException
说明:
FileReader不直接是Reader的子类而是InputStreamReader的子类
*/

import java.io.*;import java.util.regex.*;import java.text.DateFormat;import java.util.*;import java.net.*;public class SpiderDemo{    public static File file ;    public static void main(String args[]) throws Exception{    long startTime = System.currentTimeMillis();  //起始时间    creatFile();        //getMailFromTxt();getMailFromURl();long endTime = System.currentTimeMillis();    //结束时间System.out.println("总共耗时:" + (endTime-startTime) + "毫秒......");}    //创建TXT文件用于保存邮箱地址public static void creatFile(){    file = new File("G:\\My Java\\Regex\\spiderFile.txt"); //创建对象并给出路径if(!file.exists())  //判断文件是否存在          {         try{        file.createNewFile();                                 //按照指定路径创建文件    System.out.println("文件创建成功......");    }        catch(IOException e){        e.printStackTrace();    }         }        else            System.out.println("文件已存在......");}//从TXT文件中获取邮箱地址public static void getMailFromTxt() throws Exception{    BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));String line = null;String mailreg = "\\w+@\\w+(\\.\\w+)+";              //定义规则Pattern p = Pattern.compile(mailreg);                //指定正则表达式规则while((line = bufr.readLine())!=null)                //从缓冲区中将内容全部读取出来{    Matcher m =p.matcher(line);while(m.find()){        System.out.println(m.group());    }}}//从网页中获取邮箱地址public static void getMailFromURl() throws Exception{    long n = 1849962706;Writer out = null;    out = new FileWriter(file,true);for(;n<2051291221;n++){    URL url = new URL("http://tieba.baidu.com/p/" + n);URLConnection conn = url.openConnection();BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;String mailreg = "\\w+@\\w+(\\.\\w+)+";Pattern p = Pattern.compile(mailreg);int i = 0;while((line = bufIn.readLine())!=null){    Matcher m =p.matcher(line);while(m.find()){        System.out.println(m.group());out.write("NO." + (++i)+ ": " + m.group() + "    ");    }}System.out.println("共获取到 " + i + "个邮箱地址......");DateFormat df = DateFormat.getDateTimeInstance();  //格式化时间        System.out.println("当前时间:" + df.format(new Date()) + "......");out.write("共获取到 " + i + "个邮箱地址......" + df.format(new Date()));        }        out.close();}}}