webmagic简介:

    WebMagic是一个简单灵活的Java爬虫框架。你可以快速开发出一个高效、易维护的爬虫。

    http://webmagic.io/

准备工作:

  

  Maven依赖(我这里用的Maven创建的web项目做测试):    

<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> <!--日志配置 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency> <dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 实现slf4j接口并整合 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency> <!-- 数据库部分 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
<scope>runtime</scope>
</dependency>
<!-- c3p0连接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency> <!-- dao框架:mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- mybatis 整合spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency> <!-- servlet web依赖 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency> <!-- spring 依赖 -->
<!-- 1.spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- 2.spring dao 层依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.5.RELEASE</version>
</dependency> <!-- spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency> <!-- spring test 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<!-- webmagic 网络爬虫jar -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
</dependencies>

  数据库表SQL:

CREATE TABLE `Boke` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`linke` varchar(255) DEFAULT NULL COMMENT '正文地址',
`author` varchar(255) DEFAULT NULL COMMENT '作者',
`authorUrl` varchar(255) DEFAULT NULL COMMENT '作者主页',
`summary` varchar(1000) DEFAULT NULL COMMENT '简介',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4890 DEFAULT CHARSET=utf8;

 

 数据库链接工具类:

import java.sql.DriverManager;
import java.sql.SQLException;

import com.mysql.jdbc.Connection;

public class MySqlJdbcUtils {

private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://192.168.0.132:3306/xbDB?useUnicode=true&characterEncoding=utf-8";
private static String name="tradingbp";
private static String pwd="123456";

/**
*
* 获取链接
*
* @date 2017年8月31日
* @return
*/
public static Connection getOpenConnection(){
Connection conn= null;
try {
//加载驱动
Class.forName(driver);
conn=(Connection) DriverManager.getConnection(url, name, pwd);
System.out.println("获得数据库链接");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

public static void main(String[] args) {
getOpenConnection();
}

}

import java.sql.DriverManager;
import java.sql.SQLException; import com.mysql.jdbc.Connection; public class MySqlJdbcUtils { private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://192.168.0.132:3306/xbDB?useUnicode=true&characterEncoding=utf-8";
private static String name="tradingbp";
private static String pwd="123456"; /**
*
* 获取链接
*
* @date 2017年8月31日
* @return
*/
public static Connection getOpenConnection(){
Connection conn= null;
try {
//加载驱动
Class.forName(driver);
conn=(Connection) DriverManager.getConnection(url, name, pwd);
System.out.println("获得数据库链接");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
return conn;
} public static void main(String[] args) {
getOpenConnection();
} }

 实体类:

/**
*
*java 博客实体
*
* @date 2017年8月24日
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class JavaBokeModel {

//标题
private String title;

//链接地址
private String linke;

//作者
private String author;

//作者主页地址
private String authorUrl;

//简介
private String summary;

public String getSummary() {
return summary;
}

public void setSummary(String summary) {
this.summary = summary;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getLinke() {
return linke;
}

public void setLinke(String linke) {
this.linke = linke;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

public String getAuthorUrl() {
return authorUrl;
}

public void setAuthorUrl(String authorUrl) {
this.authorUrl = authorUrl;
}

}

webmagic 框架爬取数据并保存

  

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor; import com.mysql.jdbc.Connection;
import com.nio.webmagic.jdbc.MySqlJdbcUtils;
import com.nio.webmagic.model.JavaBokeModel;
/**
*
* 爬虫
*
* @version [VCES V201R001, 2017年10月12日]
*
* @see 方法实现 PageProcessor
* @since [产品/模块版本]
*/
public class JavaBoKePageProcessor implements PageProcessor {
private static Connection conn=null;
private static PreparedStatement ps =null;
//标题和链接获取
private static String TITLEQUERY="div.post_item_body h3 a.titlelnk";
//作者
private static String AUTHORQUERY="div.post_item_foot a.lightblue ";
//简介
private static String SUMMARYQUERY="div.post_item_body p.post_item_summary";
//插入sql语句
private static String insertSql ="INSERT INTO Boke (title,linke,author,authorUrl,summary)VALUES(?,?,?,?,?)"; //初始链接
private static Connection getConnection(){
if (conn==null) {
conn = MySqlJdbcUtils.getOpenConnection();
}
return conn;
} /**
*
* insert操作
*
* @date 2017年8月31日
* @return
*/ private synchronized void insertDb(List<JavaBokeModel> javaBokes){
try { ps = conn.prepareStatement(insertSql); for (JavaBokeModel javaBoke:javaBokes) {
ps.setString(1, javaBoke.getTitle().toString());
ps.setString(2, javaBoke.getLinke().toString());
ps.setString(3, javaBoke.getAuthor().toString());
ps.setString(4, javaBoke.getAuthorUrl().toString());
ps.setString(5, javaBoke.getSummary().toString());
ps.executeUpdate();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //初始化带爬取网页地址
private static List<String> urls(){
List<String> listUrl =new ArrayList<String>(); for (int i = 2; i <=200; i++) { //listUrl.add("http://www.cnblogs.com/cate/java/"+i);
listUrl.add("http://www.cnblogs.com/cate/java/"+i);
}
listUrl.toArray(new String[listUrl.size()]);
return listUrl;
} /**
*
* jsoup根据 html 字符串和语法获取内容;
* @date 2017年8月31日
* @param htmlText
* @return
*/
private static String seletDocumentText(String htmlText,String Query){
Document doc = Jsoup.parse(htmlText);
String select = doc.select(Query).text();
return select;
} /**
*
* jsoup根据 html 字符串和语法获取链接地址; * @date 2017年8月31日
* @param htmlText
* @return
*/
private static String seletDocumentLink(String htmlText,String Query){
Document doc = Jsoup.parse(htmlText);
String select = doc.select(Query).attr("href");
return select;
}
/**
* process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
* @see us.codecraft.webmagic.processor.PageProcessor#process(us.codecraft.webmagic.Page)
*/
@Override
public void process(Page page) {
//
page.addTargetRequests(urls());
//div[@class='post_item']//div[@class='post_item_body']//h3//a[@class='titlelnk']/text()'
// 定义如何抽取页面信息,并保存下来
List<String> htmls =page.getHtml().xpath("//div[@class='post_item']/html()").all();
List<JavaBokeModel> javaBokes=new ArrayList<JavaBokeModel>();
for (String html:htmls) {
JavaBokeModel javaBoke =new JavaBokeModel();
//标题和链接
String title =seletDocumentText(html,TITLEQUERY);
String linke =seletDocumentLink(html,TITLEQUERY);
//作者和作者主页
String author=seletDocumentText(html, AUTHORQUERY);
String authorUrl=seletDocumentLink(html, AUTHORQUERY);
//简介
String summary=seletDocumentText(html, SUMMARYQUERY);
javaBoke.setTitle(title);
javaBoke.setAuthor(author);
javaBoke.setAuthorUrl(authorUrl);
javaBoke.setLinke(linke);
javaBoke.setSummary(summary);
javaBokes.add(javaBoke); }
insertDb(javaBokes); } @Override
public Site getSite() {
//抓去网站的相关配置包括:编码、重试次数、抓取间隔
return Site.me().setSleepTime(1000).setRetryTimes(10);
} public static void main(String[] args) {
long startTime ,endTime;
System.out.println("========小爬虫【启动】喽!=========");
getConnection();
startTime = new Date().getTime();
//入口
Spider create = Spider.create(new JavaBoKePageProcessor());
//定义入口地址
create.addUrl("http://www.cnblogs.com/cate/java/").thread(5).run();
try {
ps.close();
conn.close();
} catch (Exception e) {
// TODO: handle exception
}
endTime = new Date().getTime();
System.out.println("========小爬虫【结束】喽!=========");
System.out.println("用时为:"+(endTime-startTime)/1000+"s");
} }

数据:

java 之webmagic 网络爬虫的更多相关文章

  1. Apache Nutch v2.3 发布,Java实现的网络爬虫

    http://www.oschina.net/news/59287/apache-nutch-2-3 Apache Nutch v2.3已经发布了,建议所有使用2.X系列的用户和开发人员升级到这个版本 ...

  2. Java开发、网络爬虫、自然语言处理、数据挖掘简介

    一.java开发 (1) 应用开发,即Java SE开发,不属于java的优势所在,所以市场占有率很低,前途也不被看好. (2) web开发,即Java Web开发,主要是基于自有或第三方成熟框架的系 ...

  3. Java SE之网络爬虫①

    一 需求描述 给一个url,将该url对应网页内的所有的链接查找出来,并补充完整为绝对路径 简易版 /** * * @author Zen Johnny * @date 2018年4月29日 下午11 ...

  4. Java 正则表达式_网络爬虫

    首先 需要了解 一些 关于 网络爬虫的 基本知识: 网络爬虫: 所谓的 爬虫 就是一个 应用 程序, 这个 应用 程序 会 获取 网络中的 指定信息(网页 数据). 例如百度: 启动 这个 爬虫 程序 ...

  5. Java丨jsoup网络爬虫模拟登录思路解析

    直奔主题: 本篇文章是给有jsoup抓包基础的人看的...... 今天小编给大家写一篇对于jsoup抓包时需要输入验证码的解决方法之一.大神就绕道,嘿嘿~ 任何抓包的基础都是基于Http协议来进行这个 ...

  6. 基于 Java 的开源网络爬虫框架 WebCollector

    原文:https://www.oschina.net/p/webcollector

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

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

  8. Heritrix工具实现网络爬虫

    上次用的java相关知识实现了一个简单的网络爬虫,现在存在许多开源免费的爬虫工具,相对来说,可以很简单的获取网页数据,并写入到本地. 下面我就阐述一下我用Heritrix爬虫工具实现网页数据爬取. - ...

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

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

随机推荐

  1. Kinect安装

    在连接kinect机器前,需要先安装两个软件,而在安装这两个软件前需要有vs2010(专业版本和快速版),因为需要包含.net framework 4.0 kinect sdk http://www. ...

  2. loj2071 「JSOI2016」最佳团体

    分数规划+树形依赖背包orz #include <iostream> #include <cstring> #include <cstdio> #include & ...

  3. Asp.net自定义控件开发任我行(6)-嵌入资源下

    摘要 上一章,我们讲了嵌入.css文件,这一章,我们来讲一下嵌入.js文件,也顺带一个嵌入Image文件 内容 我们前面的几章,一运行,下拉框就显示出来了,但是DropDwonList的下拉框是被隐藏 ...

  4. MSSQL将多行单列变一行一列并用指定分隔符分隔,模拟Mysql中的group_concat

    -- 将多行记录(只能一个列)用指定分隔符分隔 IF(OBJECT_ID('sp_RowsChangeClosBySplit',N'P') IS NOT NULL) DROP PROC sp_Rows ...

  5. [转]9个基于Java的搜索引擎框架

    9个基于Java的搜索引擎框架 在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的 ...

  6. 【BZOJ 3620】似乎在梦中见过的样子

    题目 (夢の中で逢った.ような--) 「Madoka,不要相信 QB!」伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中所发 ...

  7. python IDLE简介及使用技巧

    前言:本人环境windows 7 64位,python2.7 IDLE简介: 是python 的可视化GUI编辑器 可以逐行输入命令 可方便的进行复制.粘贴等操作 常用命令行命令: import mo ...

  8. bat 处理adb脚本

    @echo off REM Funtion: 测试parsermode 接口CdxParserGetMediaInfo 和CdxParserRead REM Code by lzp 2017-05-0 ...

  9. maven学习(八)——使用maven创建javaweb项目

    构建JavaWeb项目 1.创建JavaWeb项目 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.my ...

  10. nyoj 题目7 街区最短路径问题

    街区最短路径问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间 ...