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

【完成过程】

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=\"../../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采集教程,有些写的很棒,自己深知java打的太少了,写这篇博文一是为了总结,留个纪念,二是希望能给和我一个的初学者一些帮助,和大家一起交流探讨,当然如果文章有写的不对的地方,还希望大神指出。

简单java采集程序一的更多相关文章

  1. 简单的java采集程序二

    继[简单的java采集程序],这里将完成对整个网站的号码段的采集任务. [使用预编译+批处理采集网页内容至数据库表中]          在之前我们用statement类来创建sql语句的执行对象,以 ...

  2. 输出多行字符的一个简单JAVA小程序

    public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...

  3. 第一章 开发简单Java应用程序

    1. 什么是程序?     程序一词来自生活,通常指完成某些事务的一种既定方式和过程(一组有序指令的集合). 2. Java的三个领域? Java SE:java技术核心(指桌面应用程序)如:QQ.百 ...

  4. 大数据学习——JAVA采集程序

    1 需求 从外部购买数据,数据提供方会实时将数据推送到6台FTP服务器上,我方部署6台接口采集机来对接采集数据,并上传到HDFS中 提供商在FTP上生成数据的规则是以小时为单位建立文件夹(2016-0 ...

  5. 在 NetBeans IDE 6.0 中分析 Java 应用程序性能

    NetBeans IDE 6.0 包含一个强大的性能分析工具,可提供与应用程序运行时行为有关的重要信息.通过 NetBeans 性能分析工具,我们可以方便地在 IDE 中监控应用程序的线程状态.CPU ...

  6. 简单java在线测评程序

    简单java程序在线测评程序 一.前言 大家过年好!今年的第一篇博客啊!家里没有网,到处蹭无线!日子过得真纠结!因为毕设的需求,简单写了一个java程序在线测评程序,当然也可以在本地测试. 二.思路 ...

  7. 《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》

    Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和 ...

  8. 3.1 一个简单的Java应用程序

        如下一个最简单的应用程序,它将只发送一条消息到控制台窗口中: package myjavapp;   public class FirstSample {       public stati ...

  9. Java 实现《编译原理》简单词法分析功能 - 程序解析

    Java 实现<编译原理>简单词法分析功能 - 程序解析 简易词法分析功能 要求及功能 (1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去) { int a, b; a ...

随机推荐

  1. 菜鸟笔记 -- Chapter 1 计算机从0到1

    进入20世纪第二个十年,计算机已经成为生活中一个必不可小的工具了,但我们真的了解计算机吗?计算机有哪些部分构成?不同的计算机又可以做什么样的事情呢?我们的PC和用来做加减乘除的计算器都属于计算机范畴吗 ...

  2. PL/SQL12的安装与使用

    楼主比较懒,直接放一个别人的链接吧,比较全面. 大致过程就是,下载pl/sql    下载oracle instance client    然后配置oci.dll     添加 一个连接具体数据库的 ...

  3. 从 React 的组件更新谈 Immutable 的应用

    在介绍 Immutable 如何在 React 中应用之前,先来谈谈 React 组件是如何更新的. React 是基于状态驱动的开发,可以将一个组件看成是一个有限状态机,组件要更新,必须更新状态. ...

  4. 插入排序_C语言_数组

    插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...

  5. Vue+node.js+express+mysql实例---对图书信息进行管理

    一个简单的 CURD 实例 ---对图书信息进行管理 目录 1 开发环境 1.1 前端开发环境 1.2 后端开发环境 2 数据库设计和创建 2.1 数据库和表设计 2.2 book 表设计 2.3 s ...

  6. 牛客网NOIP赛前集训营-提高组18/9/9 A-中位数

    链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  7. tomcat端口占用后的解决办法【亲测有效】

    https://www.cnblogs.com/zhangtan/p/5856573.html 检测正在使用的端口   这里就以win7为例进行讲解. 首先打开cmd,打开的方法很简单,在开始菜单中直 ...

  8. Git 项目提交代码及一些常用命令

    在dev_ysg分支 : git add . //把项目添加到仓库 git commit -m "test" // 提交加注释 git push //推到dev_ysg分支上去 g ...

  9. 吐血分享:QQ群霸屏技术教程(接单篇)

    在文章<QQ群霸屏技术教程(利润篇)>中,阿力推推提及到QQ群霸屏技术变现的方式,稍显粗略,这里详尽介绍下(老鸟漂过). 资本 资本之上,才谈得上接单,没技能,接个毛线. 1擅长点. 建议 ...

  10. C#中给WebClient添加代理Proxy

    效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...