java 之webmagic 网络爬虫

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");
    }

}

数据:

原文地址:https://www.cnblogs.com/aibabel/p/11017558.html

时间: 2024-11-08 23:38:50

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

推荐10款流行的java开源的网络爬虫

1:JAVA爬虫WebCollector(Star:1345) 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫.WebCollector-Hadoop是WebCollector的Hadoop版本,支持分布式爬取. 爬虫内核: WebCollector致... 2:开源通用爬虫框架YayCrawler(Star:91) YayCrawler是一个基于WebMagic开发的分布式通用爬虫框架,开

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

一.java开发 (1) 应用开发,即Java SE开发,不属于java的优势所在,所以市场占有率很低,前途也不被看好. (2) web开发,即Java Web开发,主要是基于自有或第三方成熟框架的系统开发,如ssh.springMvc.springside.nutz.,面向各自不同的领域,像OA.金融.教育等有非常成熟案例,这是目前最大的市场所在,故人称“java为web而生”.但目前看它的缺点入门不高,所以待遇相对中等,上升空间很有限且缓慢. (3)移动开发(Android),是目前的大趋势

基于JAVA语言的网络爬虫

Introduction: 这个小demo用于爬取淘宝网的相关链接. 首先从"www.taobao.com"这个url开始,手机页面上的所有url,然后存入toCrawList .当toCrawList不为空时,拿出一个url,把它存入数据集并且搜寻这个url上的所有链接充入toCrawList. 这是一个BFS过程. Framework: Code: 就网络爬虫来讲这个demo没有太多特别之处,只是根据项目需求,最大的爬取url数有个限制,因此效率上会相对的做出一些优化.另外为了防止

java的简单网络爬虫(爬取花瓣网的图片)

因为本人对爬虫比较感兴趣,加上之前也写过一些简单的python爬虫,所以在学完java基础后写了一个简单的网络图片爬虫.废话不多说直接上过程代码.(爬取的图源来自花瓣网:https://huaban.com/boards/favorite/beauty/) 源url页面分析 拿到爬取的源url,首先是分析页面哪些东西是要爬取的,这个页面是美女分类的画板页面,这里我们要爬的就是要爬取某个画板下面的所有图片.这里为了简单爬取我就选取了该页面推荐的几个画板.查看本页面源码可以很快找到推荐画板的url资

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

说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬虫而且还能做的非常好,在开源社区中有不少优秀的 Java 网络爬虫框架,例如 webmagic .我的第一份正式工作就是使用 webmagic 编写数据采集程序,当时参与了一个舆情分析系统的开发,这里面涉及到了大量网站的新闻采集,我们就使用了 webmagic 进行采集程序的编写,由于当时不知道其设

网络爬虫java版

java版的网络爬虫基本思路是,先获取网页信息,再根据正则表达式提取网页内容 package xuexi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; import jav

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

参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting,他同时也是Lucene.Hadoop和Avro开源项目的创始人. Nutch诞生于2002年8月,是Apache旗下的一个用Java实现... JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只

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

原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api接口 能在Android设备上稳定运行 小巧灵活可以方便集成的网页抓取组件 使用...更多WebFetch信息 开源爬虫框架 Guozhong

JAVA多线程网络爬虫的代码实现

因为项目需要,做了一个网络爬虫的小DEMO. 为实现高性能的网络爬虫,首先考虑采用APACE的HttpClient进行页面的采集和解析,HttpClient可以很方便的通过URL获得远程内容,例如一个小程序:     CloseableHttpClienthttp client = HttpClients.createDefault();     HttpGet httpget = newHttpGet("http://localhost/");     CloseableHttpRe