webmagic是Java语言用于爬虫的工具。官网地址:http://webmagic.io/,中文文档地址:http://webmagic.io/docs/zh/

使用webmagic有3种配置需要注意,日志配置(log4j),webmagic爬取配置(如超时时间),使用数据库的话数据库连接池配置。有一些配置最好做到可以随机器性能情况而改变配置信息。这样做的目的是为了将项目打成包以后在命令行下执行程序可以随时更改配置。因此有些配置文件就不像c3p0配置文件一样放在源码文件夹下,而是相对与项目路径来说。

webmagic的架构图如下:

  从该架构图上可以得到一个信息,对于每一个页面来说,都会经历一个完成的过程,即从downloader--->pipeline,如列表页也会进入pipeline,所以列表页虽然没有数据需要存储,但在pipeline中去拿值就会出现空指针,因此在pipeline中要先进行判断,有值的情况下在进行数据库存储操作。

  在页面解析部分(待补充),webmagic将解析语法做了一些改变,

    1、如将正则表达式中.用\.表示

    2、*变成了.*,直接使用表示通配符

    3、xpath语法也进行了扩充。

代码示例:

  webmagic版本:0.6.0

  1. package com.lh.pipeline;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Map.Entry;
  9. import java.util.Set;
  10.  
  11. import javax.sql.DataSource;
  12.  
  13. import com.mchange.v2.c3p0.ComboPooledDataSource;
  14.  
  15. import us.codecraft.webmagic.ResultItems;
  16. import us.codecraft.webmagic.Task;
  17. import us.codecraft.webmagic.pipeline.Pipeline;
  18.  
  19. public class MysqlPipeline implements Pipeline {
  20. //有一个容器
  21. static DataSource ds = new ComboPooledDataSource();//直接使用即可,不用显示的配置,其会自动识别配置文件
  22. public void process(ResultItems resultItems, Task task) {
  23. //每进来一次代表一条记录
  24. //如果容器值达到1000,存一次数据库并将数据清空,否则将数据存入容器
  25. Map<String, Object> m = resultItems.getAll();
  26. if(!m.isEmpty()){
  27. Set<Entry<String, Object>> set = m.entrySet();
  28. Iterator<Entry<String, Object>> reconds = set.iterator();
  29. String url = null;
  30. String name = null;
  31. String content = null;
  32. for(int i=0;i<set.size();i++){
  33. Entry<String, Object> recond =reconds.next();
  34. if(i==0){
  35. url = recond.getValue().toString();
  36. }else if(i==1){
  37. name = recond.getValue().toString();
  38. }else if(i==2){
  39. content = recond.getValue().toString();
  40. }
  41.  
  42. }
  43.  
  44. Connection conn = null;
  45. try {
  46. conn = ds.getConnection();
  47. String sql = "insert into softList(url,name,content) values(?,?,?)";
  48. PreparedStatement pstmt = conn.prepareStatement(sql);
  49. pstmt.setString(1, url);
  50. pstmt.setString(2, name);
  51. pstmt.setString(3, content);
  52. pstmt.execute();
  53. pstmt.close();
  54. conn.close();
  55.  
  56. } catch (SQLException e) {
  57. e.printStackTrace();
  58. }
  59.  
  60. }
  61. }
  62. }
  1. package com.lh.spider;
  2.  
  3. import com.lh.pipeline.MysqlPipeline;
  4.  
  5. import us.codecraft.webmagic.Page;
  6. import us.codecraft.webmagic.Site;
  7. import us.codecraft.webmagic.Spider;
  8. import us.codecraft.webmagic.pipeline.FilePipeline;
  9. import us.codecraft.webmagic.processor.PageProcessor;
  10.  
  11. public class ProgramSpider implements PageProcessor {
  12.  
  13. private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000);
  14.  
  15. public static final String URL_LIST = "http://www\\.xiazaiba\\.com/downlist/187_\\d{1,4}\\.html";
  16.  
  17. public static final String URL_POST = "http://www\\.xiazaiba\\.com/html/\\d+.html";
  18.  
  19. public void process(Page page) {
  20.  
  21. if(page.getUrl().regex("http://www\\.xiazaiba\\.com/downlist/187\\.html").match()||page.getUrl().regex(URL_LIST).match()){
  22. //第一页
  23. //加入详情页
  24. //加入列表页
  25. page.addTargetRequests(page.getHtml().xpath("//ul[@class='cur-cat-list']/li/a[1]").links().all());
  26. page.addTargetRequests(page.getHtml().xpath("//div[@class='ylmf-page']").links().all());
  27. }else{
  28. //详情页
  29. page.putField("url", page.getUrl());
  30. page.putField("ProgramName", page.getHtml().xpath("//div[@class='soft-title']/html()"));
  31. page.putField("ProgramContent", page.getHtml().xpath("//td[@class='soft-content']/html()"));
  32. }
  33. }
  34.  
  35. public Site getSite() {
  36. return site;
  37. }
  38. public static void main(String[] args) {
  39. Spider.create(new ProgramSpider())
  40. .addUrl("http://www.xiazaiba.com/downlist/187.html")
  41. .addPipeline(new MysqlPipeline()).thread(10)
  42. .run();
  43. }
  44. }

webmagic使用的更多相关文章

  1. 爬虫框架--webmagic

    官方有详细的使用文档:http://webmagic.io/docs/zh/ 简介:这只是个java爬虫框架,具体使用需要个人去定制,没有图片验证,不能获取js渲染的网页,但简单易用,可以通过xpat ...

  2. webmagic的设计机制及原理-如何开发一个Java爬虫

    之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...

  3. 基于webmagic的爬虫项目经验小结

    大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份: 一.为什么选择webmagic? 说实话,开源的爬虫框架已经很多了,有各种语言(比如:python.j ...

  4. webmagic 增量爬取

    webmagic  是一个很好并且很简单的爬虫框架,其教程网址:http://my.oschina.net/flashsword/blog/180623 webmagic参考了scrapy的模块划分, ...

  5. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  6. 02_使用WebMagic爬虫获取CSDN推荐专家的个人博客信息

    本来是想抓取博客园的博客推荐的页面的,但由于一些博客进去的页面格式都不太相同,一时不想花时间去寻找规律,发现CSDN上面的格式较为单一,就决定以CSDN推荐专家的个人博客信息作为爬虫抓取的目标. [首 ...

  7. WebMagic开源垂直爬虫介绍

    WebMagic项目代码分为核心和扩展两部分.核心部分(webmagic-core)是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.WebMagic的架构设计参照了Scrap ...

  8. WebMagic的设计参考了业界最优秀的爬虫Scrapy

    http://webmagic.io/docs/zh/posts/ch1-overview/thinking.html https://github.com/psvehla/liferay-sprin ...

  9. 大白痴学习webmagic

    摘要 webmagic 学习 从头 刚刚开始学,很多东西可能理解错了,还请各位指教 一些基本类: Request:包含要爬行的url和一些附加信息,是Page的一个成员变量 主要成员变量 String ...

  10. webmagic加上了注解支持

    今天有个网友在博客回帖,能不能用注解来写一个爬虫?想了想,因为Javaer总习惯结果有个对象Model(我在自己用的时候也是这样),ResultItems的key-value形式难免会有点麻烦,何不将 ...

随机推荐

  1. 原生JavaScript获取css样式

    访问属性:obj.attr 或者 obj['attr'] 通过js访问style属性 : document.getElementById("main").style.backgro ...

  2. 在Linux上部署DotNet Core项目的时候发现Apache无法转发Kestrel的5000端口的问题

    CentOS服务器上使用Apache托管Dotnet Core2,服务启动了,端口也打开了.在本地使用curl命令可以访问5000端口的网页内容,但是访问Apache的端口却无法获取到网页的内容.想起 ...

  3. shfileoperation 删除文件 FileDelete(CString strName)

    From:http://blog.csdn.net/lvwx369/article/details/41440883 注意:其中namePath 为全局变量 Cstring namePath; BOO ...

  4. 【前端】JavaScript入门学习

    <button type="button" onclick="alert('hillo!')">Here</button> <sc ...

  5. 【ACM非算法部分】scanf()函数

    scanf函数 格式说明符: %c    字符型 %d    十进制数 %i     读入十进制,八进制,十六进制数.输入的时候正常是十进制数,若输入0前缀的数将读入八进制,0x前缀读入16进制.若输 ...

  6. 用JQuery写出登录弹出框

    类似百度的登录弹出框,可用jquery的fadeIn(),hide(),show(),slideDown()等动画函数实现,一下为html5 代码: <!DOCTYPE html> < ...

  7. Tornado输出和响应头

    1.输出 再来看看输出`write`,实际上,`write`并没有直接把数据返回给前端,而是先写到缓存区,函数结束之后才会返回到前端,我们验证如下 class FlushHandler(tornado ...

  8. database - 数据库设计/使用容易忽略的细节

    一.设计 1,数据类型尽量使用数字型,数字型的比较比字符型的快很多 2,数据类型尽量小,预测可以满足未来需求的前提 3,尽量建表时字段不允许为null,除非必要,可以用NOT NULL+DEFAULT ...

  9. 浅谈CSRF跨站点请求

    CSRF是什么?      (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One C ...

  10. Java 传递可变参数和方法重载

    形式:类型... 参数名 示例:public void show(int... a) {}; 可变参数在方法中被当作数组来处理 可变参数传值的四种方式: 一个值也不传,可变参数会接收到长度为0的数组 ...