java 爬虫处理数据_Java语言实现爬虫实战

article/2025/8/27 4:47:45

141228655_1_2018081303061337引言

网络上有许多信息,我们如何自动的获取这些信息呢?没错,网页爬虫~!

在这篇博文中,我将会使用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的示例图:

141228655_2_20180813030613100四、使用Java开始爬虫

1. 下载Jsoup核心库地址http://jsoup.org/download

141228655_3_20180813030613193

如果使用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一下, 看看结果吧。

141228655_4_20180813030613303

查看mysql数据库,如下所示:

141228655_5_20180813030613412

好了写完了。以上就是一个简单爬虫的例子,是不是很简单。END


http://chatgpt.dhexx.cn/article/8jJEtwIF.shtml

相关文章

2021年Java爬虫技术教程(一小时实现)

Java爬虫开发 操作要点 正则表达式 Java网络通信:URL IO流 Map—HashMap 字符串操作 异常处理 项目已上传本人码云(gitee)传送门 如果这篇博客对你有一点点小帮助,希望您能给我来波一键三连; 前言 python优点&am…

java 爬虫大型教程(一)

java 爬虫大型教程(一) 写在开始前,既然是大型教程,那就从最初始的环境变量开始搭建说起。 电脑环境:我的电脑是macbook pro,因此系统环境变量配置是和Windows不一样的,如果你的电脑是Windows系统&#x…

java 爬虫 sessionid_java爬虫实战之模拟登陆

使用jsoup工具可以解析某个URL地址、HTML文本内容,是java爬虫很好的优势,也是我们在网络爬虫不可缺少的工具。本文小编带领大家使用jsoup 实现java爬虫模拟登陆,通过省力的API,很好的实现java爬虫模拟登陆。 一、使用工具&#xf…

java爬虫框架视频_Java爬虫博客采集系统视频教程

资源介绍 教程名称:Java爬虫博客采集系统视频教程xa0 教程目录: 【java爬虫博客采集系统】视频教程第00讲[20分钟] - 系统演示xa0 【java爬虫博客采集系统】视频教程第01讲[08分钟] - 博客爬虫模块Axa0 【java爬虫博客采集系统】视频教程第02讲[21分钟] …

Java版爬虫,爬网页,爬小说,完整教程,一看就会

昨天小编看到了一部不错的小说,但是没有办法下载,只能一页一页地看,于是想到了爬虫,现在Java也有了爬虫的框架,很简单,就算小白也能轻易入门,话不多说,直接上手。 1.首先引入相关依…

java-jsoup爬虫

1. 介绍 Jsoup是Java中的一个包,可以用于爬取页面中的数据 Jsoup爬取数据分为以下几个步骤: 1. 获取所爬取网页的Document对象 2. 找到所爬取数据所在的父级标签,将其从Document对象中解析出来,解析出来的内容放置在Element对象…

java爬虫 教程_Java爬虫其实也很简单,教你实用的入门级爬虫

原标题:Java爬虫其实也很简单,教你实用的入门级爬虫 任何语言都是可以爬虫的,只要你懂的常用的http协议啥的就可以模仿浏览器的行为获取你想要的数据。这里我将教大家一个简单实用的案例:如何获取全民K歌的下载链接。 ps: 这主要是…

java爬虫视频教程_JAVA开发教程:java视频教程java爬虫实战项目 百度网盘

– 源码 – 0 B |- 猫了个咪-更多IT精品课程.html – 41.00 kB |- 猫了个咪–it视频论坛.url – 51 B |- 22_项目优化三:邮件提醒.mp4 – 345.30 MB |- 21_项目优化二:爬虫项目监控[itjc8.com].mp4 – 353.40 MB |- 20-4_项目优化一:解决频繁…

手把手Java爬虫教学 - 1. 了解爬虫

一、什么是爬虫 先来看一下百度百科,了解一下爬虫~ 我们通过爬虫主要的目的就是爬取数据,好比 A 网站、B 网站有我们所需要的内容,但是这两个网站并没有给我们提供接口,那我们怎么能拿到上面的数据呢? 这时候我们就可…

java爬虫教程:模拟用户表单登录

转自:http://xiaolongonly.cn/2016/06/01/Reptile3/ 这个是爬虫教程第三篇,教大家如何模拟用户表单登录。 前期准备: JSOUP 1.83 jar包 Eclipse 任意版本能运行java就行 谷歌浏览器 第一步:依然是分析页面结构 我们要模拟C…

REmap包介绍及使用

2019独角兽企业重金招聘Python工程师标准>>> #REmap包简介 #包安装 #remapH函数 #remapH案例 #get_theme函数 #remapC函数 #markLineControl函数 #markPointControl函数 #remapC案例 REmap包简介 REmap包是R与echart的对接,在R里调用echar的api直接作图&…

用R语言绘制动态地图,代码奉上!(REmap包详解)

options(remap.ak="MY07CLhm3wKi4N2tQ6WP4kzz21BBZagI") 安装包 library(devtools) install_github(badbye/baidumap) install_github(lchiffon/REmap) baidumap包函数说明 getBaiduMap函数 getBaiduMap(location, width = 400, height = 400, zoom = 10, scale = …

remap()

学习自:【OpenCV入门教程之十七】OpenCV重映射 重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。一般情况下&#xff…

REmap绘制地图

本文出自: http://blog.csdn.net/wzgl__wh/article/details/53108754 REmap这个包是通过调用百度地图API的一个程序包,与Google的ggmap包相比,不用翻墙就可以使用。其函数主要有:remap(),remapB()、remapC()、remapH()…

R语言:使用REmap绘制超炫酷的地图

REmap这个包是通过调用百度地图API的一个程序包,与Google的ggmap包相比,不用翻墙就可以使用。其函数主要有:remap(),remapB()、remapC()、remapH()四个。该程序包目前要github网站上,因此我们需要从github上面下载安装。 install.packages("devtools")#如果安装…

ioremap()

活动地址:CSDN21天学习挑战赛 前言 之前,我们使用 devmem 命令的方式,直接操作寄存器,控制 LED 的亮灭。 今天,我们在内核中使用 ioremap() 来实现该功能。 物理地址 vs 虚拟地址 在嵌入式 Linux 中,通常…

STM32和GD32的GPIO引脚的default(默认) alternate(引脚复用) remap(引脚重映射)三种用法 别把复用和重映射当一回事儿

STM32有很多内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用 重映射就是引脚重映射,本来每个内置外设都有原来设…

OpenCV函数remap详解

OpenCV函数remap详解 remap的作用是将原影像映射到目标影像的函数。 这是OpenCV文档中的说明。 但这个描述给人的感觉是,云里雾里,到底是需要计算目标到原的映射关系,还是原到目标的映射呢。 经过我的实验发现是需要给出目标到原的映射关系…

remap函数

cvRemap( img1, img1r, mx1, my1 );在这个函数中mx1、my1是由前面函数计算出的校正系数,其指明了具体像素重新分配的位置。在learning opencv的12.3自带程序中可以发现,一般来说my1的值是比较集中的,mx1的值是比较分散的,这满足基…

Python-OpenCV 的 remap函数

恒等映射 result_img 和 原图一模一样 import cv2 import numpy as npimg cv2.imread("OpenCV.png") rows, cols, ch img.shape mapx np.ones(img.shape[:2], np.float32) mapy np.ones(img.shape[:2], np.float32) for i in range(rows):for j in range(cols)…