使用WebMagic爬新浪博客

原创 2015年11月17日 20:10:45

WebMagic是一款Java爬虫框架,可以快速方便的定制自己的爬虫
项目链接http://webmagic.io/
中文文档http://webmagic.io/docs/zh/
项目包、源码下载http://webmagic.io/download.htm

将WebMagic作为jar包导入eclipse项目,新建类继承PageProcessor,用于解析页面,最重要的就是实现process函数

public class SinaBlogProcessor implements PageProcessor{

	   private Site site = Site
	        .me()
	        .setDomain("blog.sina.com.cn")
	        .setSleepTime(3000);

	    @Override
	    public void process(Page page) {	    
	    
	    }
        
	    @Override
	    public Site getSite() {
		return site;
	    }
	    
	    public static void main(String[] args) {
	    	Spider.create(new SinaBlogProcessor())  
                  .addUrl("http://blog.sina.com.cn/lm/index.html")
                  .run();
	    }
}

分析新浪博客页的链接,可用的链接有三种

导航:http://blog.sina.com.cn/lm/\\w+
      如http://blog.sina.com.cn/lm/
博主:http://blog\\.sina\\.com\\.cn/\\w{3,}
      如http://blog.sina.com.cn/dangnianmingyue
文章:http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html
      如http://blog.sina.com.cn/s/blog_49861fd50102e83x.html

对于导航页,抽取所有博主和文章链接
对于博主首页,抽取博文目录链接

http://blog\\.sina\\.com\\.cn/s/articlelist_\\w+_0_\\d+\\.html
如http://blog.sina.com.cn/s/articlelist_1233526741_0_1.html

对于文章页,则直接抽取文章内容

具体代码如下

 @Override
public void process(Page page) {	    
   Selectable selectUrl = page.getUrl();
    //首页
   if(selectUrl.regex(URL_LIST1).match()){
       page.addTargetRequests(page.getHtml().links().regex(URL_LIST2).all());
       page.addTargetRequests(page.getHtml().links().regex(URL_LIST4).all());
   }
   //导航
   else if(selectUrl.regex(URL_LIST4).match()){
       page.addTargetRequests(page.getHtml().links().regex(URL_LIST2).all());
   }
   //博客链接
   else if(selectUrl.regex(URL_LIST2).match()){
       page.addTargetRequests(page.getHtml().links().regex(URL_LIST3).all());
   }
   //列表页
   else if(selectUrl.regex(URL_LIST3).match()){
       page.addTargetRequests(page.getHtml().links().regex(URL_POST).all());
       page.addTargetRequests(page.getHtml().links().regex(URL_LIST3).all());
   }
   //文章页
   else if(selectUrl.regex(URL_POST).match()){
       page.putField("date",
	              page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)"));
       page.putField("tag",
	              page.getHtml().xpath("//div[@id='articlebody']//td[@class='blog_tag']/allText()"));
       page.putField("class",
                      page.getHtml().xpath("//div[@id='articlebody']//td[@class='blog_class']/allText()"));
       page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2/text()"));
       page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']/tidyText()"));
   }
}

putField(),将抽取的页面元素存入ResultItems对象中,可以在Pipeline中处理,如输出到控制台,输出为文件,存储在数据库中
参考FilePipeline改写的Pipeline

public class TestPipeline extends FilePersistentBase implements Pipeline {

    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * create a FilePipeline with default path"/data/webmagic/"
     */
    public TestPipeline() {
        setPath("/data/webmagic/");
    }

    public TestPipeline(String path) {
        setPath(path);
    }

    @Override
    public void process(ResultItems resultItems, Task task) {
        String path = this.path + PATH_SEPERATOR + task.getUUID() + PATH_SEPERATOR;
        try {
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter
            		(new FileOutputStream(getFile(path + resultItems.get("title") + ".txt")),"UTF-8"));
            printWriter.println("url:\t" + resultItems.getRequest().getUrl());
            for (Map.Entry<String, Object> entry : resultItems.getAll().entrySet()) {
                if (entry.getValue() instanceof Iterable) {
                    Iterable value = (Iterable) entry.getValue();
                    printWriter.println(entry.getKey() + ":");
                    for (Object o : value) {
                        printWriter.println(o);
                    }
                } else {
                    printWriter.println(entry.getKey() + ":\t" + entry.getValue());
                }
            }
            printWriter.close();
        } catch (IOException e) {
            logger.warn("write file error", e);
        }
    }
}

其中PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(getFile(path + resultItems.get("title") + ".txt")),"UTF-8"));用于定义文件的格式等
在PageProcessor的process函数中加上

if&nbsp;(page.getResultItems().get("content")==null){

    //设置skip之后,这个页面的结果不会被Pipeline处理
    page.setSkip(true);
}

则不是文章页的链接都不会被Pipeline处理
主函数

 public static void main(String[] args) {
	    	Spider.create(new SinaBlogProcessor())
	    	      .setScheduler(new FileCacheQueueScheduler("D:\\urlfile"))
                  .addPipeline(new TestPipeline("D:\\textfile"))
                  .addUrl("http://blog.sina.com.cn/lm/index.html")
                  .thread(5)
                  .run();
}

.addPipeline(new TestPipeline("D:\\textfile"))添加Pipeline,设置输出为文件的路径,可同时添加多个Pipeline
.setScheduler(new FileCacheQueueScheduler("D:\\urlfile"))用于设置Scheduler,一个Spider只能有个一个Scheduler,FileCacheQueueScheduler表示使用文件保存抓取URL,可以在关闭程序并下次启动时,从之前抓取到的URL继续抓取,需指定路径,会建立.urls.txt和.cursor.txt两个文件
.thread(5)开启多线程
使用WebMagic爬新浪博客

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

WebMagic爬虫框架学习

参考博文:http://webmagic.io/docs/zh/posts/ch1-overview/architecture.html WebMagic in Action Little b...

webmagic——魔法般的爬虫框架

webMagic   是一个非常不错的开发框架。简单易学,只要会java就可以很轻松上手; 首先我先分享一下我学习时所使用资料: 1、http://webmagic.io/(非...

用webmagic实现的网络爬虫

用webmagic实现的网络爬虫 网络蜘蛛(网络爬虫)Web Spider是一个非常形象的比喻,如果我们的网络是一个蜘蛛网,每个节点就是一个网站,联系每个节点的蜘蛛丝就是我们网站的连接。网络爬虫...

转载自新浪博客关于 asp或者SHTML 中 # include file/virtual的使用区别

#include virtual/file比较  (2009-04-05 17:28:57) 转载▼     在编写ASP程序...
  • leepne
  • leepne
  • 2013-11-25 15:44
  • 1058

新浪博客架构分享.ppt

  • 2013-05-29 15:38
  • 1.42MB
  • 下载

仿新浪博客留言评论功能

  • 2016-06-02 13:20
  • 2.90MB
  • 下载

Java RTTI与反射(参照Java编程思想与新浪博客)

一、Java的RTTI        RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对...

新浪博客DIY

一、DIY博客背景代码: body {background:url(页面大背景图片地址) repeat scroll!important;} .banner {background:url...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)