简单java采集程序

【目标任务】通过该网站采集全国的手机号码段至数据库表中

【完成过程】

1、初涉正则表达式,学会写简单的正则表达式

2、获取单个网页内容,学会java中基本的IO流

3、将获取数据插入mysql数据库表中,掌握基本的JDBC编程。

5、通过url拼接获取每一个城市的完整url

6、采集整个网站的号码段,并使用批处理+预编译批量插入数据库表中

7、使用StringBuilder进行优化提速

【数据库表】注意如果是在cmd命令下建表的话,字段名称不需要加引号

create table number_segment (

`id` bigint not null auto_increment unique,

`segment` char(7) not null primary key,

`province` varchar(255) not null,

`city` varchar(255) not null

) default charset=utf8;                                  

3、使用java的Pattern类 和 Matcher类

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test_ZhengZe{
	public static void main(String[] args)
	{
		Pattern p = Pattern.compile("(13\\d{5}[^<])");	
		String s ="/mobile/guangzhou_1300040.>1300040</a></li><li><a href=\"../../mobile/guangzhou_1300041.html\">1300041</a></li><li><a ";		
		Matcher m = p.matcher(s);
		while(m.find())
		{
			System.out.println("打印出的号码段落:"+m.group(0));
		}
		System.out.print("捕获的数据有:"+m.groupCount());		
	}
}

 

【获取网页内容】

这里主要用到  InputStream  BufferReader两个IO流处理类。更多的方法讲解见【java获得采集网页内容的方法小结

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class getHtml {
    public static void main(String[] args) throws Exception    {
    	long start= System.currentTimeMillis();
        String str_url="http://www.hiphop8.com/city/guangdong/guangzhou.php";
        //匹配号码段
        Pattern p = Pattern.compile(">(13\\d{5}|15\\d{5}|18\\d{5}|147\\d{4})<");
	
        String html = get_Html(str_url);
        Matcher m = p.matcher(html);     
        int num = 0;       
		while(m.find())
		{
			System.out.println("打印出的号码段落:"+m.group(1)+"  编号"+(++num));	
		}
       System.out.println(num);       
       long end = System.currentTimeMillis();
		System.out.println("花费的时间"+(end-start)+"毫秒");
    } 
    public static String get_Html(String str_url) throws IOException{
    	URL url = new URL(str_url);
    	String content="";
		StringBuffer page = new StringBuffer();
		try {		
			BufferedReader in = new BufferedReader(new InputStreamReader(url
                    .openStream()));			
			while((content = in.readLine()) != null){
				page.append(content);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return page.toString();
    }
}

【将采集内容插入数据库】

java连接mysql数据库的大概操作是:

加载mysql驱动---》创意一个数据库连接---》创建一个sql语句执行对象statement---》定义String类型的SQL语句,statment调用SQL语句的执行方法---》关闭statment对象和数据库。

import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class database {
	public static String driver ="com.mysql.jdbc.Driver";
	public static String url    ="jdbc:mysql://127.0.0.1:3306/tele_dat?autoReconnect=true&characterEncoding=UTF-8";
	public static String user   ="root";
	public static String password = "123456";
	public static Statement statement = null;
	public static java.sql.Connection conn = null;
	public static int i=0;
	//创建一个插入数据的方法
	public static void datatoMySql(String sql) throws SQLException {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			System.out.println("加载驱动失败");
			e.printStackTrace();
		}	
		conn = DriverManager.getConnection(url, user, password);	//创建一个连接	
		statement = conn.createStatement();   //创建一个Statemnet对象来传送SQL语句
		statement.executeUpdate(sql);
	}
	public  static void close() throws SQLException{
		
		statement.close();   //关闭数据库操作对象
		conn.close();       //关闭数据库连接
	}
	//测试连接数据库例子
	public static void main(String args[])
	{
		
		String sql = "insert  into   number_segment(segment,province,city) " +
				"values (123458,‘广东1‘,‘广州‘) ";
		try {
			datatoMySql(sql);
			System.out.println("插入成功");
		} catch (SQLException e) {
			System.out.println("插入失败");
			e.printStackTrace();
		}	
		try {
			close();
			System.out.print("关闭数据库");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

我用的是wampsever中集成的mysql数据库,并在cmd下进行操作,常用命令见:mysql常用的命令见,如果对jdbc编程不熟,可以参考这篇博文

 

【获取整个网站中所以城市的URL】

通过查看网站首页的源代码,发现可以从这里获取每一个省份的URL,然后观察一个省份的页面,可以获取该省城市url的部分后缀,由此可以拼接就得到一个完整城市的url.

mport java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class get_all_city_url {
	public static void  main(String[] args) throws Exception {	
		String home_url = "http://www.hiphop8.com";
		String pattern_pro ="\\w{3}\\.\\w{7}\\.\\w{3}\\/\\w{4}\\/\\w+";  //匹配省份的URL
		String pattern_city_hz="<LI><A href=\"(.*?)\" target=_blank>";   //城市后缀
		Matcher mat_home = get(home_url,pattern_pro);
		int i = 0;
		//可以用ArrayList保存所有url,另外可以用StringBuilder对字符串进行相加,不过测试耗时差不多
		long  start = System.currentTimeMillis();
		while(mat_home.find())
		{
			String city_url_qz = "http://"+mat_home.group()+"/";
			Matcher mat_city_hz = get(city_url_qz,pattern_city_hz);
			while(mat_city_hz.find())
			{			
				i++;
				String city_url = city_url_qz + mat_city_hz.group(1);
				System.out.println(i+"  "+city_url);
			}		
		}
		long  end = System.currentTimeMillis();
		long time =end - start;
		System.out.println("总共用时"+time);
	}

	public static  Matcher get(String str, String pa) throws Exception  {
		String urlsource =get_Html(str);
		Pattern p = Pattern.compile(pa);
		Matcher m = p.matcher(urlsource);	
		return m;
	}
	public static String get_Html(String str_url) throws IOException{
    	URL url = new URL(str_url);
    	String content="";
		StringBuffer page = new StringBuffer();
		try {		
			BufferedReader in = new BufferedReader(new InputStreamReader(url
                    .openStream()));			
			while((content = in.readLine()) != null){
				page.append(content);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
        return page.toString();
    }
} 

 

 

       有了上面的基础,就可以做整个网站的号码段采集了,不过后面因为插入数据表中的数据是20多万,所以更多的是要考虑效率问题了。

      另外网上有不少的java采集教程,有些写的很棒,自己深知java打的太少了,写这篇博文一是为了总结,留个纪念,二是希望能给和我一个的初学者一些帮助,和大家一起交流探讨,当然如果文章有写的不对的地方,还希望大神指出。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。