View Javadoc
1   package us.codecraft.webmagic.model;
2   
3   import us.codecraft.webmagic.Site;
4   import us.codecraft.webmagic.Spider;
5   import us.codecraft.webmagic.pipeline.CollectorPipeline;
6   import us.codecraft.webmagic.pipeline.PageModelPipeline;
7   import us.codecraft.webmagic.processor.PageProcessor;
8   
9   import java.util.ArrayList;
10  import java.util.List;
11  
12  /**
13   * The spider for page model extractor.<br>
14   * In webmagic, we call a POJO containing extract result as "page model". <br>
15   * You can customize a crawler by write a page model with annotations. <br>
16   * Such as:
17   * <pre>
18   * {@literal @}TargetUrl("http://my.oschina.net/flashsword/blog/&#92;\d+")
19   *  public class OschinaBlog{
20   *
21   *      {@literal @}ExtractBy("//title")
22   *      private String title;
23   *
24   *      {@literal @}ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css)
25   *      private String content;
26   *
27   *      {@literal @}ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true)
28   *      private List&lt;String&gt; tags;
29   * }
30   * </pre>
31   * And start the spider by:
32   * <pre>
33   *   OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog")
34   *        ,new JsonFilePageModelPipeline(), OschinaBlog.class).run();
35   * }
36   * </pre>
37   *
38   * @author code4crafter@gmail.com <br>
39   * @since 0.2.0
40   */
41  public class OOSpider<T> extends Spider {
42  
43      private ModelPageProcessor modelPageProcessor;
44  
45      private ModelPipeline modelPipeline;
46  
47      private PageModelPipeline pageModelPipeline;
48  
49      private List<Class> pageModelClasses = new ArrayList<Class>();
50  
51      protected OOSpider(ModelPageProcessor modelPageProcessor) {
52          super(modelPageProcessor);
53          this.modelPageProcessor = modelPageProcessor;
54      }
55  
56      public OOSpider(PageProcessor pageProcessor) {
57          super(pageProcessor);
58      }
59  
60      /**
61       * create a spider
62       *
63       * @param site site
64       * @param pageModelPipeline pageModelPipeline
65       * @param pageModels pageModels
66       */
67      public OOSpider(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) {
68          this(ModelPageProcessor.create(site, pageModels));
69          this.modelPipeline = new ModelPipeline();
70          super.addPipeline(modelPipeline);
71          for (Class pageModel : pageModels) {
72              if (pageModelPipeline != null) {
73                  this.modelPipeline.put(pageModel, pageModelPipeline);
74              }
75              pageModelClasses.add(pageModel);
76          }
77      }
78  
79      @Override
80      protected CollectorPipeline getCollectorPipeline() {
81          return new PageModelCollectorPipeline<T>(pageModelClasses.get(0));
82      }
83  
84      public static OOSpider create(Site site, Class... pageModels) {
85          return new OOSpider(site, null, pageModels);
86      }
87  
88      public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) {
89          return new OOSpider(site, pageModelPipeline, pageModels);
90      }
91  
92      public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageModels) {
93          for (Class pageModel : pageModels) {
94              modelPageProcessor.addPageModel(pageModel);
95              modelPipeline.put(pageModel, pageModelPipeline);
96          }
97          return this;
98      }
99  
100     public OOSpider setIsExtractLinks(boolean isExtractLinks){
101         modelPageProcessor.setExtractLinks(isExtractLinks);
102         return this;
103     }
104 
105 }