WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应用了HttpClient、Jsoup等Java世界最成熟的工具。其官网地址:http://webmagic.io/docs/zh/posts/ch1-overview/css
教程内容很丰富,详尽,下面是一个快速使用的例子:java
首先是pom文件须要引入git
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
若是你以前引入了slf4j,这里须要将slf4j的包排除,省得包冲突。web
测试代码以下,里面有详尽的解释:正则表达式
/** * @author panmingshuai * @description * @Time 2018年3月16日 下午2:46:28 * */ public class TestGithub implements PageProcessor { // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等 private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑 public void process(Page page) { // 部分二:定义如何抽取页面信息,并保存下来 page.putField("author", page.getUrl().regex("https://gitee\\.com/(\\w+)/.*").toString());//这里使用了正则匹配 page.putField("url", page.getUrl().toString()); /** * XPath原本是用于XML中获取元素的一种查询语言,可是用于Html也是比较方便的 * 这里使用了xpath匹配 */ String projectName = page.getHtml().xpath("//span[@class='project-title']/a[@class='repository']/@href").toString(); if(StringUtils.isNotBlank(projectName)){ String projectName2 = new StringBuilder(projectName).reverse().toString(); projectName2 = projectName2.substring(0, projectName2.indexOf("/")); String projectName3 = new StringBuilder(projectName2).reverse().toString(); page.putField("projectName", projectName3); } if (page.getResultItems().get("projectName")==null){ //若是取不到项目名,说明该页不是项目页,跳过此页 page.setSkip(true); } page.putField("readme", page.getHtml().xpath("//span[@class='git-project-desc-text']/text()")); // 部分三:从页面发现后续的url地址来抓取 /** * 这段代码的分为两部分,page.getHtml().links().regex("(https://gitee\\.com/[\\w\\-]+/[\\w\\-]+)").all() * 用于获取全部知足"(https://gitee\\.com/[\\w\\-]+/[\\w\\-]+)"这个正则表达式的连接, * page.addTargetRequests()则将这些连接加入到待抓取的队列中去。 */ page.addTargetRequests(page.getHtml().links().regex("(https://gitee\\.com/[\\w\\-]+/[\\w\\-]+)").all()); } @Override public Site getSite() { return site; } public static void main(String[] args) throws JMException { Spider osSpider = Spider.create(new TestGithub()) /** * WebMagic用于保存结果的组件叫作Pipeline。例如咱们经过“控制台输出结果”这件事也是经过一个内置的Pipeline完成的, * 它叫作ConsolePipeline。那么,我如今想要把结果用Json的格式保存下来,怎么作呢? * 只须要将Pipeline的实现换成"JsonFilePipeline"就能够了。 */ // .addPipeline(new JsonFilePipeline("E:\\webmagic\\")) .addUrl("https://gitee.com/panmingshuai") .thread(5) // .run() ; /** * 添加监听器,运行后cmd,使用jconsole.exe调出监听器 */ SpiderMonitor.instance().register(osSpider); osSpider.start(); } }
解释一下代码ide
page.getUrl().regex("https://gitee\\.com/(\\w+)/.*").toString()
和工具
page.getHtml().xpath("//span[@class='project-title']/a[@class='repository']/@href")
这两段代码上面一个使用了正则方式匹配内容,下面一个使用了xpath匹配内容,正则就很少说了,xpath的教程能够看看这个:http://www.w3school.com.cn/xpath/xpath_syntax.asppost
上面的正则匹配的是以https://gitee.com打头,中间跟了任意个数字,末尾以"."加任意的内容结尾的url,正则匹配能够用来匹配url之类的链接,很是好用。测试
下面的xpath匹配的是全部属性class为projiect-title的span元素下属性class为repository的a标签的href的值。xpath匹配网页上的具体内容,好比名字,文章之类的颇有效。网站
此外还有css选择器之类的可是我以为仍是这两个选择器好用,并且有了这两个选择器,基本上能完成爬虫全部须要的功能了。
另外这个爬虫的功能是爬取码云上项目的项目名,做者和项目介绍readme。