(一)案例
package org.pc.webmagic;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.model.ConsolePageModelPipeline;
import us.codecraft.webmagic.model.OOSpider;
import us.codecraft.webmagic.model.annotation.ExtractBy;
import us.codecraft.webmagic.model.annotation.ExtractByUrl;
import us.codecraft.webmagic.model.annotation.HelpUrl;
import us.codecraft.webmagic.model.annotation.TargetUrl;
/**
* TargetUrl是我们最终要抓取的URL,最终想要的数据都来自这里
* HelpUrl则是为了发现这个最终URL,我们需要访问的页面
* 例:对于博客页,HelpUrl是列表页,TargetUrl是文章页;
* 对于电商网站,HelpUrl是分类列表,TargetUrl是商品详情
* TargetUrl中的自定义正则表达式:
* 将URL中常用的字符.默认做了转义,变成了\.
* 将"*"替换成了".*",直接使用可表示通配符。(例如:
* https://github.com/*在这里是一个合法的表达式,它表示https://github.com/下的所有URL。)
* 属性 sourceRegion:这个参数是一个XPath表达式,指定了这个URL从哪里得到——不在sourceRegion的URL不会被抽取
* @author 咸鱼
* @date 2018/12/30 9:42
*/
@TargetUrl("https://github.com/\\w+/\\w+")
@HelpUrl("https://github.com/\\w+")
public class GithubRepo {
/**
* 默认抽取规则是XPath,若需其他类型抽取规则,则可通过 Type 属性指定
*/
@ExtractBy(value = "//h1[@class='entry-title public']/strong/a/text()", notNull = true)
private String name;
/**
* 注解@ExtractByUrl:从URL中抽取
*/
@ExtractByUrl("https://github\\.com/(\\w+)/.*")
private String author;
@ExtractBy("//div[@id='readme']/tidyText()")
private String readme;
public static void main(String[] args) {
/**
* 注解模式的入口是OOSpider,它继承了Spider类
* public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels);
* PageModelPipeline:注解模式下,处理结果的类叫做PageModelPipeline,通过实现它,你可以自定义自己的结果处理方式
* PageModelPipeline与Model类是对应的,多个Model可以对应一个PageModelPipeline。除了创建时,
* 你还可以通过 public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageModels)
* 方法,在添加一个PageModelPipeline的同时,可以添加多个pageModels。
*/
OOSpider.create(Site.me().setSleepTime(1000),
new ConsolePageModelPipeline(), GithubRepo.class)
.addUrl("https://github.com/code4craft")
.thread(5)
.run();
}
}
(二)知识要点
1、@TargetUrl:TargetUrl是我们最终要抓取的URL,最终想要的数据都来自这里
(1)TargetUrl中的自定义正则表达式:
- 将URL中常用的字符
.
默认做了转义,变成了\.
,例:http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html
来匹配http://blog.sina.com.cn/s/articlelist_1487828712_0_1.html
- 将
"*"
替换成了".*"
,直接使用可表示通配符,例:https://github.com/*在这里是一个合法的表达式,它表示https://github.com/下的所有URL
(2)属性 sourceRegion
这个参数是一个XPath表达式,指定了这个URL从哪里得到——不在sourceRegion的URL不会被抽取。
2、@HelpUrl:HelpUrl则是为了发现这个最终URL,我们需要访问的页面
- 对于博客页,HelpUrl是列表页,TargetUrl是文章页;
- 对于电商网站,HelpUrl是分类列表,TargetUrl是商品详情。
3、@ExtractBy:默认抽取规则是XPath,若需其他类型抽取规则,则可通过 Type 属性指定
4、@ExtractByUrl:从URL中抽取目标元素
5、OOSpider:注解模式的入口是OOSpider,它继承了Spider类
public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels);
参数PageModelPipeline
:注解模式下,处理结果的类叫做PageModelPipeline,通过实现它,你可以自定义自己的结果处理方式。ageModelPipeline与Model类是对应的,多个Model可以对应一个PageModelPipeline。除了创建时,你还可以通过 public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class… pageModels)方法,在添加一个PageModelPipeline的同时,可以添加多个pageModels。