/**
 * 爬取新闻信息,封装成实体bean
 */
public class GetNews {
 public List<News> getNews() {
  // 存储新闻对象
  List<News> list = new ArrayList<News>();
  try {
   // 请求DOM文档
   Document document = Jsoup.connect("http://baijia.baidu.com/").get();
   // 解析
   String selector = "h3>a";
   Elements titlels = document.select(selector);

for (Element title : titlels) {
    // System.out.println("标题---" + title.text());
    // 再次请求a标签,获取内容
    String url = title.absUrl("href");
    Document document1 = Jsoup.connect(url).get();
    String selectTime = document1.select("span[class=time]").text();
    // System.out.println("时间---" + selectTime);
    String selectBody = document1.select(
      "div[class=article-detail]").text();
    // System.out.println("正文---" + selectBody);
    // 构成news对象加入list集合
    News news = new News();
    news.setTitle(title.text());
    news.setBody(selectBody);
    news.setDate(selectTime);
    list.add(news);
   }

} catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

return list;
 }

}

/*
  * 把获得的news对象存入数据库
  */
 public int save(List<News> list) {

// sql前缀
  String sql = "insert into news (title,body,date) values";
  /*
   * 这种方式插入数据库 速度最快
   */
  for (News news : list) {
   sql = sql + "('" + news.getTitle() + "','" + news.getBody() + "','"
     + news.getDate() + "'),";
  }
  sql = sql.substring(0, sql.length() - 1);
  System.out.println(sql);
  int rows = BaseDao.executeUpdate(sql);
  return rows;
 }

/**
 * 连接数据库 通用的 工具类
 *
 */
public class BaseDao {
 // 创建需要得到JDBC API
 protected static Connection connection = null;
 protected static PreparedStatement ps = null;
 protected static ResultSet rs = null;

// 01.获取数据库连接
 public static boolean getConnection() {
  /**
   * 获取数据库连接的4要素 连接数据库的前提
   */
  String driver = ConfigManager.getInstance().getValue("jdbc.driver");
  String url = ConfigManager.getInstance().getValue("jdbc.url");
  String userName = ConfigManager.getInstance().getValue("jdbc.userName");
  String password = ConfigManager.getInstance().getValue("jdbc.password");

try {
   Class.forName(driver); // 加载驱动
   connection = DriverManager.getConnection(url, userName, password);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
   return false;
  } catch (SQLException e) {
   e.printStackTrace();
   return false;
  }
  return true;
 }

/**
  * 03.增删改 executeUpdate() 返回int 代表影响数据库中的行数 delete from user; delete from
  * user where id=? and name=?;
  */
 public static int executeUpdate(String sql, Object... params) {
  int rowNum = 0;
  if (getConnection()) { // 操作数据库 肯定现有连接
   try {
    ps = connection.prepareStatement(sql);
    // 循环给sql语句中的?占位符 赋值
    for (int i = 0; i < params.length; i++) {
     ps.setObject(i + 1, params[i]);
    }
    // 执行sql语句
    rowNum = ps.executeUpdate();
   } catch (SQLException e) {
    e.printStackTrace();
   } finally {
    closeConnection(); // 关闭连接
   }

}

return rowNum;
 }

/**
  * 04.查询 executeQuery() 返回ResultSet select * from user; select * from user
  * where id=? and name=?;
  */
 public static ResultSet executeQuery(String sql, Object... params) {
  if (getConnection()) { // 操作数据库 肯定现有连接
   try {
    ps = connection.prepareStatement(sql);
    // 循环给sql语句中的?占位符 赋值
    for (int i = 0; i < params.length; i++) {
     ps.setObject(i + 1, params[i]);
    }
    // 执行sql语句
    rs = ps.executeQuery();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  return rs;
 }

// 02.释放资源
 public static boolean closeConnection() {
  // 如果对象都没有创建 ? 能关闭吗? 必须进行非空判断
  if (rs != null) {
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
    return false;
   }
  }
  if (ps != null) {
   try {
    ps.close();
   } catch (SQLException e) {
    e.printStackTrace();
    return false;
   }
  }
  if (connection != null) {
   try {
    connection.close();
   } catch (SQLException e) {
    e.printStackTrace();
    return false;
   }
  }
  return true;
 }

}

/*
  * 输入关键字 查询 模糊查询
  */
 public List<News> selectNews(String name) {
  List<News> list = new ArrayList<News>();
  String sql = "select * from news where title like ?";
  Object[] params = { "%" + name + "%" };
  ResultSet rs = BaseDao.executeQuery(sql, params);
  try {
   // 遍历结果集
   while (rs.next()) {
    // 创建新闻对象
    News news = new News();
    // 获取每一行的每一列
    news.setId(rs.getInt("id"));
    news.setTitle(rs.getString("title"));
    news.setBody(rs.getString("body"));
    news.setDate(rs.getString("date"));
    list.add(news);
   }
  } catch (Exception e) {
   // TODO: handle exception
  }
  return list;
 }

/*
 * 单例 读取配置文件的工具类
 * */

public class ConfigManager {

// 01.创建自身的静态对象
 private static ConfigManager manager = new ConfigManager();
 private static Properties properties;

// 02.私有化构造
 private ConfigManager() {
  // 获取配置文件的路径
  String path = "jdbc.properties";
  properties = new Properties();
  // 创建输入流
  InputStream stream = ConfigManager.class.getClassLoader()
    .getResourceAsStream(path);
  try {
   properties.load(stream);
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    stream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

}

// 03.提供供外部访问的接口
 public static synchronized ConfigManager getInstance() {
  return manager;
 }

// 提供一个 根据key取得value的方法
 public static String getValue(String key) {
  return properties.getProperty(key);
 }

}

/*

*properties文件

*/

jdbc.url=jdbc\:mysql\://localhost\:3306/test
jdbc.userName=hhr
jdbc.password=hhr
jdbc.driver=com.mysql.jdbc.Driver

java实现爬虫功能的更多相关文章

  1. 开源的49款Java 网络爬虫软件

    参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting, ...

  2. java正则表达式之java小爬虫

    这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...

  3. 【转】44款Java 网络爬虫开源软件

    原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...

  4. Java开源爬虫框架crawler4j

    花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...

  5. 学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  6. Java 网络爬虫,就是这么的简单

    这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识.第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑 ...

  7. python实现简单爬虫功能

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...

  8. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  9. 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】

    一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...

随机推荐

  1. 微信小程序判断用户是否需要再次授权获取个人信息

    一.index.js设置如下 //获取用户的授权信息,放到本地缓存中 wx.getSetting({ success: (res) => { if(res.authSetting['scope. ...

  2. [android警告]AndroidManifest.xml警告 Not targeting the latest versions of Android

    警告:Not targeting the latest versions of Android; compatibility modes apply.Consider testing and upda ...

  3. gdb调试常用实用命令和core dump文件的生成(转)

    1.生成core dump文件的方法: $  ulimit -c //查看是否为0 如果为0 $   ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxxx的 ...

  4. GDAL指定自定义的金字塔目录

    缘起 对于一般的遥感影像文件,金字塔文件默认都是与影像文件放在同一个目录下,金字塔文件名一般与源影像文件名相同,但后缀名不同.或者金字塔内建于影像内部,但这不是这里所涉及的. 在使用ArcGIS桌面版 ...

  5. Spring Cloud Netflix Zuul 重试会自动跳过经常超时的服务实例的简单说明和分析

    在使用E版本的Spring Cloud Netflix Zuul内置的Ribbon重试功能时,发现Ribbon有一个非常有用的特性: 如果某个服务的某个实例经常需要重试,Ribbon则会在自己维护的一 ...

  6. Android应用资源分析(老罗链接整理)

    1.Android资源管理框架(Asset Manager)简要介绍和学习计划 2.Android应用程序资源的编译和打包过程分析 3.Android应用程序资源的查找过程分析 https://my. ...

  7. 再杀掉app之后 删除NSUserDefault存在本地的数据

    这两天在处理  app退出后删除本地数据  在appDelegate里的这个函数里设置发现进不去 - (void)applicationWillTerminate:(UIApplication*)ap ...

  8. iOS开发之duplicate symbols for architecture x86_64错误

    [主要内容:] 1. 错误提示 2. 分析错误原因 3. 解决问题办法 一.错误提示   在我们写代码过程中可能会经常遇到这样一个错误: <span style="font-size: ...

  9. 【iCore4 双核心板_ARM】例程三十四:U_DISK_IAP_ARM实验——更新升级STM32

    实验现象及操作说明: 1.本例程共有两个代码包,APP和IAP,IAP程序功能实现将APP程序升级至STM32中. 2.直接上电或烧写程序将执行升级的APP应用程序. 3.按下按键上电或写程序将进行升 ...

  10. 【转载】多模式串匹配之AC自动机

    原文地址:https://www.cnblogs.com/codeape/p/3845375.html 目录 [隐藏] 一.概述 二.AC算法思想 三.字典树tire的构造 四.搜索路径的确定 附录: ...