WebMagic(三)----抓取CSDN博客通过JDBC保存到数据库中去

数据库使用的是MySQL,新建test数据库创建csdnblog表:


[html]  view plain  copy
  1. CREATE TABLE `csdnblog` (  
  2.   `id` int(11) unsigned NOT NULL auto_increment,  
  3.   `keyes` int(11) unsigned NOT NULL,  
  4.   `titles` varchar(255) NOT NULL,  
  5.   `content` varchar(10240) NOT NULL,  
  6.   `dates` varchar(16) default NULL,  
  7.   `tags` varchar(255) default NULL,  
  8.   `category` varchar(255) default NULL,  
  9.   `views` int(11) unsigned default NULL,  
  10.   `comments` int(11) unsigned default NULL,  
  11.   `copyright` int(1) unsigned default NULL,  
  12.   PRIMARY KEY  (`id`)  
  13. ENGINE=InnoDB DEFAULT CHARSET=utf8;  


接着新建实体类对应博客文章:


CsdnBlog.Java


[html]  view plain  copy
  1. public class CsdnBlog {  
  2.   
  3.     private int key;// 编号  
  4.   
  5.     private String title;// 标题  
  6.   
  7.     private String date;// 日期  
  8.   
  9.     private String tags;// 标签  
  10.   
  11.     private String category;// 分类  
  12.   
  13.     private int view;// 阅读人数  
  14.   
  15.     private int comments;// 评论人数  
  16.   
  17.     private int copyright;// 是否原创  
  18.   
  19.     private String content; //文字内容  
  20.   
  21.     public String getContent() {  
  22.         return content;  
  23.     }  
  24.   
  25.     public void setContent(String content) {  
  26.         this.content = content;  
  27.     }  
  28.   
  29.     public int getKey() {  
  30.         return key;  
  31.     }  
  32.   
  33.     public void setKey(int key) {  
  34.         this.key = key;  
  35.     }  
  36.   
  37.     public String getTitle() {  
  38.         return title;  
  39.     }  
  40.   
  41.     public void setTitle(String title) {  
  42.         this.title = title;  
  43.     }  
  44.   
  45.     public String getDate() {  
  46.         return date;  
  47.     }  
  48.   
  49.     public void setDate(String date) {  
  50.         this.date = date;  
  51.     }  
  52.   
  53.     public String getTags() {  
  54.         return tags;  
  55.     }  
  56.   
  57.     public void setTags(String tags) {  
  58.         this.tags = tags;  
  59.     }  
  60.   
  61.     public String getCategory() {  
  62.         return category;  
  63.     }  
  64.   
  65.     public void setCategory(String category) {  
  66.         this.category = category;  
  67.     }  
  68.   
  69.     public int getView() {  
  70.         return view;  
  71.     }  
  72.   
  73.     public void setView(int view) {  
  74.         this.view = view;  
  75.     }  
  76.   
  77.     public int getComments() {  
  78.         return comments;  
  79.     }  
  80.   
  81.     public void setComments(int comments) {  
  82.         this.comments = comments;  
  83.     }  
  84.   
  85.     public int getCopyright() {  
  86.         return copyright;  
  87.     }  
  88.   
  89.     public void setCopyright(int copyright) {  
  90.         this.copyright = copyright;  
  91.     }  
  92.   
  93.     @Override  
  94.     public String toString() {  
  95.         return "CsdnBlog [key=" + key + "title=" + title + "content=" + content + ",date=" + date + "tags=" + tags + "category="  
  96.                 + category + ", view=" + view + "comments=" + comments + "copyright=" + copyright + "]";  
  97.     }  
  98.   
  99. }  



Dao类


CsdnBlogDao.java: 


[html]  view plain  copy
  1. public class CsdnBlogDao {  
  2.   
  3.     private Connection conn = null;  
  4.     private Statement stmt = null;  
  5.   
  6.     public CsdnBlogDao() {  
  7.         try {  
  8.             Class.forName("com.mysql.jdbc.Driver");  
  9.             String url = "jdbc:mysql://localhost:3306/test?"  
  10.                     + "user=root&password=123&useUnicode=true&characterEncoding=UTF8";  
  11.             conn = DriverManager.getConnection(url);  
  12.             stmt = conn.createStatement();  
  13.         } catch (ClassNotFoundException e) {  
  14.             e.printStackTrace();  
  15.         } catch (SQLException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.   
  19.     }  
  20.   
  21.     public int add(CsdnBlog csdnBlog) {  
  22.         try {  
  23.             String sql = "INSERT INTO `test`.`csdnblog` (`keyes`, `titles`, `content` , `dates`, `tags`, `category`, `views`, `comments`, `copyright`) VALUES (?, ?, ?, ?, ?, ?, ?, ?,?);";  
  24.             PreparedStatement ps = conn.prepareStatement(sql);  
  25.             ps.setInt(1, csdnBlog.getKey());  
  26.             ps.setString(2, csdnBlog.getTitle());  
  27.             ps.setString(3,csdnBlog.getContent());  
  28.             ps.setString(4, csdnBlog.getDate());  
  29.             ps.setString(5, csdnBlog.getTags());  
  30.             ps.setString(6, csdnBlog.getCategory());  
  31.             ps.setInt(7, csdnBlog.getView());  
  32.             ps.setInt(8, csdnBlog.getComments());  
  33.             ps.setInt(9, csdnBlog.getCopyright());  
  34.             return ps.executeUpdate();  
  35.         } catch (SQLException e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.         return -1;  
  39.     }  
  40.   
  41. }  


测试类:


CsdnBlogPageProcessor.java


[html]  view plain  copy
  1. public class CsdnBlogPageProcessor implements PageProcessor {  
  2.   
  3.   
  4.     private static String username="CHENYUFENG1991";  // 设置csdn用户名  
  5.   
  6.     private static int size = 0;// 共抓取到的文章数量  
  7.   
  8.     // 抓取网站的相关配置,包括:编码、抓取间隔、重试次数等  
  9.     private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);  
  10.   
  11.     public Site getSite() {  
  12.         return site;  
  13.     }  
  14.   
  15.       
  16.     // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑  
  17.     public void process(Page page) {  
  18.         // 列表页  
  19.         if (!page.getUrl().regex("http://blog\\.csdn\\.net/" + username + "/article/details/\\d+").match()) {  
  20.             // 添加所有文章页  
  21.             page.addTargetRequests(page.getHtml().xpath("//div[@id='article_list']").links()// 限定文章列表获取区域  
  22.                     .regex("/" + username + "/article/details/\\d+")  
  23.                     .replace("/" + username + "/", "http://blog.csdn.net/" + username + "/")// 巧用替换给把相对url转换成绝对url  
  24.                     .all());  
  25.             // 添加其他列表页  
  26.             page.addTargetRequests(page.getHtml().xpath("//div[@id='papelist']").links()// 限定其他列表页获取区域  
  27.                     .regex("/" + username + "/article/list/\\d+")  
  28.                     .replace("/" + username + "/", "http://blog.csdn.net/" + username + "/")// 巧用替换给把相对url转换成绝对url  
  29.                     .all());  
  30.             // 文章页  
  31.         } else {  
  32.             size++;// 文章数量加1  
  33.             // 用CsdnBlog类来存抓取到的数据,方便存入数据库  
  34.             CsdnBlog csdnBlog = new CsdnBlog();  
  35.             // 设置编号  
  36.             csdnBlog.setKey(Integer.parseInt(  
  37.                     page.getUrl().regex("http://blog\\.csdn\\.net/" + username + "/article/details/(\\d+)").get()));  
  38.             // 设置标题  
  39.             csdnBlog.setTitle(  
  40.                     page.getHtml().xpath("//div[@class='article_title']//span[@class='link_title']/a/text()").get());  
  41.   
  42.             //设置内容  
  43.             csdnBlog.setContent(  
  44.                     page.getHtml().xpath("//div[@class='article_content']/allText()").get());  
  45.   
  46.             // 设置日期  
  47.             csdnBlog.setDate(  
  48.                     page.getHtml().xpath("//div[@class='article_r']/span[@class='link_postdate']/text()").get());  
  49.             // 设置标签(可以有多个,用,来分割)  
  50.             csdnBlog.setTags(listToString(page.getHtml()  
  51.                     .xpath("//div[@class='article_l']/span[@class='link_categories']/a/allText()").all()));  
  52.             // 设置类别(可以有多个,用,来分割)  
  53.             csdnBlog.setCategory(  
  54.                     listToString(page.getHtml().xpath("//div[@class='category_r']/label/span/text()").all()));  
  55.             // 设置阅读人数  
  56.             csdnBlog.setView(Integer.parseInt(page.getHtml().xpath("//div[@class='article_r']/span[@class='link_view']")  
  57.                     .regex("(\\d+)人阅读").get()));  
  58.             // 设置评论人数  
  59.             csdnBlog.setComments(Integer.parseInt(page.getHtml()  
  60.                     .xpath("//div[@class='article_r']/span[@class='link_comments']").regex("\\((\\d+)\\)").get()));  
  61.             // 设置是否原创  
  62.             csdnBlog.setCopyright(page.getHtml().regex("bog_copyright").match() ? 1 : 0);  
  63.             // 把对象存入数据库  
  64.             new CsdnBlogDao().add(csdnBlog);  
  65.             // 把对象输出控制台  
  66.             System.out.println(csdnBlog);  
  67.         }  
  68.     }  
  69.   
  70.     // 把list转换为string,用,分割  
  71.     public static String listToString(List<String> stringList) {  
  72.         if (stringList == null) {  
  73.             return null;  
  74.         }  
  75.         StringBuilder result = new StringBuilder();  
  76.         boolean flag = false;  
  77.         for (String string : stringList) {  
  78.             if (flag) {  
  79.                 result.append(",");  
  80.             } else {  
  81.                 flag = true;  
  82.             }  
  83.             result.append(string);  
  84.         }  
  85.         return result.toString();  
  86.     }  
  87.   
  88.     public static void main(String[] args) {  
  89.         long startTime, endTime;  
  90.         System.out.println("【爬虫开始】...");  
  91.         startTime = System.currentTimeMillis();  
  92.         // 从用户博客首页开始抓,开启5个线程,启动爬虫  
  93.         Spider.create(new CsdnBlogPageProcessor()).addUrl("http://blog.csdn.net/" + username).thread(5).run();  
  94.         endTime = System.currentTimeMillis();  
  95.         System.out.println("【爬虫结束】共抓取" + size + "篇文章,耗时约" + ((endTime - startTime) / 1000) + "秒,已保存到数据库,请查收!");  
  96.     }  
  97. }  


运行main方法数据就保存到数据库中去了。




完整的demo: http://download.csdn.net/detail/u011781521/9672531

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值