java 使用webmagic 爬虫框架爬取博客园数据存入数据库

来源:互联网 发布:av马赛克去除软件mac 编辑:程序博客网 时间:2024/05/21 17:04

  java 使用webmagic 爬虫框架爬取博客园数据存入数据库

  webmagic简介:

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

  http://webmagic.io/

  准备工作:

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

  View Code

  数据库表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;

  数据库链接工具类:

  View Code

  实体类:

  View Code

  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 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 urls(){

  List listUrl =new ArrayList();

  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 htmls =page.getHtml().xpath("//div[@class='post_item']/html()").all();

  List javaBokes=new ArrayList();

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

  }

  }

原创粉丝点击