webmagic使用手册webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。web爬虫是一种技术,webmagic致力于将这种技术的实现成本降低,但是出于对资源提供者的尊重,webmagic不会做反封锁的事情,包括:验证码破解、代理切换、自动登录等。作者黄亿华(code4crafter@gmail.com)曾经在前公司进行过一年的垂直爬虫的开发,webmagic就是为了解决爬虫开发的一些重复劳动而产生的框架。webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者:python爬虫scrapy爬虫Spiderman遵循Apache2.0协议,你可以自由进行使用和修改。有使用不便或者问题,欢迎在github提交issue,或者在oschina讨论模块提问。下载及安装使用mavenwebmagic使用maven管理依赖,在项目中添加对应的依赖即可使用webmagic:dependencygroupIdus.codecraft/groupIdartifactIdwebmagic-core/artifactIdversion0.4.1/version/dependencydependencygroupIdus.codecraft/groupIdartifactIdwebmagic-extension/artifactIdversion0.4.1/version/dependency项目结构webmagic主要包括两个包:webmagic-corewebmagic核心部分,只包含爬虫基本模块和基本抽取器。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。webmagic-extensionwebmagic的扩展模块,提供一些更方便的编写爬虫的工具。包括注解格式定义爬虫、JSON、分布式等支持。webmagic还包含两个可用的扩展包,因为这两个包都依赖了比较重量级的工具,所以从主要包中抽离出来,这些包需要下载源码后自己编译:webmagic-saxonwebmagic与Saxon结合的模块。Saxon是一个XPath、XSLT的解析工具,webmagic依赖Saxon来进行XPath2.0语法解析支持。webmagic-seleniumwebmagic与Selenium结合的模块。Selenium是一个模拟浏览器进行页面渲染的工具,webmagic依赖Selenium进行动态页面的抓取。在项目中,你可以根据需要依赖不同的包。不使用maven不使用maven的用户,可以下载附带二进制jar包的版本(感谢oschina):gitclone在bin/lib目录下,有项目依赖的所有jar包,直接在IDE里import即可。第一个爬虫定制PageProcessorPageProcessor是webmagic-core的一部分,定制一个PageProcessor即可实现自己的爬虫逻辑。以下是抓取osc博客的一段代码:publicclassOschinaBlogPageProcesserimplementsPageProcessor{privateSitesite=Site.me().setDomain(my.oschina.net).addStartUrl();@Overridepublicvoidprocess(Pagepage){ListStringlinks=page.getHtml().links().regex().all();page.addTargetRequests(links);page.putField(title,page.getHtml().xpath(//div[@class='BlogEntity']/div[@class='BlogTitle']/h1).toString());page.putField(content,page.getHtml().$(div.content).toString());page.putField(tags,page.getHtml().xpath(//div[@class='BlogTags']/a/text()).all());}@OverridepublicSitegetSite(){returnsite;}publicstaticvoidmain(String[]args){Spider.create(newOschinaBlogPageProcesser()).pipeline(newConsolePipeline()).run();}}这里通过page.addTargetRequests()方法来增加要抓取的URL,并通过page.putField()来保存抽取结果。page.getHtml().xpath()则是按照某个规则对结果进行抽取,这里抽取支持链式调用。调用结束后,toString()表示转化为单个String,all()则转化为一个String列表。Spider是爬虫的入口类。Pipeline是结果输出和持久化的接口,这里ConsolePipeline表示结果输出到控制台。执行这个main方法,即可在控制台看到抓取结果。webmagic默认有3秒抓取间隔,请耐心等待。你可以通过site.setSleepTime(int)修改这个值。site还有一些修改抓取属性的方法。使用注解webmagic-extension包括了注解方式编写爬虫的方法,只需基于一个POJO增加注解即可完成一个爬虫。以下仍然是抓取oschina博客的一段代码,功能与OschinaBlogPageProcesser完全相同:@TargetUrl()publicclassOschinaBlog{@ExtractBy(//title)privateStringtitle;@ExtractBy(value=div.BlogContent,type=ExtractBy.Type.Css)privateStringcontent;@ExtractBy(value=//div[@class='BlogTags']/a/text(),multi=true)privateListStringtags;@Formatter(yyyy-MM-ddHH:mm)@ExtractBy(//div[@class='BlogStat']/regex('\\d+-\\d+-\\d+\\s+\\d+:\\d+'))privateDatedate;publicstaticvoidmain(String[]args){OOSpider.create(Site.me().addStartUrl(),newConsolePageModelPipeline(),OschinaBlog.class).run();}}这个例子定义了一个Model类,Model类的字段’title’、’content’、’tags’均为要抽取的属性。这个类在Pipeline里是可以复用的。注解的详细使用方式见后文中的webmagic-extension注解模块。模块详细介绍webmagic-corewebmagic-core是爬虫的核心框架,只包括一个爬虫各功能模块的核心功能。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。此节部分内容摘自作者的博文webmagic的设计机制及原理-如何开发一个Java爬虫。webmagic-core的模块划分webmagic-core参考了scrapy的模块划分,分为Spider(整个爬虫的调度框架)、Downloader(页面下载)、PageProcessor(链接提取和页面分析)、Scheduler(URL管理)、Pipeline(离线分析和持久化)几部分。只不过scrapy通过middleware实现扩展,而webmagic则通过定义这几个接口,并将其不同的实现注入主框架类Spider来实现扩展。Spider类(核心调度)Spider是爬虫的入口类,Spider的接口调用采用了链式的API设计,其他功能全部通过接口注入Spider实现,下面是启动一个比较复杂的Spider的例子。Spider.create(sinaBlogProcessor).scheduler(newFileCacheQueueScheduler(/data/temp/webmagic/cache/)).pipeline(newFilePipeline()).thread(10).run();Spider的核心处理流程非常简单,代码如下:privatevoidprocessRequest(Requestrequest){Pagepage=downloader.download(request,this);if(page==null){sleep(site.getSleepTime());return;}pageProcessor.process(page);addRequest(page);for(Pipelinepipeline:pipelines){pipeline.process(page,this);}sleep(site.getSleepTime());}Spider还包括一个方法test(Stringurl),该方法只抓取一个单独的页面,用于测试抽取效果。PageProcessor(页面分析及链接抽取)页面分析是垂直爬虫中需要定制的部分。在webmagic-core里,通过实现PageProcessor接口来实现定制爬虫。PageProcessor有两个核心方法:publicvoidprocess(Pagepage)和publicSitegetSite()。publicvoidprocess(Pagepage)通过对Page对象的操作,实现爬虫逻辑。Page对象包括两个最重要的方法:addTargetRequests()可以添加URL到待抓取队列,put()可以将结果保存供后续处理。Page的数据可以通过Page.getHtml()和Page.getUrl()获取。publicSitegetSite()Site对象定义了爬虫的域名、起始地址、抓取间隔、编码等信息。Selector是webmagic为了简化页面抽取开发的独立模块,是webmagic-core的主要着力点。这里整合了CSSSelector、XPath和正则表达式,并可以进行链式的抽取。//content是用别的爬虫工具抽取到的正文ListStringlinks=page.getHtml().$(div.title)//css选择,Java里虽然很少有$符号出现,不过貌似$作为方法名是合法的.xpath(//@href)//提取链接.regex(.*blog.*)//正则匹配过滤.all();//转换为string列表webmagic包括一个对于页面正文的自动抽取的类SmartContentSelector。相信用过EvernoteClearly都会对其自动抽取正文的技术印象深刻。这个技术又叫Readabilit