java 爬虫处理数据_Java语言实现爬虫实战
引言
网络上有许多信息,我们如何自动的获取这些信息呢?没错,网页爬虫~!
在这篇博文中,我将会使用java语言一步一步的编写一个原型的网页爬虫,其实网页爬虫并没有它听起来那么难。
紧跟我的教程,我相信你会在马上学会,一个小时应该可以搞定,之后你就可以享受你所获得的大量数据。这次所编写的是最简单的教程,可以说是网页爬虫的hello world程序, 由于仅仅是原型,之后你要花更多的时间来研究并未自己来定制特定需求的爬虫。
首先,我认为你已经掌握了下面的基础知识:
1.基础的java编程
2.关于sql以及mysql数据库或者oracle数据库
如果你不想使用数据库的话,你可以用一个文件来将爬到的数据存储好。
一、我们的目标
给定一个学校的URL,例如“mit.edu”,返回包括字符串“research”所有的这个学校的页面。
一个经典的爬虫程序步骤:
1.解析根网页(“mit.edu”),并从这个网页得到它所有的链接。获取每个URL并解析HTML页面,我会使用Jsoup来处理,Jsoup是一个好用而且方便的java库。
2.使用步骤1返回回来的URL,解析这些URL。
3.当我们在做上面两个步骤的时候,我们需要跟踪哪些页面是之前已经被处理了的,那样的话,每个页面只需被处理一次。这也是我们为什么需要数据库的原因了。二、建立Mysql数据库
如果你使用的是ubuntu, 你可以使用经典的Apache, MySQL, PHP, and phpMyAdmin来操作。
如果你是用的是windows,你可以简单的使用wampServer或者SQLlog并安装,也可以使用oracle数据库,可以使用PLSQL developer工具。
这里我使用mysql sqllog工具,它是使用mysql数据化的一个可视化的GUI工具,当然你也可以使用其他的工具或者方法。三、创建数据库以及表
创建一个数据库名为:Crawler,创建一个表,名为:Record
下面是一个oracle sql 脚本CREATE TABLE Record (--创建表
RecordID integer NOT NULL primary key,
URL varchar2(200) NOT NULL
);
CREATE SEQUENCE RecordID_Sequence--创建序列
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE; -- 一直累加,不循环
CREATE TRIGGER record_increase BEFORE--创建触发器
insert ON Record FOR EACH ROW
begin
select RecordID_Sequence.nextval into:New.RecordID from dual;
end;
如果是mysql的话,如此执行:CREATE TABLE IF NOT EXISTS `Record` (
`RecordID` INT(11) NOT NULL AUTO_INCREMENT,
`URL` TEXT NOT NULL,
PRIMARY KEY (`RecordID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
下图是使用pl/sql的示例图:
四、使用Java开始爬虫
1. 下载Jsoup核心库地址http://jsoup.org/download
如果使用oracle数据库, 你需要下载oracle的JDBC驱动jar包,ojdbc14.jar包
如果使用mysql数据库,那么需要下载mysql-connector-java 的jar包
2. 在Eclipse中创建项目,并将Jsoup库jar以及ojdbc14.jar也加入到Java Build Path(右键点击项目,选择build path—>”Configure Build Path” –> click “Libraries” tab –> click “Add External JARs”)
3. 创建一个DB类,来处理数据库的操作。package crawlerDemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DB{
public Connection conn = null;
public DB(){
try {
Class.forName('com.mysql.jdbc.Driver');
String url = 'jdbc:mysql://localhost:3306/Crawler';
conn = DriverManager.getConnection(url, 'root', 'root');
System.out.println('conn built');
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public ResultSet runSql(String sql) throws SQLException{
Statement sta = conn.createStatement();
return sta.executeQuery(sql);
}
public boolean runSql2(String sql) throws SQLException{
Statement sta = conn.createStatement();
return sta.execute(sql);
}
@Override
protected void finalize() throws Throwable{
if (conn != null || !conn.isClosed()) {
conn.close();
}
}
public static void main(String[] args){
new DB();
}
}
4.创建一个名为“Main”的类,这个类将是我们的爬虫。
package crawlerDemo;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Main{
public static DB db = new DB();
public static void main(String[] args) throws SQLException, IOException{
db.runSql2('TRUNCATE Record;');
processPage('http://www.mit.edu');
}
public static void processPage(String URL) throws SQLException, IOException{
//检查一下是否给定的URL已经在数据库中
String sql = 'select * from Record where URL = ''+URL+''';
ResultSet rs = db.runSql(sql);
if(rs.next()){
}else{
//将uRL存储到数据库中避免下次重复
sql = 'INSERT INTO `Crawler`.`Record` ' + '(`URL`) VALUES ' + '(?);';
PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, URL);
stmt.execute();
//得到有用的信息
Document doc = Jsoup.connect('http://www.mit.edu/').get();
if(doc.text().contains('research')){
System.out.println(URL);
}
//得到所有的链接,并递归调用
Elements questions = doc.select('a[href]');
for(Element link: questions){
if(link.attr('href').contains('mit.edu'))
processPage(link.attr('abs:href'));
}
}
}
}
现在你已经得到了自己的爬虫,run一下, 看看结果吧。
查看mysql数据库,如下所示:
好了写完了。以上就是一个简单爬虫的例子,是不是很简单。END
java 爬虫处理数据_Java语言实现爬虫实战相关推荐
- java c++的区别_Java语言与C、C++之间的区别?
小伙伴你知道吗?Java是由C++开发而来的,并且在当时一直被搁置.随着Java语言的崛起那么Java和C/C++有什么不同和相同之处呢? 通过上述我们知道那Java前身是C++,并且保留了C++的大 ...
- python分布式爬虫及数据存储_分布式爬虫
爬虫学习使用指南 Auth: 王海飞 Data:2018-07-05 Email:779598160@qq.com github:https://github.com/coco369/knowledg ...
- python数据分析要不要爬虫_数据分析师需要对爬虫掌握到什么程度?
数据分析师是可以学爬虫的,通过爬虫技术,可以快速获取自己想要的数据,辅助自己进行业务分析,丰富自己的数据来源. 爬虫的学习难度并非大家想象的这么高,他从原理上其实就是模拟人们打开链接(发起请求) -& ...
- java解析json数据_java解析JSON数据详解
JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...
- java程序设计基础篇_Java语言程序设计(基础篇) 第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
- java批量处理数据_Java批量处理数据
要求:共1000条数据,第一次批量插入100条,第二次批量插入101到200条,依次插入数据: 实现方式这里选择了两种常用的方式,都是使用List操作: 第一种实现思路如下: <1> 原先 ...
- java 同时修改同一个数据_Java 语言中锁的设计与应用
前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的 ...
- java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]
本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...
- 非洲瓜哇JAVA布的特点_java语言的基本特性以及编程细节
前言 java语言的学习是一个体系,所以如果想要对java的编程有一个很精通的一个掌握,它离不开很多基础的知识点,比如JVM的原理.java多线程并发编程.数据结构等等.所以我这里对我学习的java的 ...
- java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例
所谓有权图,就是图中的每一条边上都会有相应的一个或一组值.通常情况下,这个值只是一个数字 如:在交通运输网中,边上的权值可能表示的是路程,也可能表示的是运输费用(显然二者都是数字).不过,边上的权值也 ...
最新文章
- 2. 把一幅图像进行平移。
- 介绍一下K近邻(KNN)算法,KNeighbors和RadiusNeighbors的差异是什么?各有什么优势?
- 102页PPT,DeepMind强化学习最新进展,含图文、公式和代码
- 基础 —— ip地址与子网掩码的认识
- jQuery 里面的排他思想
- 【实验】广域网点到点协议PPP PAP CHAP的双向验证、单项认证
- GDCM:gdcm::DefinedTerms的测试程序
- python区域增长_Python – 有效地为高密度区域创建密度图,稀疏区域的点
- 魔法函数%matplotlib 解决matplotlib画图在Jupter/IPython中不显示
- 在15分钟内使用Spring Boot和Spring Security构建一个Web应用程序
- 20175333曹雅坤实验四《Android程序设计》实验报告
- 统计学(检验、分布)的 python(numpy/pandas/scipy) 实现
- VS2015 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “stdafx.h”
- TDD (test driver development)测试驱动开发
- SE3可能是苹果最失败的手机,销量不达预期致上市半月降价促销
- Python指纹识别
- html5中abbr,HTML 5 abbr 标签 - HTML 参考手册
- 在 JavaScript 中如何克隆对象?
- 基于图的广度优先搜索策略(耿7.11)
- 操作——【1.8 关于音高、时值、位置 】(二)
热门文章
- layui开发使用文档(贤心提供)
- [Python+Django]Web图书管理系统毕业设计之源码+论文篇
- 编译原理(第3版) 清华大学出版社 黄贤英等人著作 课程知识点总结
- 已知三点求圆心 c语言,转 已知两点坐标和半径求圆心坐标程序C++
- DES对称加密算法详解和c++代码实现(带样例和详细的中间数据)
- vs2010使用教程c语言编程,VS2010的使用
- 数据结构C语言版 学习整理
- 11 Steps Attackers Took to Crack Target
- shell脚本学习指南_学习笔记_第1,2章
- 微信飞机小游戏java_Shoot Plane 仿微信打飞机游戏的java实现