首页 > 代码库 > 简单java采集程序
简单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;
【初涉正则表达式】
1、学习简单的表达式:正则表达式30分入门。
2、在线测试自己写的表达式:在线测试正则表达式1
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=http://www.mamicode.com/mobile/guangzhou_1300041.html/">1300041
【获取网页内容】
这里主要用到 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=http://www.mamicode.com/"(.*?)\" target=_blank>"; //城市后缀>
有了上面的基础,就可以做整个网站的号码段采集了,不过后面因为插入数据表中的数据是20多万,所以更多的是要考虑效率问题了。
另外网上有不少的java采集教程,有些写的很棒,自己深知java打的太少了,写这篇博文一是为了总结,留个纪念,二是希望能给和我一个的初学者一些帮助,和大家一起交流探讨,当然如果文章有写的不对的地方,还希望大神指出。
简单java采集程序