java实现爬虫功能
/**
* 爬取新闻信息,封装成实体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实现爬虫功能的更多相关文章
- 开源的49款Java 网络爬虫软件
参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting, ...
- java正则表达式之java小爬虫
这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...
- 【转】44款Java 网络爬虫开源软件
原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...
- Java开源爬虫框架crawler4j
花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...
- 学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- Java 网络爬虫,就是这么的简单
这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识.第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑 ...
- python实现简单爬虫功能
在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...
- Java 网络爬虫获取网页源代码原理及实现
Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...
- 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】
一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...
随机推荐
- Unity3D性能优化最佳实践(四)资源审查
Asset auditing - 资源审查 许多项目发生效能问题的真正原因只是由于人员操作不当或是试东试西,而不小心改到导入设定影响到导入的资源.(例如最近的gitlab惨案) 对于较大规模的项目,最 ...
- 广告行业中常说的 CPC,CPM,CPD,CPT,CPA,CPS 等词的意思是什么?
广告投放流程主要分为展示和转化,CPC/CPM/CPD/CPT/CPA/CPS等代表的是不同的结算模式 展示端的结算方式有: CPM(Cost Per Mille) 每千人成本:只要向足够量级的用户展 ...
- 如何做好Puppet Modules管理
如何做好Puppet Modules管理 不同于其他的Openstack项目,puppet modules是一个数量庞大的存在.以我们当前在使用中的puppet modules为例,就已经多达96个( ...
- 跟着柴毛毛学Spring(3)——简化Bean的配置
通过前面的学习.我们会感觉到对于一个有较多Bean的大项目,Spring的配置会比較复杂. 那么接下来我们就介绍怎样简化Spring的配置. 简化Spring的配置主要分为两类: 1. 自己主动装配 ...
- If 条件左边写常量?
if判断时,常量最好写左边 例如: 编程规范反复强调变量放在双等号的右边,常量放在左边,就是为了规避出现 If (ulCnt = 0)这种语法正确,但是极有可能是笔误的情况.为了杜绝这种不必要的逻 ...
- 如何卸载EXCEL中的插件?
1.问题:每一次启动,excel都会弹出一个提示框,是因为将treeplan给删除了.找不到. 2.解决办法: 1)在加载项界面,点击转到.就进入自己加载的工具界面 2)将相应项前面的勾取消--但某插 ...
- std::nothrow 的使用心得
std::nothrow 意思是说,不要跑出异常,改为返回一个nullptr. 一般的使用场景是,建议new的时候使用,避免使用try-catch来捕捉异常. 比如: float m_words = ...
- iOS 出现内存泄漏的几种原因
一.从AFNet 对于iOS开发者,网络请求类AFNetWorking是再熟悉不过了,对于AFNetWorking的使用我们通常会对通用参数.网址环境切换.网络状态监测.请求错误信息等进行封装.在封装 ...
- OpenLayers Node环境安装运行构建-支持Vue集成OpenLayers
NodeJS 环境安装包下载:https://nodejs.org/zh-cn/download/ 安装vue-cli3.0.1: https://cli.vuejs.org/guide/instal ...
- NBU将RAC数据库恢复到单机
恢复的过程和(https://www.cnblogs.com/abclife/p/5687993.html)差不多.但是,具体过程有些不同.如果按照之前的恢复方式,在run语句中同时运行restore ...