From e7e7f7c8874435a5582e256ec0baa776d89bfc64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E4=BA=BF=E5=8D=8E?= Date: Sun, 9 Jun 2013 22:55:49 +0900 Subject: [PATCH 001/175] update samples --- README.md | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 723adf42f..e4adfd2c1 100644 --- a/README.md +++ b/README.md @@ -61,27 +61,7 @@ webmagic定制的核心是PageProcessor接口。一个最简单的webmagic爬虫 } } ---- - -TODO - - - public class OschinaBlogPageProcesser implements PageProcessor { - - @Override - public void process(Page page) { - List strings = page.getHtml().rs("]*href=[\"']{1}(http://my\\.oschina\\.net/\\w+/blog/\\d+)[\"']{1}").toStrings(); - page.addTargetRequests(strings); - page.putField("title", page.getHtml().xs("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1")); - page.putField("content", page.getHtml().sc()); - page.putField("author", page.getUrl().r("my\\.oschina\\.net/(\\w+)/blog/\\d+")); - } - - @Override - public Site getSite() { - return Site.me().setDomain("my.oschina.net").setStartUrl("http://www.oschina.net/"). - setUserAgent("Mozilla/5.0 (Macintosh; Chrome/26.0.1410.65 Safari/537.31"); - } - } +### 示例 +可参考作者博客[使用webmagic抓取页面并保存为wordpress文件](http://my.oschina.net/flashsword/blog/136846) From e7c9ba8369f0e70a91456d942588346ce1c112d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E4=BA=BF=E5=8D=8E?= Date: Sun, 9 Jun 2013 22:00:39 +0800 Subject: [PATCH 002/175] update comment --- .../us/codecraft/webmagic/selector/SmartContentSelector.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java index c2e36dff9..10ab15c6c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java @@ -8,7 +8,8 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * 找到clear + * readability算法,基础是找到所有p标签的父节点 + * 写的比较乱,最终效果还在尝试中 * User: cairne * Date: 13-4-21 * Time: 下午4:42 From c90fb42a2c0e299be7bb667c6d338eb6915e9859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E4=BA=BF=E5=8D=8E?= Date: Thu, 13 Jun 2013 15:51:05 +0800 Subject: [PATCH 003/175] update pom --- pom.xml | 99 ++++----------------------------------------------------- 1 file changed, 6 insertions(+), 93 deletions(-) diff --git a/pom.xml b/pom.xml index c424910a6..3772cd011 100644 --- a/pom.xml +++ b/pom.xml @@ -8,98 +8,11 @@ webmagic - - - org.apache.httpcomponents - httpclient - 4.2.1 - + + ./webmagic-core + ./webmagic-plugin/ + ./webmagic-samples/ + - - junit - junit - 4.7 - test - - - com.google.guava - guava - 13.0.1 - - - - org.apache.commons - commons-lang3 - 3.1 - - - - log4j - log4j - 1.2.17 - - - - commons-collections - commons-collections - 3.2.1 - - - - net.sourceforge.htmlcleaner - htmlcleaner - 2.4 - - - - org.apache.commons - commons-io - 1.3.2 - - - - - - - - org.apache.maven.plugins - maven-resources-plugin - - UTF-8 - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.0-beta-7 - - - - - - \ No newline at end of file + From de3e9055610b38b56fd3952d4d7e0340222240a2 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 13 Jun 2013 15:58:42 +0800 Subject: [PATCH 004/175] update readme --- README.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e4adfd2c1..8724e8902 100644 --- a/README.md +++ b/README.md @@ -2,25 +2,28 @@ webmagic --------- ####*一个网络爬虫工具包* -webmagic的发起源于工作中的需要,其定位是帮助开发者更便捷的开发一个垂直的网络爬虫。webmagic可以便捷的使用xpath和正则表达式进行链接和内容的提取,对于有Java和xpath或者正则基础的开发者,只需编写少量代码即可完成一个定制爬虫。 +webmagic的发起源于工作中的需要,其定位是帮助开发者更便捷的开发一个垂直的网络爬虫。 -###哲学### +webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),开发者可以便捷的使用xpath和正则表达式进行链接和内容的提取,只需编写少量代码即可完成一个定制爬虫。 -* Write Less, Do more. +###特色### - webmagic是一个开发者的工具包,它的目标是让开发者可以通过更少的代码,实现一个高质量的爬虫。webmagic内部还集成了一些常见的垂直性爬虫的功能,例如针对页面正文的Readability技术,可以直接对页面的正文进行智能提取。 +* ####垂直爬虫#### + webmagic着重于页面抽取的工作。开发者可以使用xpath和正则表达式进行链接和内容的提取,支持链式API调用,以及单复数转换。 + + String content = page.getHtml().x("//div[@class='body']").r("这段话比较重要(.*)").toString(); +* ####嵌入式&无配置#### + webmagic与其他Full-Stack的框架不同,没有配置文件,大部分功能都通过简单的API调用完成。webmagic以jar包的形式存在,并且不依赖任何框架,在程序可以随处进行调用。 + 以下是爬取oschina博客的一段代码: Spider.me().processor(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); + +* ####可扩展#### + 参考[`scrapy`](https://github.com/scrapy/scrapy)的设计,webmagic将爬虫的扩展点分为Processor、Schedular、Downloader、Pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展Schedular实现断点续传乃至于分布式爬虫;可以通过扩展Pipeline实现业务可定制的持久化功能。 -* 简单可用 - - webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),是一个完整的爬虫框架。但是与其他Full-Stack的框架不同,webmagic只引入少量约定,大部分功能都通过简单的API调用完成,目的是尽量降低开发者的学习成本。webmagic以jar包的形式存在,并且不依赖任何框架,在程序可以随处进行调用。 - -* 灵活性 - - 参考scrapy的设计,webmagic将爬虫的扩展点分为processor、schedular、downloader、pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展schedular实现断点续传乃至于分布式爬虫;可以通过扩展pipeline实现业务可定制的持久化功能。 + ------ @@ -65,3 +68,7 @@ webmagic定制的核心是PageProcessor接口。一个最简单的webmagic爬虫 可参考作者博客[使用webmagic抓取页面并保存为wordpress文件](http://my.oschina.net/flashsword/blog/136846) +### 协议 + +webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) + From a48523ed4b3173c0c11be0a69d9f1716cd2b5d17 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 16 Jun 2013 14:47:02 +0800 Subject: [PATCH 005/175] fix a pom error --- README.md | 15 +++++++++++---- pom.xml | 2 +- .../webmagic/processor/SimplePageProcessor.java | 4 ++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8724e8902..e92a4405c 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,9 @@ webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载 ###Get Started -webmagic定制的核心是PageProcessor接口。一个最简单的webmagic爬虫例子是这样的: - - Spider.me().processor(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); +webmagic定制的核心是PageProcessor接口。 -其中SimplePageProcessor实现如下: +例如,我们要实现一个简单的通用爬虫SimplePageProcessor,代码如下: public class SimplePageProcessor implements PageProcessor { @@ -53,16 +51,25 @@ webmagic定制的核心是PageProcessor接口。一个最简单的webmagic爬虫 @Override public void process(Page page) { List requests = page.getHtml().as().rs(urlPattern).toStrings(); + //调用page.addTargetRequests()方法添加待抓取链接 page.addTargetRequests(requests); + //xpath方式抽取 page.putField("title", page.getHtml().x("//title")); + //sc表示使用Readability技术抽取正文 page.putField("content", page.getHtml().sc()); } @Override public Site getSite() { + //定义抽取站点的相关参数 return site; } } + +调用这个爬虫的代码如下: + + Spider.me().processor(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); + ### 示例 diff --git a/pom.xml b/pom.xml index 3772cd011..68927f20b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ us.codecraft 0.0.1-SNAPSHOT 4.0.0 - + pom webmagic diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index a8165bb42..eb8f56ea2 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -29,13 +29,17 @@ public SimplePageProcessor(String startUrl, String urlPattern) { @Override public void process(Page page) { List requests = page.getHtml().as().rs(urlPattern).toStrings(); + //调用page.addTargetRequests()方法添加待抓取链接 page.addTargetRequests(requests); + //xpath方式抽取 page.putField("title", page.getHtml().x("//title")); + //sc表示使用Readability技术抽取正文 page.putField("content", page.getHtml().sc()); } @Override public Site getSite() { + //定义抽取站点的相关参数 return site; } } From 1a2f8fb247750a6c3dc0ef4e3d682e07f9f94278 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 17 Jun 2013 11:12:22 +0800 Subject: [PATCH 006/175] clean some code --- .../webmagic/processor/PageProcessor.java | 2 +- .../webmagic/selector/Selectable.java | 4 +- .../us/codecraft/webmagic/SpiderTest.java | 131 - .../webmagic/selector/HtmlCleanerTest.java | 28 - .../selector/SmartConentSelectorTest.java | 3051 ------------- .../webmagic/selector/XpathSelectorTest.java | 4068 ++++++----------- webmagic-core/src/test/resources/log4j.xml | 2 +- .../java/us/codecraft/webmagic/HtmlTest.java | 20 - .../us/codecraft/webmagic/SpiderTest.java | 3 + .../processor/DiandianProcessorTest.java | 2 + .../processor/DiaoyuwengProcessorTest.java | 2 + .../processor/SinablogProcessorTest.java | 2 + 12 files changed, 1350 insertions(+), 5965 deletions(-) delete mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/SpiderTest.java delete mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/selector/HtmlCleanerTest.java delete mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/selector/SmartConentSelectorTest.java delete mode 100644 webmagic-samples/src/test/java/us/codecraft/webmagic/HtmlTest.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java index 22a24c96f..e3c74a904 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java @@ -18,7 +18,7 @@ public interface PageProcessor { /** * the site the processor for - * @return + * @return site */ public Site getSite(); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 0fcc4208d..68ca47d44 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -35,14 +35,14 @@ public interface Selectable { /** * select a link * - * @return + * @return first link */ public Selectable a(); /** * select all links * - * @return + * @return all links */ public Selectable as(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/SpiderTest.java deleted file mode 100644 index 5cb9848ff..000000000 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package us.codecraft.webmagic; - -import org.junit.Ignore; -import org.junit.Test; -import us.codecraft.webmagic.pipeline.FilePipeline; -import us.codecraft.webmagic.processor.SimplePageProcessor; -import us.codecraft.webmagic.samples.HuxiuProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; - -/** - * User: cairne - * Date: 13-4-20 - * Time: 下午7:46 - */ -public class SpiderTest { - - - @Test - public void testSpider() throws InterruptedException { - Spider me = Spider.me().pipeline(new FilePipeline()).processor(new HuxiuProcessor()); - me.run(); - } - - @Test - public void testGlobalSpider(){ -// PageProcessor pageProcessor = new MeicanProcessor(); -// Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueSchedular(pageProcessor.getSite(),"/data/temp/webmagic/cache/")). -// processor(pageProcessor).run(); - SimplePageProcessor pageProcessor2 = new SimplePageProcessor("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space", "http://www.diaoyuweng.com/thread-*-1-1.html"); - pageProcessor2.getSite().setEncoding("GBK"); - System.out.println(pageProcessor2.getSite().getEncoding()); - Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueSchedular(pageProcessor2.getSite(),"/data/temp/webmagic/cache/")). - processor(pageProcessor2).run(); - - - } - - @Test - public void test(){ - System.out.println(System.getProperty("java.io.tmpdir")); - } - - - @Ignore - @Test - public void languageSchema() { - - - /** - * - * _hrefs = rs("]*href=[\"']{1}(/yewu/.*?)[\"']{1}") - * title = r(""(.*)"") - * body = x("//dd[@class='w133']") - * - * site.domain = "sh.58.com" - * site.ua="" - * site.cookie="aa:bb" - * - */ - - /** - * - * - * if (page == r('') && refer(1) == 1) { - * - * type = _refer(1) - * content = _text.t().c() - * title = x("asd@asd").r("",1) - * body[r(_currentUrl).g(1)] = body[r(_currentUrl).g(1)] + (x("").r("",1,2).c()) - * - * body=body[r(_currentUrl).g(1)] - * tags[%] = (tags[%] + xs('')) . r('') - * - * _targetUrls.add('' + x('').r('')) - * _sourceUrls.add() - * _header.put("",""); - * _cookie.add("asdsadasdsa"); - * - * - * } - * - * _cookie.add(_cookie['']) - * - * if (page == r('') && refer(1) == 1) - * ( - * _targetUrl = '' + x('') & r('') - * _sourceUrl = '' - * ) - * - */ - - /** - * - * - * - * - * - * - * - * - * - * - */ - - /** - * - * if (model.url('') && model.refer(1) == 1) - * ( - * - * model.set(type, model.refer(1)) - * content = t(_html) > c() - * title = x(_html, 'asd@asd') > r('',1) - * body[r(_currentUrl).g(1)] = body[r(_currentUrl).g(1)] + (x('') > r('',1,2) > c()) | x('') - * tags[%] = tags + xs('') > r('') - * model.setTargetUrl(); - * - * _targetUrl = '' + x('') & r('') - * _sourceUrl = '' - * ) - * - * _cookie.add(_cookie['']) - * - * if (page == r('') && refer(1) == 1) - * ( - * _targetUrl = '' + x('') & r('') - * _sourceUrl = '' - * ) - * - */ - } -} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/HtmlCleanerTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/HtmlCleanerTest.java deleted file mode 100644 index 7aa2fc77d..000000000 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/HtmlCleanerTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package us.codecraft.webmagic.selector; - -import org.htmlcleaner.CleanerProperties; -import org.htmlcleaner.HtmlCleaner; -import org.htmlcleaner.TagNode; -import org.junit.Test; - -import java.io.IOException; -import java.net.URL; - -/** - * User: cairne - * Date: 13-4-21 - * Time: 上午10:35 - */ -public class HtmlCleanerTest { - - @Test - public void test() throws IOException { - HtmlCleaner htmlCleaner = new HtmlCleaner(); - - CleanerProperties props = htmlCleaner.getProperties(); - - TagNode node = htmlCleaner.clean(new URL("http://www.huanqiu.com"),"UTF-8"); - System.out.println(node.getAllElementsList(true)); - System.out.println(node); - } -} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SmartConentSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SmartConentSelectorTest.java deleted file mode 100644 index 4620a242b..000000000 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SmartConentSelectorTest.java +++ /dev/null @@ -1,3051 +0,0 @@ -package us.codecraft.webmagic.selector; - -import org.junit.Test; - -import java.io.IOException; - -/** - * User: cairne - * Date: 13-4-21 - * Time: 上午10:35 - */ -public class SmartConentSelectorTest { - - @Test - public void test() throws IOException { - String text ="\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 全文Feed的终极解决方案 - 阮一峰的网络日志\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
阮一峰的网络日志 » 首页 » 档案\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "

分类

\n" + - " \n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "

全文Feed的终极解决方案

\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "

作者: 阮一峰

\n" + - "\n" + - "

日期: 2010年4月17日

\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - " \n" + - "

正如我们都知道的,全文Feed最有用。

\n" + - " \n" + - "\n" + - "\n" + - " \n" + - "

但是,世界上的大部分Feed,都是摘要Feed,甚至是标题Feed。我们只好自己动手,制作全文Feed。

\n" + - "\n" + - "

传统的制作方法非常麻烦,需要针对不同的网站,编写不同的内容提取规则。要是有一个傻瓜型的\"全文Feed生成器\",把摘要Feed往里面一扔,全文Feed就自动生成了,那该多好。

\n" + - "\n" + - "

FiveFilters.org提供的生成器,大概最接近于这种要求。

\n" + - "\n" + - "

\n" + - "\n" + - "

举例来说,网易的社会新闻Feed(http://news.163.com/special/00011K6L/rss_sh.xml)是一个摘要Feed。

\n" + - "\n" + - "

\n" + - "\n" + - "

我们把这个网址,送进FiveFilters.org,点击\"Create Feed\"按钮,全文Feed就自动产生了!(查看效果

\n" + - "\n" + - "

但是,这个生成器并不是百用百灵,比如新浪的Feed(http://rss.sina.com.cn/news/society/focus15.xml)就无法抓取全文。

\n" + - "\n" + - "

好在今年3月份,它开源了。作者Keyvan Minoukadeh将所有代码都公开了,所以如果遇到不能生效的Feed,现在我们就可以修改源码了。因此理论上,几乎所有的摘要Feed都可以自动转成全文Feed了。

\n" + - "\n" + - "

源码存放在launchpad.net上,需要安装Bazaar的客户端才能下载。我为大家提供方便,把它们压缩成一个zip文件,点击下载(1.0版,217KB)。

\n" + - "\n" + - "

下载后,上传到支持PHP 5.2的虚拟主机上,就可以直接使用。使用的时候,需要将cache子目录设为可写(权限777)。在config-sample.php文件中,可以查看设置选项,修改默认值后,将文件名改为config.php,就会生效。(不修改亦可,config文件并不是必需的。)

\n" + - "\n" + - "

这个程序的核心是readability.php文件,它负责判断当前网页中,那一部分属于页面的主要内容,然后将其抓取出来。实现原理照搬了arc90的ReadAbility脚本。简单说,思路是这样的:1)检查页面中所有p元素的父容器;2)根据相关特征,为每一个父容器计算一个特征值;3)特征值最大的容器,就是放置主要内容的容器。

\n" + - "\n" + - "

具体实现请阅读代码,源码写得非常清晰,而且有详细的注释。如果遇到不能抓取全文的Feed,你就要自己修改readability.php,增加相应的规则。比如,在我提供下载的代码中,我就设置了新浪网的规则,新浪网的全文Feed就能自动生成了。

\n" + - "\n" + - "

这个程序使用的是AGPL许可证,这就是说你可以自由地使用、修改、发布这个程序,但是只要你向他人提供基于这个程序的服务,你就必须公开源码。

\n" + - "\n" + - "

作者Keyvan Minoukadeh允诺,只要使用者向他捐款200美元,就发布2.0版。如果你喜欢这个程序,建议向他捐款

\n" + - "\n" + - "

P.S.

\n" + - "\n" + - "

这几天,我还发现了一个非常优秀的开源相册软件ZenPhoto,也推荐使用。

\n" + - "\n" + - "

UPDATE(2010.6.3)

\n" + - "\n" + - "

Full TEXT RSS 1.5版下载(283KB)

\n" + - "\n" + - "

UPDATE(2010.11.10)

\n" + - "\n" + - "

Full TEXT RSS 2.1版下载(362KB)

\n" + - "\n" + - "

(完)

\n" + - " \n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "

文档信息

\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - "
\n" + - "
\n" + - "

相关文章

\n" + - "
    \n" + - "\n" + - "
  • 2012.12.21: Javascript异步编程的4种方法\n" + - "\n" + - "
    \n" + - " 你可能知道,Javascript语言的执行环境是\"单线程\"(single thread)。\n" + - "
    \n" + - "\n" + - "
  • \n" + - "\n" + - " \n" + - "
  • 2012.12.14: 奥巴马筹款网站的制作过程\n" + - "\n" + - "
    \n" + - " 1.\n" + - "\n" + - "Kyle Rush是一个网站工程师。\n" + - "
    \n" + - "\n" + - "
  • \n" + - "\n" + - " \n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "

功能链接

\n" + - "
    \n" + - "
  • 前一篇:\"草原新城\"康巴什
  • \n" + - "
  • 后一篇:网络时代的音乐家生存指南
  • \n" + - "
  • 更多内容请访问:首页 » 档案 » \n" + - "IT技术 \n" + - "
  • \n" + - "\n" + - "
  • \n" + - "\n" + - "
    \n" + - "\n" + - "站内搜索:\n" + - "\n" + - "\n" + - "Web\n" + - "\n" + - "www.ruanyifeng.com\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
    \n" + - "\n" + - "
  • \n" + - "
  • Feed订阅:
  • \n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "

广告(购买广告位)

\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - "

留言(23条)

\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " zp\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

能不能介绍些Movable Type的文章,我比较喜欢它的静态页面,国内关于它的资料好像还不多。特别是MT5出来后,多页面功能可能会让刚接触的人晕头转向。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 火点\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

很好,谢谢作者,只是赶到花了大量的时间在新闻上似乎有点不利于思考。

\n" + - "\n" + - "

用一个图书管理软件(BLM)整理了大学期间看过的书,仅有180本左右,汗颜,这就是我的大学……

\n" + - "\n" + - "

现在参加工作了,好在业余时间还算充裕,希望可以多读一些书。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " AlbertDiao\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

如果是手机RSS的话,摘要Feed比较好。一般浏览摘要,感兴趣的点进全文,这样比较节省流量。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 野草博客\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

嗯,野草一直在用他:)

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " Ruan YiFeng\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
引用AlbertDiao的发言:
\n" + - "\n" + - "

如果是手机RSS的话,摘要Feed比较好。一般浏览摘要,感兴趣的点进全文,这样比较节省流量。

\n" + - "\n" + - "
\n" + - "\n" + - "

流量会越来越便宜,真正昂贵的是你的时间。所以还是全文Feed好。

\n" + - "\n" + - "
\n" + - "
引用zp的发言:
\n" + - "\n" + - "

能不能介绍些Movable Type的文章。

\n" + - "\n" + - "
\n" + - "\n" + - "

我有这个打算,但是文章不太好写,还需要准备。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " luops\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

昨晚测试了此订阅
\n" + - " 同时我也保留了原订阅。
\n" + - "今天发现,同样订阅了163新闻的情况下
\n" + - "全文订阅比官方订阅少了很多新闻
\n" + - "不知其他童靴有没有这样子情况

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 鲜为人志\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

呵呵~ 这样都可以啊~

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " roy_hu\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
引用AlbertDiao的发言:
\n" + - "\n" + - "

如果是手机RSS的话,摘要Feed比较好。一般浏览摘要,感兴趣的点进全文,这样比较节省流量。

\n" + - "\n" + - "
\n" + - "\n" + - "

我更喜欢全文博客,因为在手机上看Google Reader,自动都排好了版,而看全文的时候需要浏览器排版,没有Google Reader那样专门设计给手机的看着舒服。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " Jack\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

另外,也可以用YAHOO PIPE 和YQL来抓取全文。这样除了可以把非全文的FEED变成全文输出外,还可以处理根本没有FEED输出的网页。(不过有很多网页需要处理一下GB2312和UNICODE转换。).而且这样还有一个最大的好处,就是不用建立自己的服务器。

\n" + - "\n" + - "


\n" + - "下面两个FEED 就是用这种办法生成的。
\n" + - "http://feeds.feedburner.com/wenxuecity_news

\n" + - "\n" + - "

http://feeds.feedburner.com/boxun_headline

\n" + - "\n" + - "

可以用GOOGLE READER 来读取它们。也不失为一种间接翻越G/F/W 的办法。
\n" + - "

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " Ruan YiFeng\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
引用luops的发言:
\n" + - "\n" + - "

全文订阅比官方订阅少了很多新闻

\n" + - "\n" + - "
\n" + - "\n" + - "

全文Feed默认只有4个条目,下载代码后,你可以自己修改这个值。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 坏坏鼠\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

不懂编程只会用GR的文科生飘过~~~
\n" + - "ps:阮老师的这篇文章GR里也只是显示标题,所以漂洋过海地过来了(牛博编辑的那个频道,已经将你的博客订阅了呵O(∩_∩)O)~~

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 111\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
引用luops的发言:
\n" + - "\n" + - "

全文订阅比官方订阅少了很多新闻

\n" + - "\n" + - "
\n" + - "\n" + - "


\n" + - "是这样的,丢失了好多,时效性好差
\n" + - "

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " kuber\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

想请教一下你怎么修改规则来全文输出新浪网rss的, 我也碰到几个Feed,缺省的配置不能正确处理.
\n" + - "另外我建议设立一个地方大家可以交流一下脚本不能处理的feed,以及修改的方法, 这样各人不用重复浪费时间了.

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 111\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

下载了lz的代码,发布到网站上,功能可用了。rss数量自己设置就好。

\n" + - "\n" + - "

杯具的是网站只有内网地址,gr不认生成的feed地址。

\n" + - "\n" + - "

只能CS订阅,不喜。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " lietlie\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

http://mrss.dokoda.jp/
\n" + - "虽然是小鬼子的网站,但是是我找到的能够全文Feed最好的在线工具了,和LZ推荐的网站相比,可以输出所有项目,而没有4条目的限制,当然也不必自己搭建服务器,日文内容很简单,如果使用的是FF或Chrome浏览器还可以利用Google的自动翻译功能将大致内容翻译为中文(FF利用Google Toolbar)——其实即使不翻译一样很容易使用。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " Ruan YiFeng\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
引用kuber的发言:
\n" + - "\n" + - "

想请教一下你怎么修改规则来全文输出新浪网rss的, 我也碰到几个Feed,缺省的配置不能正确处理.

\n" + - "\n" + - "
\n" + - "\n" + - "

新浪的内容容器,有一个比较怪的ID名。只要搜索这个字符串,就能提取内容了。

\n" + - "\n" + - "

最终,你还是需要读readability.php的代码,只要读懂了,我觉得任何页面都能提取。
\n" + - "

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 诗沐\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

哇 源码写得相当清爽啊~注释习惯很棒

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " xangd\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

有人在appspot上部署了一个python的port
\n" + - "http://andrewtrusty.appspot.com/readability/
\n" + - "这个没有4篇post的限制

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " neotrue\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

很好用,谢谢!

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " harvey\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

博主,作者把1.5版本放出来了,
\n" + - "可否再麻烦你打包一下,我bazzar一直不成功

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " Ruan YiFeng\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
引用harvey的发言:
\n" + - "\n" + - "

博主,作者把1.5版本放出来了,
\n" + - "可否再麻烦你打包一下,我bazzar一直不成功

\n" + - "\n" + - "
\n" + - "\n" + - "

已经加上去了,:-)

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " 张治国\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

博主,全文Feed默认只有4个条目,下载代码后,修改哪段代码可以改变这个值啊,config-sample.PHP中的数值吗?我是新手,希望博主指点一下,谢谢。

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - " felix\n" + - "\n" + - " 说:\n" + - " \n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - "

看不懂readability,不知道博主能否提供一下过滤页面上的干扰字符的方法
\n" + - "

\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - " \n" + - "
\n" + - "

我要发表看法

\n" + - "
\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "

\n" + - "

\n" + - "
\n" + - "
\n" + - "

\n" + - "

«-必填

\n" + - "
\n" + - "
\n" + - "

\n" + - "

«-必填,不公开

\n" + - "
\n" + - "
\n" + - "

\n" + - "

«-我信任你,不会填写广告链接

\n" + - "
\n" + - "
\n" + - "

\n" + - "

\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "

正在发表您的评论,请稍候

\n" + - "

\n" + - " \n" + - "\n" + - "

\n" + - "
\n" + - "\n" + - "

«- 点击按钮

\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "

联系方式 | ruanyifeng.com 2003 - 2012\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "

\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
分享按钮 \n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - ""; - Html html = new Html(text); - Selectable sc = html.sc(); - System.out.println(sc); - } - - @Test - public void test2(){ - String text = "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " 地球上最后的夜晚 (豆瓣)\n" + - " \n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - "\n" + - " \n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - " 提醒\n" + - " \n" + - "
\n" + - "
\n" + - "

加载中...

\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "
\n" + - "
    \n" + - " \n" + - " \n" + - "
  • \n" + - " 豆瓣\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 读书\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 电影\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 音乐\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 同城\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 小组\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 阅读\n" + - "
  • \n" + - " \n" + - " \n" + - "
  • \n" + - " 豆瓣FM\n" + - "
  • \n" + - " \n" + - "
  • \n" + - " 更多\n" + - "
    \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
    九点
    阿尔法城
    移动应用
    \n" + - "
    \n" + - "
  • \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " 豆瓣读书\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " 搜索:\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "

\n" + - " 地球上最后的夜晚\n" + - "
\n" + - "

\n" + - "\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "\n" + - " \n" + - " \"地球上最后的夜晚\"\n" + - " \n" + - "\n" + - "
\n" + - "

\n" + - " 更新描述或封面\n" + - "

\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - " 原作名: Last Evenings on Earth
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 作者: \n" + - " \n" + - " [智利] 罗贝托·波拉尼奥\n" + - "
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 译者: \n" + - " \n" + - " 赵德明\n" + - "
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " 出版社: 上海人民出版社
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " 出版年: 2013-4-1
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " 页数: 288
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " 定价: 45.00元
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - " 丛书: 罗贝托·波拉尼奥作品系列
\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " ISBN: 9787208112025
\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "

\n" + - " \n" + - "\n" + - "\n" + - " \n" + - " 8.4\n" + - " \n" + - "\n" + - " \n" + - "

\n" + - "

\n" + - " (\n" + - " \n" + - " 11人评价\n" + - " \n" + - " )\n" + - "

\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - " 45.5%
\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - " 9.1%
\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - " 18.2%
\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - " 18.2%
\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - " 9.1%
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " 想读\n" + - " \n" + - " \n" + - " 在读\n" + - " \n" + - " \n" + - " 读过\n" + - " \n" + - "
\n" + - " \n" + - "\n" + - "\n" + - " \n" + - " 评价: \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "
    \n" + - "
  • \n" + - "  写笔记\n" + - "
  • \n" + - "\n" + - "
  • \n" + - "  写书评\n" + - "
  • \n" + - "\n" + - "
  • \n" + - "\n" + - " \n" + - " \n" + - "\n" + - " \n" + - " 加入购书单\n" + - " 已在购书单\n" + - "
    \n" + - "
  • \n" + - "\n" + - "
  • \n" + - " \n" + - "\n" + - "\n" + - "
    \n" + - " \n" + - "\n" + - " \n" + - "\n" + - " \n" + - "\n" + - " 添加到豆列\n" + - "
    \n" + - "\n" + - "
  • \n" + - "\n" + - " \n" + - " \n" + - " \n" + - "
  • \n" + - " 分享到   \n" + - "
  • \n" + - " \n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "
\n" + - "\n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - " 推荐\n" + - " \n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 内容简介\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 作者简介\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "

罗贝托•波拉尼奥(Roberto Bolaño,1953—2003)出生于智利,父亲是卡车司机和业余拳击手,母亲在学校教授数学和统计学。1968年全家移居墨西哥。1973年波拉尼奥再次回到智利投身社会主义革命却遭到逮捕,差点被杀害。逃回墨西哥后他和好友推动了融合超现实主义、达达主义以及街头剧场的“现实以下主义”(Infrarealism)运动,意图激发拉丁美洲年轻人对生活与文学的热爱。1977年他前往欧洲,最后在西班牙波拉瓦海岸结婚定居。2003年因为肝脏功能损坏,等不到器官移植而在巴塞罗那去世,年仅五十岁。

波拉尼奥四十岁才开始写小说,作品数量却十分惊人,身后留下十部小说、四部短篇小说集以及三部诗集。1998年出版的《荒野侦探》在拉美文坛引起的轰动,不亚于三十年前《百年孤独》出版时的盛况。而其身后出版的《2666》更是引发欧美舆论压倒性好评,均致以...

(展开全部)

\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "

罗贝托•波拉尼奥(Roberto Bolaño,1953—2003)出生于智利,父亲是卡车司机和业余拳击手,母亲在学校教授数学和统计学。1968年全家移居墨西哥。1973年波拉尼奥再次回到智利投身社会主义革命却遭到逮捕,差点被杀害。逃回墨西哥后他和好友推动了融合超现实主义、达达主义以及街头剧场的“现实以下主义”(Infrarealism)运动,意图激发拉丁美洲年轻人对生活与文学的热爱。1977年他前往欧洲,最后在西班牙波拉瓦海岸结婚定居。2003年因为肝脏功能损坏,等不到器官移植而在巴塞罗那去世,年仅五十岁。

波拉尼奥四十岁才开始写小说,作品数量却十分惊人,身后留下十部小说、四部短篇小说集以及三部诗集。1998年出版的《荒野侦探》在拉美文坛引起的轰动,不亚于三十年前《百年孤独》出版时的盛况。而其身后出版的《2666》更是引发欧美舆论压倒性好评,均致以杰作、伟大、里程碑、天才等等赞誉。苏珊•桑塔格、约翰•班维尔、科尔姆•托宾、斯蒂芬•金等众多作家对波拉尼奥赞赏有加,更有评论认为此书的出版自此将作者带至塞万提斯,斯特恩,梅尔维尔,普鲁斯特,穆齐尔与品钦的同一队列。

\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 目录\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " 圣西尼……………………………………3
\n" + - " 亨利·西蒙·勒普兰斯…………………… 27
\n" + - " 恩里克·马丁……………………………39
\n" + - " 一件文学奇事…………………… ……59
\n" + - " 通话…………………… ………………75
\n" + - " 毛毛虫…………………………………83
\n" + - " · · · · · ·\n" + - " (更多)\n" + - "
\n" + - "\n" + - "
\n" + - " 圣西尼……………………………………3
\n" + - " 亨利·西蒙·勒普兰斯…………………… 27
\n" + - " 恩里克·马丁……………………………39
\n" + - " 一件文学奇事…………………… ……59
\n" + - " 通话…………………… ………………75
\n" + - " 毛毛虫…………………………………83
\n" + - " 安妮·穆尔的生平 ……………………101
\n" + - " “小眼”席尔瓦 ………………………139
\n" + - " 戈麦斯帕拉西奥 ……………………159
\n" + - " 地球上最后的夜晚………………… 173
\n" + - " 1978 年的几天………………………205
\n" + - " 在法国和比利时闲逛…………………225
\n" + - " 牙科医生…………………… ………245
\n" + - " 邀舞卡……………………………… 273
\n" + - " · · · · · · (收起)\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " "地球上最后的夜晚"试读\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "
\n" + - "

情况是这样的:B 和B 父去阿卡普尔科度假。一大早,清晨六点,父子俩就要出发。那天夜里,B 睡在父亲家里。没梦,或者就算有梦,一睁眼也忘了。听见父亲在卫生间。向窗外望去,一片漆黑。B 不开灯,穿衣裳。等走出卧室的时候,父亲已经在桌旁看前一天的体育报纸了。早饭已经做好了。咖啡,牧场煎蛋。B 问候父亲后,走进卫生间。\n" + - "B 父的汽车是1970 年的福特野马。六点半,父子俩上车,开..

\n" + - "\n" + - "
· · · · · · (查看全部试读)
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 豆瓣成员常用的标签(共38个)\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "
罗贝托-波拉尼奥(68)   拉美文学(35)   外国文学(24)   小说(22)   智利文学(14)   波拉尼奥(10)   智利(10)   小说集(10)  
\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "
\n" + - "

丛书信息

\n" + - "
\n" + - "  罗贝托·波拉尼奥作品系列 (共6册),\n" + - "这套丛书还有\n" + - "《2666》,《荒野侦探》,《2666》,《荒野侦探》,《护身符》。
\n" + - "
\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "

\n" + - " 书评  · · · · · · \n" + - "

\n" + - " \n" + - " 我来评论这本书\n" + - "\n" + - "\n" + - " \n" + - "\n" + - " \n" + - "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \"DeadKennedy\"/\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - " \">\"\n" + - " \n" + - " \"<\"\n" + - "
\n" + - " 信仰的挽歌\n" + - "

\n" + - "
\n" + - " \n" + - " DeadKennedy   \n" + - " \n" + - " \n" + - "

\n" + - "
\n" + - " Elegy to Faith\n" + - "\n" + - "\n" + - "波拉诺难得的短篇集。\n" + - "\n" + - "\n" + - "比之长篇,波拉诺的短篇是其能力的代表。他的长篇像话剧台词,冗长,精彩,让人迷失其中,在读过大概三百页之后似乎明白一些他在说什么。而他的短篇则像电台DJ的串词,明了,信息丰富,基本是波拉诺的自传和自白。很多篇目就是作家自身经历的镜像。是一些关于动荡,个人自由,劳动,知识份子,流放和坚持的故事。纽约时报评论这本书为“流放民谣”。\n" + - "\n" + - "\n" + - "比如写自身经历的:......\n" + - "\n" + - "

\n" + - " \n" + - " 2012-02-14 13:53    \n" + - " 2/2有用\n" + - " \n" + - " \n" + - " 来自 New Directions2007版\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \"DeadKennedy\"/\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - " \">\"\n" + - " \n" + - " \"<\"\n" + - "
\n" + - " 信仰的挽歌\n" + - "

\n" + - "
\n" + - " \n" + - " DeadKennedy   \n" + - " \n" + - " \n" + - "

\n" + - "
\n" + - " Elegy to Faith\n" + - "\n" + - "\n" + - "波拉诺难得的短篇集。\n" + - "\n" + - "\n" + - "比之长篇,波拉诺的短篇是其能力的代表。他的长篇像话剧台词,冗长,精彩,让人迷失其中,在读过大概三百页之后似乎明白一些他在说什么。而他的短篇则像电台DJ的串词,明了,信息丰富,基本是波拉诺的自传和自白。很多篇目就是作家自身经历的镜像。是一些关于动荡,个人自由,劳动,知识份子,流放和坚持的故事。纽约时报评论这本书为“流放民谣”。\n" + - "\n" + - "\n" + - "比如写自身经历的:......\n" + - "\n" + - "

\n" + - " \n" + - " 2012-02-14 13:53    \n" + - " 2/2有用\n" + - " \n" + - " \n" + - " 来自 New Directions2007版\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "
\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 论坛\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
平装or精装?孔亚雷or赵德明?来自Nihilum5 回应2013-04-21
書到底出了沒啊?来自阿城199114 回应2013-04-13
不是翻译问题,是根本看不懂来自呆呆双鱼女1 回应2013-04-20
\n" + - "\n" + - "\n" + - "

>\n" + - " 在这本书的论坛里发言\n" + - "

\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "

\n" + - " 在哪儿买这本书?\n" + - "

\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 加入购书单\n" + - " \n" + - " 已在购书单 \n" + - " 查看\n" + - " 删除\n" + - " \n" + - " \n" + - " \n" + - "\n" + - " 多本比价,批量购买\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 这本书的其他版本 \n" + - "  · · · · · ·\n" + - "  (\n" + - " 全部3\n" + - " ) \n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 以下豆列推荐\n" + - "  · · · · · ·\n" + - "  (\n" + - " 全部\n" + - " ) \n" + - "\n" + - "

\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "

谁读这本书?

\n" + - "
\n" + - "\n" + - " \n" + - "\n" + - " \n" + - "
\"小K\"
\n" + - "
小K
\n" + - "
13分钟前 想读
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - " \n" + - "
\"杰森辛普森\"
\n" + - "
杰森辛普森
\n" + - "
28分钟前 想读
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - " \n" + - "
\"Aby\"
\n" + - "
Aby
\n" + - "
37分钟前 想读
\n" + - "\n" + - "
\n" + - "\n" + - " tags:对人生的诠释\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - " \n" + - "
\"老男孩\"
\n" + - "
老男孩
\n" + - "
1小时前 想读
\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - "\n" + - "\n" + - "

> 5人在读

\n" + - "

> 12人读过

\n" + - "

> 658人想读

\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - " \n" + - " \n" + - "\n" + - "

\n" + - "\n" + - " 喜欢这本书的人常去的小组\n" + - "  · · · · · ·\n" + - "\n" + - "

\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - " \n" + - "
\n" + - "
\"托马斯·品钦\"/
\n" + - " \n" + - "
托马斯·品钦 (711)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"短经典\"/
\n" + - " \n" + - "
短经典 (787)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"寻找:布鲁诺.舒尔茨\"/
\n" + - " \n" + - "
寻找:布鲁诺.舒尔茨 (466)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"胡安·鲁尔福\"/
\n" + - " \n" + - "
胡安·鲁尔福 (613)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"V.S.奈保尔\"/
\n" + - " \n" + - "
V.S.奈保尔 (445)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"胡利奥·科塔萨尔\"/
\n" + - " \n" + - "
胡利奥·科塔萨尔 (1053)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"中国当代书籍装帧摭评\"/
\n" + - " \n" + - "
中国当代书籍装帧摭评 (1373)\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\"泼先生\"/
\n" + - " \n" + - "
泼先生 (485)\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "
\n" + - "

> 收藏这本书的1个小组

\n" + - "
\n" + - "

> \n" + - " 加到我的小组收藏里 \n" + - "

\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "

二手市场

\n" + - "
\n" + - "
    \n" + - "
  • \n" + - " > 点这儿转让\n" + - "\n" + - " 有658人想读,手里有一本闲着?\n" + - "
  • \n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "

订阅关于地球上最后的夜晚的评论:
\n" + - " feed: rss 2.0

\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - "\n" + - " © 2005-2013 douban.com, all rights reserved\n" + - "\n" + - "\n" + - "\n" + - " 关于豆瓣\n" + - " · 在豆瓣工作\n" + - " · 联系我们\n" + - " · 免责声明\n" + - " \n" + - " · 帮助中心\n" + - " · 开发者\n" + - " · 图书馆合作\n" + - " · 手机读书\n" + - " · 豆瓣广告\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n"; - - Html html = new Html(text); - System.out.println(html.sc()); - - } -} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 96ea6e8cc..469ff26c6 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -4,2747 +4,1353 @@ import org.junit.Test; /** - * User: cairne - * Date: 13-4-21 - * Time: 上午10:06 + * User: cairne Date: 13-4-21 Time: 上午10:06 */ public class XpathSelectorTest { - String huxiuHtml = "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "产品情感化设计的两个层面-观点-@虎嗅网\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\t\t\t\n" + - "\t\n" + - "
\n" + - "

\"虎嗅网\"

\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "订阅虎嗅\n" + - "RSS\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - "

产品情感化设计的两个层面

\n" + - "\n" + - "
\n" + - "
\n" + - " 2013-4-22 16:10\n" + - " \n" + - " \t评论(0)\n" + - " \n" + - "产品\n" + - "投稿\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \"\"\n" + - " 用户之所以选择一款产品,首要的一点在于产品的功能或内容满足了用户。而随着产品的发展,同类型的产品基础功能都大致相同,产品之间的竞争越来越难在功能层面拉开差距。现在产品人员也更加开始在用户体验上下功夫了,而对用户体验的不断追求也就上升到了情感层面。

谈起产品情感化设计,可以拿手机通讯录中添加联系人头像来举例子,单就这个功能点而言,最基础的只要用户能够添加联系人的头像即可,而如果在这个功能上添加用户情感化的元素后,就可以在用户的头像展示上给予更大空间,让用户能够更大的发挥自己的个性。我们也发现新浪微博和开心网个人主页的设计也都增加了个人封面的展示。产品情感化对于功能本身是没有影响的,而情感因素后,产品对用户还会更有吸引力。短期来看,个性化和给用户更大的发挥空间是产品情感化设计的两个很重要的方向。

产品的情感化设计有两个不同的做法:一个是在已有功能上进行扩展,如上文所提到的通讯录中上传头像的功能,是对用户表达欲的满足,用户情感的单向表达;另一种做法则是做一个完全情感化的产品,用户情感的双向表达,是用户之间情感内容的交流,产品扮演的只是桥梁作用,例如小恩爱、抬杠这样的产品。其实所有涉及到用户互动性的产品对于情感化的拓展空间都很大,但是与普通社交不同的是,产品的情感化在于人与人之间更深层次的交流。在我个人看来,社交网站中的发状态功能已经仅仅是用户表达的工具,极少含有感情因素,但是像Facebook推出的暗恋功能却是一个情感化产品,产品的情感化不仅在于让用户将自己的情感寄予到产品中,而且产品要想具有情感化很重要的一点在于产品本身能够起到挖掘用户情感的作用。

前面所提到的两种做法区别在于,前者是基于已有需求而进行的情感化设计,而后者则是完全情感化的产品,就成功率来讲,显然是前者更大一些。本身有需求的产品对于产品的情感化发展不仅奠定了基础,而且也烘托了氛围,做好了铺垫。如果是做一个完全情感化的产品,失败的可能性很大。当产品的功能满足了用户的情感表达,那就意味着产品可以满足用户的需求,而当产品本身所扮演的角色无法成为用户的寄托,那么产品就会面临失败。可想而知,情感化的产品肯定属于UGC类型,对于用户内容的质量要求会比较高,当技术水平不够高、功能操作不够便捷的时候,自然就提高了使用门槛。而且这种类型的产品对于氛围的烘托本身就会有相对高的要求。

如果单从功能角度去衡量,用户情感的单向表达属于功能层面,而用户情感的双向表达属于内容层面。除此之外,产品情感化还有文案和产品风格上的表现。

你是一个资深网虫,或许你也有所感觉,现在的网站文案已经越来越有人情味了。例如提示文案不是“你的账号密码错误”而是“密码不对哦”,文案中增加了语气词。这只是其中的一种表达方式,除此之外,你会看到产品设计中的很多引导方式也更有趣味性,文案内容的情感化也会增加用户的接受程度。

最近自己在使用产品中也有个很大的感触,就是产品风格对用户的吸引,同样是天气类应用,功能上相差无几,但是不同的风格却可以吸引不同的受众。有的是大众普通的风格,有的是小清新风格,有的是卡通风格等等,可以理解为用户对不同风格产品的选择背后的原因就是用户个人情感的不同,而用户的这种情感不能改变只能顺从。

更深层次的讲,产品情感化的关键在于产品功能与用户情感的承接,满足人们情感的诉求。从心理学上讲人的本性有很多,例如表达欲、攀比心理,但从人的本性和产品的情感化进行匹配,会有太多的点,在这里就不一一例举了,大家可以在产品的使用过程中逐渐感受。而之所以要选择利用人性情感的哪一点来设计产品就要根据具体的产品目标来衡量了。

文章来源:马虎眼    作者微信账号:mahuyan


本文由\n" + - "云瑞\n" + - "授权虎嗅网发表,并经虎嗅网编辑。转载此文章须经作者同意,并请附上出处(虎嗅网)及本页链接。
原文链接http://www.huxiu.com/article/13380/1.html\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "\n" + - " \n" + - "\n" + - "\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " 分享(0):\n" + - "
\n" + - "
\n" + - "
    \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - "
  • \n" + - " \n" + - "
  • \n" + - "
\n" + - " \n" + - "
\n" + - "
收藏\n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - " 没劲 \n" + - " 喜欢 \n" + - "
\t\t \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "

参与讨论,请先登录|注册

\n" + - "

\n" + - "\n" + - "\n" + - "

\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "\t\t\t
\n" + - "

作者:云瑞

\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
个人签名
\n" + - "
人人都爱互联网
\n" + - "
\n" + - "
\n" + - "\t\t\t\t\n" + - "

作者其他文章

\n" + - "\n" + - " \n" + - "更多文章\n" + - "
\n" + - "\n" + - "
\n" + - "

您不能错过的作者

\n" + - "
  • \n" + - "

    \"葛甲\"

    \n" + - "

    葛甲

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"吴澍\"

    \n" + - "

    吴澍

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"知乎精选\"

    \n" + - "

    知乎精选

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"译言\"

    \n" + - "

    译言

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"潘乱\"

    \n" + - "

    潘乱

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"王云辉\"

    \n" + - "

    王云辉

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"阑夕\"

    \n" + - "

    阑夕

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"胡晓东\"

    \n" + - "

    胡晓东

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"阳淼\"

    \n" + - "

    阳淼

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"魏武挥\"

    \n" + - "

    魏武挥

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"高低买个皮夹克\"

    \n" + - "

    高低买个皮夹克

    \n" + - "
  • \n" + - "
  • \n" + - "

    \"潘越飞\"

    \n" + - "

    潘越飞

    \n" + - "
  • \n" + - "\t\n" + - "
\n" + - "
\n" + - "\n" + - " \t\t\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\t
\n" + - "\n" + - "\n" + - "
\n" + - "
\n" + - "

关于我们|加入我们|广告及服务|常见问题解答|提交建议\n" + - "\n" + - "

\n" + - "

Copyright © 虎嗅网\n" + - "( 京ICP备12013432 )

\n" + - "
\n" + - "
\n" + - "\n" + - " 
\n" + - "\n" + - "回顶部\n" + - "\n" + - "\t\t\t
\n" + - "\t\t\t\n" + - "\t\t\t\n" + - "\n"; - - String blogHtml = "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 一个基于Python装饰器的用户输入验证设计方案 - SamChi的个人空间 - 开源中国社区\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "\n" + - "
\n" + - "\t
\n" + - "\t\t
\n" + - " \t开源中国社区\n" + - "
\n" + - " \t\t
JetBrains 开发工具全场3折,详情»
\n" + - "
\n" + - " \t\n" + - "
\n" + - "
\n" + - "\t
\n" + - "\t
\n" + - "\t\t
\n" + - "\t\t当前访客身份:\n" + - "\t\t\t\t黄亿华 [ 我的空间 | 退出 ]\n" + - "\t\t\t\t\t\t\t\n" + - "\t\t\t\t\t\t你有0新留言\t\t\t\n" + - "\t\t\t\t\t\t\t\t\n" + - "\t\t
\n" + - "\t\t
\n" + - " \t\t
\n" + - "\t\t\t\t\n" + - "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n" + - " \t\t\t\n" + - "\t\t\t\t\n" + - "\t\t\t\t
\n" + - " \t\t\t\t\n" + - " \t\t\t\t\n" + - " \t\t\t\t\n" + - "
软件
\n" + - " \n" + - "
\n" + - "\t\t\t\t\t\t\t\n" + - " \t\t
\n" + - "\t\t
\n" + - "\t\t
\n" + - "\t
\n" + - "\t
\t\n" + - "\n" + - "
\n" + - "
\n" + - "\t \"SamChi\"\n" + - " \n" + - " SamChi\n" + - "\t\t\n" + - "\t\t\t\n" + - " \t\t\t\t\t\t\t\n" + - " \n" + - "
\n" + - "
\n" + - " \t关注(21)\n" + - " \t粉丝(52)\n" + - " \t积分(37)\n" + - "
\n" + - "
\n" + - "
\n" + - "这个人很懒,啥也没写
\n" + - "\n" + - "
\n" + - "\t.发送留言\n" + - "\t.请教问题\n" + - "
\n" + - " 博客分类\n" + - " \n" + - "
\n" + - "
\n" + - " 最新评论 \n" + - "
    \n" + - "\t\t
  • \n" + - "\t\t@其斤君羊:说的很对 做什么事情都得从身边做起 更何况创业 ...\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@techstan:不错\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@摩云飞:谢谢博主的总结,很有价值\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@尚楠:正在学Python,谢了\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@knightuniverse:其实我觉得,很多时候,不论是做项目还是做产品,...\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@moyun:顶一个\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@SamChi:引用来自“Martinium”的评论 alert('I am admi...\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@Martinium:alert('I am admin, bitch!'); 这句话亮了。...\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@Ben:引用来自“ExtremeTalk”的评论 引用来自“Ben”...\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t\t
  • \n" + - "\t\t@ExtremeTalk:引用来自“Ben”的评论 引用来自“ExtremeTalk”...\n" + - "\t\t查看»\n" + - "\t
  • \n" + - "\t
\n" + - "
\n" + - "访客统计\n" + - "
    \n" + - "\t
  • 3
  • \n" + - "
  • 33
  • \n" + - "
  • 36
  • \n" + - "
  • 842
  • \n" + - "
  • 13706
  • \n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "
\n" + - "\t
\n" + - " \t\n" + - "\t
\n" + - "\t\n" + - " \t
\t\t\n" + - "
\n" + - "

一个基于Python装饰器的用户输入验证设计方案

\n" + - "
\n" + - " \t\t \t\t \t \n" + - "\t\t\t\t\n" + - "\n" + - "8人收藏此文章,\n" + - "\n" + - "\t\n" + - "\t\t\t\n" + - " \t\t \t\t发表于7天前(2013-04-15 16:46) , \n" + - " \t\t已有127次阅读 ,共0个评论\n" + - " \t\t \t
\n" + - "
\n" + - "\t

情景

\n" + - "

最近初学Python, 语法大概熟悉了之后就开始拿web.py做点小东西,web.py非常轻量,用起来感觉很舒服。但不过无论什么语言或者框架,web开发中有一个最大烦人之处就是表单验证,web.py提供了web.form来进行表单验证的统一处理,这个东西虽然用起来很简单,但是感觉还是不太合心意,首先这套验证机制跟web.py框架耦合的程度太高,而自己的架构是这样的,业务逻辑跟web逻辑完全分离,web仅仅是交互形式的一种,即使添加客户端C/S形式的服务或者是向开发者提供API,业务逻辑也是完全可用,不需要修改,这样对用户输入的验证是属于业务逻辑这一块,不应该跟web表单耦合在一起;另外感觉web.py这套东西还是有些简单,只支持每个表单的正则验证和最后表单提交的整体验证,而很多时候可能需要对用户进行丰富的错误提示,比如针对用户名的错误会具体到是不能为空还是长度错误或者格式错误等, 这个用web.py的form验证就感觉很别扭了。于是就决定自己设计一个用户输入的验证方案。

\n" + - "

设计

\n" + - "

web项目的开发多数都是遵循这么一个结构的设计,即DAO->Service->Controller->View, 按我前面说的,对用户的输入验证应是发生在Service这一层上,这一层的设计是接受用户输入的参数,然后进行验证处理,再进行业务相关的计算,最后输入结果。每个Service接口都应该返回一个结果,我一般都会把这个结果的内容抽象成一个一致类型的对象:

\n" + - "
class Result(object):\n" +
-            "    \n" +
-            "    u''' 操作结果抽象 '''\n" +
-            "    \n" +
-            "    def __init__(self, code, value=None):\n" +
-            "        self.code = code   #操作结果代号\n" +
-            "        self.value = value #操作结果值\n" +
-            "        \n" +
-            "    def __str__(self):\n" +
-            "        return "operation result, code: %s, value: %s" % (self.code, self.value)
\n" + - "

这个结果对象包含两个属性,一个是操作结果的代码,一个是操作的值,举个例子,比如用户注册的接口,如果注册成功,那么就会返回一个这样的Result对象,code属性是'success', value属性是新注册用户分配的ID,如果用户名已经被占用,那么code属性就是'username_exised', value属性的值是None。客户端拿到code属性的值可以做响应的处理,如果是直接面向最终用户的web应用,那么就会去找到这个code对应的错误信息来展示给用户,所有的错误信息我是组织在一个单独的Python模块中(opresult.py):

\n" + - "
reg = {\n" +
-            "       'success':u'注册成功',\n" +
-            "       'username_empty':u'用户名不得为空',\n" +
-            "       'username_format':u'用户名必须只能有数字、字母下划线组成',\n" +
-            "       'username_length':u'用户名长度必须在5到10个字符之间',\n" +
-            "       'username_existed':u'用户名已经存在',\n" +
-            "       'password_empty':u'密码不得为空',\n" +
-            "       'repassword_error':u'两次密码输入不一致',       \n" +
-            "       }
reg是注册的接口名称,这样客户端通过接口名称和code就可以获取对应的提示。 \n" + - "

由此,用户输入验证就是要把接口参数同这些code联系起来。对于参数验证,Python有天生的语言优势,那就是装饰器。一开始就想到了使用装饰器来描述参数验证需求,但这个装饰器需要哪些信息?怎么个形式?这个得从表单验证的需求开始看起,个人总结表单验证大抵不过这些判断条件:

\n" + - "

1. 是否允许为空

\n" + - "

2. 长度限制:比如密码的长度一般会不允许少于多少位

\n" + - "

3. 格式限制:比如Email地址,需要正则判断

\n" + - "

4. 逻辑限制:比如注册时判断用户名是否已经存在

\n" + - "

初步根据这些判断条件设计出这么一个方案:

\n" + - "
@checkarg(username={'allow_empty':False, \n" +
-            "                    'regex':r'^[a-zA-Z\\d_]+$',\n" +
-            "                    'min-length':5, 'max-length':10, \n" +
-            "                    'check_logic':[check_username_usable]},\n" +
-            "          password={'allow_empty':False,'regex':r'.{6,}'},\n" +
-            "          repassword={'allow-empty':False, 'check_logic':\n" +
-            "                      [(lambda **kw:(kw['password'] == kw['repassword'], "repassword_error"))]})\n" +
-            "def reg(username, password, repassword):\n" +
-            "    ....
\n" + - "

每一个参数使用一个字典来描述验证信息, allow_empty是表示是否为空,regex为验证的正则表达式,min-length和max-length用来描述长度,check_logic用来配置其他的验证逻辑。然后如何把这些验证结果同code进行匹配呢?最开始是在这个验证信息的字典中有一项'code':{'allow_empty':'username_empty'}通过这样的形式去匹配错误提示,但是感觉这样整的这个参数太复杂了(感觉现在已经挺复杂了- -b),于是决定这个地方使用约定优于配置的形式,code的值为'参数名_错误类型'的形式,比如allow_empty如果验证了为空,那么会自动返回名为username_empty的code,如果是一些额外的处理逻辑呢?没法做约定,怎么办?那么就约定这些检测函数返回一个元组,第一个元素为一个bool值,表示成功失败,第二个参数为code,表示失败原因,比如判断两次密码是否输入一致的那个lambda:

\n" + - "
lambda **kw:(kw['password'] == kw['repassword'], "repassword_error"
\n" + - "

嗯,大体就是这样的一个设计。

\n" + - "

实现

\n" + - "

根据上面的设计,把最终的装饰器实现了出来, 逻辑比较简单,关于装饰器设计的一些细节可以参阅Python参考手册:

\n" + - "
regex_cache = {}\n" +
-            "     \n" +
-            "def checkarg(**args):\n" +
-            "    \n" +
-            "    u'''参数检测装饰器'''\n" +
-            "    \n" +
-            "    def _checkarg(function):\n" +
-            "        \n" +
-            "        def __checkarg(**func_kw):\n" +
-            "            for key in func_kw:\n" +
-            "                if key in args:\n" +
-            "                    \n" +
-            "                    #要验证的值\n" +
-            "                    value = func_kw[key]\n" +
-            "                    \n" +
-            "                    #验证规则\n" +
-            "                    valid_rules = args[key]\n" +
-            "                    \n" +
-            "                    #检测空\n" +
-            "                    allow_empty = valid_rules.get('allow_empty')\n" +
-            "                    if not allow_empty:\n" +
-            "                        if not value or not value.strip():\n" +
-            "                            return Result(key + "_empty")\n" +
-            "                    elif not value:\n" +
-            "                        #如果是空的并且忽略空检测,那么下面的就不需要检查了\n" +
-            "                        continue;\n" +
-            "                    \n" +
-            "                    #检测长度\n" +
-            "                    if 'min-length' in valid_rules:\n" +
-            "                        min_length = valid_rules['min-length']\n" +
-            "                        if min_length > len(value):\n" +
-            "                            return Result(key + "_length")\n" +
-            "                        \n" +
-            "                    if 'max-length' in valid_rules:\n" +
-            "                        max_length = valid_rules['max-length']\n" +
-            "                        if max_length < len(value):\n" +
-            "                            return Result(key + "_length")\n" +
-            "                    \n" +
-            "                    #检测正则\n" +
-            "                    if 'regex' in valid_rules:\n" +
-            "                        #获取编译后的正则\n" +
-            "                        regex = valid_rules['regex']\n" +
-            "                        regexcmp = regex_cache.get(regex)\n" +
-            "                        if not regexcmp:\n" +
-            "                            regexcmp = re.compile(regex)\n" +
-            "                            regex_cache[regex] = regexcmp\n" +
-            "                        if not regexcmp.search(value):\n" +
-            "                            return Result(key + "_format")\n" +
-            "                    \n" +
-            "                    #检测其他逻辑\n" +
-            "                    check_logics = valid_rules.get('check_logic')\n" +
-            "                    if check_logics:\n" +
-            "                        for logic in check_logics:\n" +
-            "                            result, code = logic(**func_kw)\n" +
-            "                            if not result:\n" +
-            "                                return Result(code)\n" +
-            "                                \n" +
-            "            function(**func_kw)\n" +
-            "        return __checkarg\n" +
-            "                            \n" +
-            "    return _checkarg
\n" + - "\t \t \n" + - "
\n" + - "\t\t\n" + - "
\n" + - "\t \t\n" + - "\t \t \n" + - "
\t\t\n" + - "\t \t\t声明:OSCHINA 博客文章版权属于作者,受法律保护。未经作者同意不得转载。\n" + - "\t \t
\n" + - "\n" + - " \n" + - "\t
\n" + - "\n" + - "\t\n" + - "\t
\n" + - "\t\n" + - "\t\n" + - "\t\t分享到: \n" + - "\t\t\n" + - "\t\t\n" + - "\t\n" + - " 已有 0人顶\n" + - "\t\n" + - "\t
\n" + - "\t\t\n" + - "
\n" + - "
\n" + - "
\n" + - "

共有 0 条网友评论

\n" + - "\t\t\t

尚无网友评论

\n" + - "\t\t
    \n" + - "\t\t
\n" + - "
\n" + - "\t
\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "\t \n" + - "\t \n" + - "\t 文明上网,理性发言\n" + - "
\n" + - "\t回到页首 | 回到评论列表\n" + - "
\n" + - "
\n" + - "\t\n" + - "
\n" + - "\t关闭相关文章阅读\n" + - "\t\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\t
\n" + - "\t
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
© 开源中国(OsChina.NET) | 关于我们 | 广告联系 | @新浪微博 | 开源中国手机版 | 粤ICP备12009483号-3\n" + - "\t开源中国手机客户端:\n" + - "\tAndroid\n" + - "\tiPhone\n" + - "\tWP7\n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - ""; - - String html = "\n" + - "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " 再次吐槽easyui - 开源中国 OSChina.NET\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - "
\n" + - "\t
\n" + - "
\n" + - " \t\n" + - "
\n" + - "\t\t
\n" + - " \t\t \t\t黄亿华,您好 \n" + - "\t\t\t\n" + - "\t\t\t\t我的空间\n" + - "\t\t\t\t\n" + - "\t\t\t | \n" + - "\t\t\t添加软件 | 投递新闻 | 退出\n" + - " \t\t\t\t
\n" + - "\t\t
\n" + - "\t
\n" + - "
\n" + - "
\n" + - "

讨论区

\n" + - "
\n" + - "\t
当前位置:
\n" + - "\t
\n" + - "\t\t\t\t\t \t\t讨论区 »\n" + - " \t\t技术问答\t\t\t\t\t\t\t\t» EasyUI\n" + - "\t\t\t\t\t\t\t\t\t\t
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "\t
\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
\n" + - "\t\n" + - "\t
\n" + - "\t
\n" + - "\t\t
\"午后冬日\"
\n" + - "\t\t
\n" + - "\t\t\t

再次吐槽easyui

\n" + - "\t\t\t
\n" + - "\t\t\t\t午后冬日\n" + - "\t\t\t\t发表于 2013-4-21 02:28 13小时前,\n" + - "\t\t\t\t3回/289阅,\n" + - "\t\t\t\t最后回答: 4小时前\t\t\t\t\t\t\t\t\t\t\t
\n" + - "\t\t
\n" + - "\t\t\n" + - "\t\t
\n" + - "\t
\n" + - "\t\t \t \t\t\t\t\t\n" + - "\t\t

Java、PHP、Ruby、iOS、Python 等 JetBrains 开发工具低至 99 元(3折),详情»

\n" + - "\t\t
\n" + - "\t\t\t\t\t\t
刚用到easyui treegrid组件,发现这货第一次加载时候并没有传默认参数,展开某一列时候才传递id:xx的参数。这样和后台总是疙里疙瘩,像没事就拌嘴的两口子,查网上都遇到相同问题,最好解决方案就是通过 \n" + - "onBeforeExpand事件来扩展,自行解决。看到官方例子中简洁的代码,感觉easyui耍流氓了,真搞不懂为何要这样实现
\n" + - "\t\t\t\t\t\t
\n" + - "\t\t\t\t标签:\t\t\t\t\n" + - "\t\t\t\t\t\t\t\t\t\t\t\tEasyUI \t\t\t\t\t\t\t\t\t\t\t
\n" + - "\t\t\t\t\t\t
\n" + - "\t\t\t\n" + - "\t\t\t\t\t\t\t\t\t我想问同样的问题\n" + - "\t\t\t\t\t\t\n" + - "\t\t\t共0个人想要问同样的问题\n" + - "\t\t\t\t\t\t补充话题说明»\n" + - "\t\t\t
\n" + - "\t\t\t\t\t\t
\n" + - "\t
    \n" + - "
    \t\t
    \n" + - "\t\t\n" + - "\t\t
    \n" + - " \n" + - "\t\t\t\t
    \n" + - "\t\t\t
    分享到
    \n" + - "\t\t\t\n" + - "\t\t\t
    1
    \n" + - "\t\t\t\n" + - "\t\t\t
    \n" + - "\t\t\t\t\t\t\t\t \t\t\t\n" + - "\t\t\t\t\t\t\t\t0\n" + - "\t\t\t\t|\n" + - "\t\t\t\t\t\t\t\t \t\t\t\n" + - "\t\t\t\t\t\t\t\t0\n" + - "\t\t\t
    \n" + - "\t\t\t\n" + - "\t\t
    \n" + - "\t\t
    \n" + - "\t\t\t\t\t\t
    \n" + - "\t\t\t\n" + - " \t

    \t\t\t\n" + - "\t\t\t\t\n" + - "\t\t\t\t\t按评价排序 |\n" + - "\t\t\t\t\t显示最新答案 | 回页面顶部\n" + - "\t\t\t\t\n" + - "\t\t\t\t共有3个答案 我要回答»\n" + - "\t\t\t

    \n" + - "\t\t\t \t
    • \n" + - "\t
      \"布谷鸟\"
      \n" + - "\t
      \n" + - "\t\t
      布谷鸟 回答于 2013-04-21 09:28
      \t\t\n" + - " \t
      \n" + - "\t\t\t \t\t \t\t举报\n" + - " \t
      \n" + - "\t\t
      \n" + - "\t\t
      对话框、日期控件和选项卡效果还不错,树状菜单没得zTree好用,建议楼主不要全部效果都依赖于此框架,有些easyui实现不好的地方可以换其它的插件实现嘛,反正我现在再也不用诸如ext和easyui之类的东西了,感觉好肥
      \n" + - "\t
      \n" + - "\t
      \n" + - "\t
      --- 共有 1 条评论 --- \n" + - "
        \n" + - "\t\t
      • \n" + - "\t\t\"午后冬日\"\n" + - "\t\t\n" + - "\t\t前端水平实在有限,自己搞的总是感觉不伦不类,只能用这些框架,再集成其它插件,切换主题时风格又不一致。\n" + - "\t\t(4小时前 by 午后冬日)\n" + - "\t\t回复\n" + - "\t\t\n" + - "\t\t
        \n" + - "\t
      • \n" + - "\t
      \n" + - "\n" + - "
      \n" + - "\t
      \t\t\t\t\t\t有帮助(1) |\n" + - "\t\t没帮助(0) |\n" + - "\t\t评论(1) |\n" + - " \t引用此答案\t
      \n" + - "
    • \n" + - "\t
      \"静风流云\"
      \n" + - "\t
      \n" + - "\t\t
      静风流云 回答于 2013-04-21 11:08
      \t\t\n" + - " \t
      \n" + - "\t\t\t \t\t \t\t举报\n" + - " \t
      \n" + - "\t\t
      \n" + - "\t\t

      没办法,原来项目也是因为客户特殊的需求,对layout选型的时候,犹豫了好久,最终放弃了。
      幸亏来了一个厉害的前端,解决问题,够用就好。

      \n" + - "\t
      \n" + - "\t
      \n" + - "\t
      --- 共有 1 条评论 --- \n" + - "
        \n" + - "\t\t
      • \n" + - "\t\t\"午后冬日\"\n" + - "\t\t\n" + - "\t\t我也是犹豫了好久,看过很多前端框架,总是不太满意。个人开发前台后台数据库全部要自己搞定,郁闷ing\n" + - "\t\t(4小时前 by 午后冬日)\n" + - "\t\t回复\n" + - "\t\t\n" + - "\t\t
        \n" + - "\t
      • \n" + - "\t
      \n" + - "\n" + - "
      \n" + - "\t
      \t\t\t\t\t\t有帮助(0) |\n" + - "\t\t没帮助(0) |\n" + - "\t\t评论(1) |\n" + - " \t引用此答案\t
      \n" + - "
    • \n" + - "\t
      \"布谷鸟\"
      \n" + - "\t
      \n" + - "\t\t
      布谷鸟 回答于 2013-04-21 11:29
      \t\t\n" + - " \t
      \n" + - "\t\t\t \t\t \t\t举报\n" + - " \t
      \n" + - "\t\t
      \n" + - "\t\t

      引用来自“布谷鸟”的答案

      对话框、日期控件和选项卡效果还不错,树状菜单没得zTree好用,建议楼主不要全部效果都依赖于此框架,有些easyui实现不好的地方可以换其它的插件实现嘛,反正我现在再也不用诸如ext和easyui之类的东西了,感觉好肥
      前后端你一个人搞啊?那确实很麻烦。面面俱到的话,工作量很大。但是如果需要实现的功能不是很多,而时间也不紧迫的话,事情干起来也还不错。如非必须,建议逐步弃用这些前端框架,在一些比较能够提升体验的地方选用一些适当的插件即可,如此也不再需要担心风格的问题,你看osc后台截图,界面那叫一个丑,用得方便顺手就够了
      \n" + - "\t
      \n" + - "\t
      \n" + - "\t
      \n" + - "\t
      \t\t\t\t\t\t有帮助(0) |\n" + - "\t\t没帮助(0) |\n" + - "\t\t评论(0) |\n" + - " \t引用此答案\t
      \n" + - "
    \n" + - "\t\t\t\t
    \n" + - "\t\t
    \n" + - "\t\t\t
    \"黄亿华\"
    \n" + - "\t\t\t
    \n" + - "\t\t\t\t\n" + - "\t\t\t\t\n" + - "\t\t\t\t\n" + - "\t\t\t\t\n" + - "\t\t\t\t

    \n" + - "\t\t\t\t回答案顶部 | 回页面顶部\n" + - "\t\t\t
    \n" + - "\t\t\t
    \n" + - "\t\t\t\n" + - "\t\t
    \n" + - "\t
    \t\n" + - "\t\n" + - "\n" + - "\n" + - "\n" + - "\t
    \n" + - "\t
    \n" + - " \t\n" + - "\t
    \n" + - "\t\t
    \n" + - "\t\t\t有什么技术问题吗?\n" + - "\t\t\t我要提问\n" + - "\t\t\t
    \n" + - "\t\t
    \n" + - "\t\t\n" + - "\t\t\t\t\t\t
    \n" + - "\t\t\t全部(29)...午后冬日的其他问题\n" + - "\t\t\t\n" + - "\t\t
    \n" + - "\t\t\t\t
    \n" + - "\t\t\n" + - "\t\t
    \n" + - "\t\t\n" + - "\t\t
    \n" + - "\t\t\t类似的话题\n" + - "\t\t\t\n" + - "\t\t
    \n" + - "\t
    \n" + - "\t
    \n" + - "
    \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
    \n" + - "\t
    \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
    © 开源中国(OsChina.NET) | 关于我们 | 广告联系 | @新浪微博 | 开源中国手机版 | 粤ICP备12009483号-3\n" + - "\t开源中国手机客户端:\n" + - "\tAndroid\n" + - "\tiPhone\n" + - "\tWP7\n" + - "
    \n" + - "
    \n" + - "
    \n" + - "\n" + - "\n" + - ""; + private String html = "\n" + + "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " 再次吐槽easyui - 开源中国 OSChina.NET\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n" + + "
    \n" + + "\t
    \n" + + "
    \n" + + " \t\n" + + "
    \n" + + "\t\t
    \n" + + " \t\t \t\t黄亿华,您好 \n" + + "\t\t\t\n" + + "\t\t\t\t我的空间\n" + + "\t\t\t\t\n" + + "\t\t\t | \n" + + "\t\t\t添加软件 | 投递新闻 | 退出\n" + + " \t\t\t\t
    \n" + + "\t\t
    \n" + + "\t
    \n" + + "
    \n" + + "
    \n" + + "

    讨论区

    \n" + + "
    \n" + + "\t
    当前位置:
    \n" + + "\t
    \n" + + "\t\t\t\t\t \t\t讨论区 »\n" + + " \t\t技术问答\t\t\t\t\t\t\t\t» EasyUI\n" + + "\t\t\t\t\t\t\t\t\t\t
    \n" + + "
    \n" + + "\n" + + "
    \n" + + "
    \n" + + "\t
    \n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
    \n" + + "\t\n" + + "\t
    \n" + + "\t
    \n" + + "\t\t
    \"午后冬日\"
    \n" + + "\t\t
    \n" + + "\t\t\t

    再次吐槽easyui

    \n" + + "\t\t\t
    \n" + + "\t\t\t\t午后冬日\n" + + "\t\t\t\t发表于 2013-4-21 02:28 13小时前,\n" + + "\t\t\t\t3回/289阅,\n" + + "\t\t\t\t最后回答: 4小时前\t\t\t\t\t\t\t\t\t\t\t
    \n" + + "\t\t
    \n" + + "\t\t\n" + + "\t\t
    \n" + + "\t
    \n" + + "\t\t \t \t\t\t\t\t\n" + + "\t\t

    Java、PHP、Ruby、iOS、Python 等 JetBrains 开发工具低至 99 元(3折),详情»

    \n" + + "\t\t
    \n" + + "\t\t\t\t\t\t
    刚用到easyui treegrid组件,发现这货第一次加载时候并没有传默认参数,展开某一列时候才传递id:xx的参数。这样和后台总是疙里疙瘩,像没事就拌嘴的两口子,查网上都遇到相同问题,最好解决方案就是通过 \n" + + "onBeforeExpand事件来扩展,自行解决。看到官方例子中简洁的代码,感觉easyui耍流氓了,真搞不懂为何要这样实现
    \n" + + "\t\t\t\t\t\t
    \n" + + "\t\t\t\t标签:\t\t\t\t\n" + + "\t\t\t\t\t\t\t\t\t\t\t\tEasyUI \t\t\t\t\t\t\t\t\t\t\t
    \n" + + "\t\t\t\t\t\t
    \n" + + "\t\t\t\n" + + "\t\t\t\t\t\t\t\t\t我想问同样的问题\n" + + "\t\t\t\t\t\t\n" + + "\t\t\t共0个人想要问同样的问题\n" + + "\t\t\t\t\t\t补充话题说明»\n" + + "\t\t\t
    \n" + + "\t\t\t\t\t\t
    \n" + + "\t
      \n" + + "
      \t\t
      \n" + + "\t\t\n" + + "\t\t
      \n" + + " \n" + + "\t\t\t\t
      \n" + + "\t\t\t
      分享到
      \n" + + "\t\t\t\n" + + "\t\t\t
      1
      \n" + + "\t\t\t\n" + + "\t\t\t
      \n" + + "\t\t\t\t\t\t\t\t \t\t\t\n" + + "\t\t\t\t\t\t\t\t0\n" + + "\t\t\t\t|\n" + + "\t\t\t\t\t\t\t\t \t\t\t\n" + + "\t\t\t\t\t\t\t\t0\n" + + "\t\t\t
      \n" + + "\t\t\t\n" + + "\t\t
      \n" + + "\t\t
      \n" + + "\t\t\t\t\t\t
      \n" + + "\t\t\t\n" + + " \t

      \t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\t\t按评价排序 |\n" + + "\t\t\t\t\t显示最新答案 | 回页面顶部\n" + + "\t\t\t\t\n" + + "\t\t\t\t共有3个答案 我要回答»\n" + + "\t\t\t

      \n" + + "\t\t\t \t
      • \n" + + "\t
        \"布谷鸟\"
        \n" + + "\t
        \n" + + "\t\t
        布谷鸟 回答于 2013-04-21 09:28
        \t\t\n" + + " \t
        \n" + + "\t\t\t \t\t \t\t举报\n" + + " \t
        \n" + + "\t\t
        \n" + + "\t\t
        对话框、日期控件和选项卡效果还不错,树状菜单没得zTree好用,建议楼主不要全部效果都依赖于此框架,有些easyui实现不好的地方可以换其它的插件实现嘛,反正我现在再也不用诸如ext和easyui之类的东西了,感觉好肥
        \n" + + "\t
        \n" + + "\t
        \n" + + "\t
        --- 共有 1 条评论 --- \n" + + "
          \n" + + "\t\t
        • \n" + + "\t\t\"午后冬日\"\n" + + "\t\t\n" + + "\t\t前端水平实在有限,自己搞的总是感觉不伦不类,只能用这些框架,再集成其它插件,切换主题时风格又不一致。\n" + + "\t\t(4小时前 by 午后冬日)\n" + + "\t\t回复\n" + + "\t\t\n" + + "\t\t
          \n" + + "\t
        • \n" + + "\t
        \n" + + "\n" + + "
        \n" + + "\t
        \t\t\t\t\t\t有帮助(1) |\n" + + "\t\t没帮助(0) |\n" + + "\t\t评论(1) |\n" + + " \t引用此答案\t
        \n" + + "
      • \n" + + "\t
        \"静风流云\"
        \n" + + "\t
        \n" + + "\t\t
        静风流云 回答于 2013-04-21 11:08
        \t\t\n" + + " \t
        \n" + + "\t\t\t \t\t \t\t举报\n" + + " \t
        \n" + + "\t\t
        \n" + + "\t\t

        没办法,原来项目也是因为客户特殊的需求,对layout选型的时候,犹豫了好久,最终放弃了。
        幸亏来了一个厉害的前端,解决问题,够用就好。

        \n" + + "\t
        \n" + + "\t
        \n" + + "\t
        --- 共有 1 条评论 --- \n" + + "
          \n" + + "\t\t
        • \n" + + "\t\t\"午后冬日\"\n" + + "\t\t\n" + + "\t\t我也是犹豫了好久,看过很多前端框架,总是不太满意。个人开发前台后台数据库全部要自己搞定,郁闷ing\n" + + "\t\t(4小时前 by 午后冬日)\n" + + "\t\t回复\n" + + "\t\t\n" + + "\t\t
          \n" + + "\t
        • \n" + + "\t
        \n" + + "\n" + + "
        \n" + + "\t
        \t\t\t\t\t\t有帮助(0) |\n" + + "\t\t没帮助(0) |\n" + + "\t\t评论(1) |\n" + + " \t引用此答案\t
        \n" + + "
      • \n" + + "\t
        \"布谷鸟\"
        \n" + + "\t
        \n" + + "\t\t
        布谷鸟 回答于 2013-04-21 11:29
        \t\t\n" + + " \t
        \n" + + "\t\t\t \t\t \t\t举报\n" + + " \t
        \n" + + "\t\t
        \n" + + "\t\t

        引用来自“布谷鸟”的答案

        对话框、日期控件和选项卡效果还不错,树状菜单没得zTree好用,建议楼主不要全部效果都依赖于此框架,有些easyui实现不好的地方可以换其它的插件实现嘛,反正我现在再也不用诸如ext和easyui之类的东西了,感觉好肥
        前后端你一个人搞啊?那确实很麻烦。面面俱到的话,工作量很大。但是如果需要实现的功能不是很多,而时间也不紧迫的话,事情干起来也还不错。如非必须,建议逐步弃用这些前端框架,在一些比较能够提升体验的地方选用一些适当的插件即可,如此也不再需要担心风格的问题,你看osc后台截图,界面那叫一个丑,用得方便顺手就够了
        \n" + + "\t
        \n" + + "\t
        \n" + + "\t
        \n" + + "\t
        \t\t\t\t\t\t有帮助(0) |\n" + + "\t\t没帮助(0) |\n" + + "\t\t评论(0) |\n" + + " \t引用此答案\t
        \n" + + "
      \n" + + "\t\t\t\t
      \n" + + "\t\t
      \n" + + "\t\t\t
      \"黄亿华\"
      \n" + + "\t\t\t
      \n" + + "\t\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\t\n" + + "\t\t\t\t

      \n" + + "\t\t\t\t回答案顶部 | 回页面顶部\n" + + "\t\t\t
      \n" + + "\t\t\t
      \n" + + "\t\t\t\n" + + "\t\t
      \n" + + "\t
      \t\n" + + "\t\n" + + "\n" + + "\n" + + "\n" + + "\t
      \n" + + "\t
      \n" + + " \t\n" + + "\t
      \n" + + "\t\t
      \n" + + "\t\t\t有什么技术问题吗?\n" + + "\t\t\t我要提问\n" + + "\t\t\t
      \n" + + "\t\t
      \n" + + "\t\t\n" + + "\t\t\t\t\t\t
      \n" + + "\t\t\t全部(29)...午后冬日的其他问题\n" + + "\t\t\t\n" + + "\t\t
      \n" + + "\t\t\t\t
      \n" + + "\t\t\n" + + "\t\t
      \n" + + "\t\t\n" + + "\t\t
      \n" + + "\t\t\t类似的话题\n" + + "\t\t\t\n" + + "\t\t
      \n" + + "\t
      \n" + + "\t
      \n" + + "
      \n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
      \n" + + "\t
      \n" + + "\n" + + "\n" + + "\n" + + "\n" + "
      © 开源中国(OsChina.NET) | 关于我们 | 广告联系 | @新浪微博 | 开源中国手机版 | 粤ICP备12009483号-3\n" + "\t开源中国手机客户端:\n" + + "\tAndroid\n" + + "\tiPhone\n" + + "\tWP7\n" + "
      \n" + "
      \n" + + "
      \n" + "\n" + "\n" + + ""; @Test - public void test(){ - String text = "\n" + - "\n" + - "\n" + - " \n" + - " \n" + - " jsoup 解析页面商品信息 - - ITeye技术网站\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - "\n" + - "\n" + - " \n" + - " \n" + - "\n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
      \n" + - "
      \n" + - " 首页\n" + - " 资讯\n" + - " 精华\n" + - " 论坛\n" + - " 问答\n" + - " 博客\n" + - " 专栏\n" + - " 群组\n" + - " 更多 \n" + - "
      \n" + - " 招聘\n" + - " 搜索\n" + - "
      \n" + - "
      \n" + - "\n" + - "
      \n" + - " \n" + - " 欢迎flashsword20\n" + - " 0\n" + - " \n" + - " \"Newpm\"收件箱(3)\n" + - " \n" + - " 我的应用\n" + - "
      \n" + - " 我的关注\n" + - " 我的群组\n" + - " 我的简历\n" + - " 我的相册\n" + - " 我的收藏\n" + - " 我的代码\n" + - " 我的微博\n" + - "
      \n" + - " 我的博客\n" + - " 设置\n" + - "
      \n" + - "
      \n" + - " \n" + - " \n" + - "
      \n" + - "
      \n" + - " \n" + - " \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - " \n" + - "
      \n" + - "
      \n" + - " \n" + - "\n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "
      \n" + - "
      \n" + - "

      \n" + - " jsoup 解析页面商品信息\n" + - " \n" + - "

      \n" + - " \n" + - "
       
      \n" + - "
      \n" + - "\n" + - "
      \n" + - "

      今天用了jsoup 解析页面商品信息,感觉比用xpath获取信息准确多了

      \n" + - "

      \n" + - "

      下面就记录一下:

      \n" + - "

      一、首先去 http://jsoup.org/download 下载jsoup的jar包。

      \n" + - "

      \n" + - "

      二、下面记录下相关代码:

      \n" + - "

      \n" + - "

      \n" + - "

      Document doc = Jsoup.connect(url).get(); //将htm转换成Document类型数据结构

      \n" + - "


      doc.select(\"div:has(div) div#spec-n1:has(img) img\").first().attr(\"src\")); //查找div下含有div的标签

      \n" + - "

      \n" + - "

      并且 div的id='spec-n1',此div第一个img标签,img里属性是src的值。

      \n" + - "

      \n" + - "

      doc.select(\"div:has(div) div.crumb:has(a) a:eq(4)\").text(); //查找class='crumb'的div下第4个a标签

      \n" + - "

      下的值。

      \n" + - "

      \n" + - "

      doc.select(\"div:has(div) div#name:has(h1)\").text(); //查找id='name'的div下的h1标签的值。

      \n" + - "

      \n" + - "

      doc.select(\"tbody:has(tr) td.tdTitle:contains(品牌) + td\").text(); //查找class='tdTitle'的td标签里

      \n" + - "

      \n" + - "

      含有‘品牌’td的下一个td标签中内容。

      \n" + - "

      \n" + - "

      doc.select(\"script[type=text/javascript]:not([src~=[a-zA-Z0-9./\\\\s]+)\"); //查找含有此<script

      \n" + - "

      \n" + - "

      type=\"text/javascript\">……</script>内容,不含有script标签中有src属性的script,如:

      \n" + - "

      \n" + - "

      <script src=\"url\" type=\"text/javascript\"></script>。

      \n" + - "
      \n" + - "\n" + - " \n" + - "\n" + - "\n" + - " \n" + - " \n" + - "
      \n" + - " \n" + - "
      分享到:\n" + - " \n" + - " \n" + - "
      \n" + - "
      \n" + - "\n" + - " \n" + - "
      \n" + - " \n" + - "
      \n" + - "\n" + - "
      \n" + - "
      评论
      \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
      \n" + - "\n" + - "
      \n" + - "
      发表评论
      \n" + - "
      \n" + - "\n" + - "\n" + - " \n" + - "\n" + - "\n" + - "\n" + - "
      \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "

      (快捷键 Alt+S / Ctrl+Enter)

      \n" + - "
      \n" + - " \n" + - "
      \n" + - "
      \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "
      \n" + - "\n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \"masong1987的博客\"
      \n" + - "
      masong1987
      \n" + - "
      \n" + - "\n" + - "
      \n" + - "
        \n" + - "
      • 浏览: 5401 次
      • \n" + - "
      • 性别: \"Icon_minigender_1\"
      • \n" + - "
      • 来自: 北京
      • \n" + - "
      • \n" + - " \n" + - "
      • \n" + - " 发短消息\n" + - " \n" + - " 更多访客>>\n" + - " \n" + - "
        \n" + - "
        \"flashsword20的博客\"
        \n" + - " \n" + - "
        \n" + - " \n" + - "
        \n" + - "
        \"dylinshi126的博客\"
        \n" + - " \n" + - "
        \n" + - " \n" + - "
        \n" + - "
        \"machoo的博客\"
        \n" + - " \n" + - "
        \n" + - " \n" + - "
        \n" + - "
        \"arson的博客\"
        \n" + - " \n" + - "
        \n" + - " \n" + - "
      \n" + - "\n" + - " \n" + - "\n" + - "
      \n" + - "
      文章分类
      \n" + - " \n" + - "
      \n" + - "
      \n" + - "
      社区版块
      \n" + - " \n" + - "
      \n" + - "
      \n" + - "
      存档分类
      \n" + - " \n" + - "
      \n" + - " \n" + - " \n" + - "\n" + - "
      \n" + - "
      最新评论
      \n" + - " \n" + - "
      \n" + - "\n" + - "
      \n" + - " \n" + - "
      \n" + - "
      \n" + - "\n" + - "
      \n" + - "
      \n" + - "
      \n" + - " 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。
      \n" + - " © 2003-2012 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ]\n" + - "
      \n" + - "
      \n" + - " \n" + - " \n" + - "\n" + - " \n" + - " \n" + - " \n" + - "\n"; - String text2="
      aaa
      "; - XpathSelector xpathSelector = new XpathSelector("//div[@id='main']/div[@class='blog_main']/div[1][@class='blog_title']/h3/a"); + public void test() { + String text = "\n" + + "\n" + + "\n" + + " \n" + + " \n" + + " jsoup 解析页面商品信息 - - ITeye技术网站\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n" + + " \n" + + " \n" + + "\n" + + "\n" + + " \n" + + " \n" + + "\n" + + " \n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
      \n" + + "
      \n" + + " 首页\n" + + " 资讯\n" + + " 精华\n" + + " 论坛\n" + + " 问答\n" + + " 博客\n" + + " 专栏\n" + + " 群组\n" + + " 更多 \n" + + "
      \n" + + " 招聘\n" + + " 搜索\n" + + "
      \n" + + "
      \n" + + "\n" + + "
      \n" + + " \n" + + " 欢迎flashsword20\n" + + " 0\n" + + " \n" + + " \"Newpm\"收件箱(3)\n" + + " \n" + + " 我的应用\n" + + "
      \n" + + " 我的关注\n" + + " 我的群组\n" + + " 我的简历\n" + + " 我的相册\n" + + " 我的收藏\n" + + " 我的代码\n" + + " 我的微博\n" + + "
      \n" + + " 我的博客\n" + + " 设置\n" + + "
      \n" + + "
      \n" + + " \n" + + " \n" + + "
      \n" + + "
      \n" + + " \n" + + " \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + " \n" + + "
      \n" + + "
      \n" + + " \n" + + "\n" + + "\n" + + "\n" + + " \n" + + "\n" + + "\n" + + "
      \n" + + "
      \n" + + "

      \n" + + " jsoup 解析页面商品信息\n" + + " \n" + + "

      \n" + + " \n" + + "
       
      \n" + + "
      \n" + + "\n" + + "
      \n" + + "

      今天用了jsoup 解析页面商品信息,感觉比用xpath获取信息准确多了

      \n" + + "

      \n" + + "

      下面就记录一下:

      \n" + + "

      一、首先去 http://jsoup.org/download 下载jsoup的jar包。

      \n" + + "

      \n" + + "

      二、下面记录下相关代码:

      \n" + + "

      \n" + + "

      \n" + + "

      Document doc = Jsoup.connect(url).get(); //将htm转换成Document类型数据结构

      \n" + + "


      doc.select(\"div:has(div) div#spec-n1:has(img) img\").first().attr(\"src\")); //查找div下含有div的标签

      \n" + + "

      \n" + + "

      并且 div的id='spec-n1',此div第一个img标签,img里属性是src的值。

      \n" + + "

      \n" + + "

      doc.select(\"div:has(div) div.crumb:has(a) a:eq(4)\").text(); //查找class='crumb'的div下第4个a标签

      \n" + + "

      下的值。

      \n" + + "

      \n" + + "

      doc.select(\"div:has(div) div#name:has(h1)\").text(); //查找id='name'的div下的h1标签的值。

      \n" + + "

      \n" + + "

      doc.select(\"tbody:has(tr) td.tdTitle:contains(品牌) + td\").text(); //查找class='tdTitle'的td标签里

      \n" + + "

      \n" + + "

      含有‘品牌’td的下一个td标签中内容。

      \n" + + "

      \n" + + "

      doc.select(\"script[type=text/javascript]:not([src~=[a-zA-Z0-9./\\\\s]+)\"); //查找含有此<script

      \n" + + "

      \n" + + "

      type=\"text/javascript\">……</script>内容,不含有script标签中有src属性的script,如:

      \n" + + "

      \n" + + "

      <script src=\"url\" type=\"text/javascript\"></script>。

      \n" + + "
      \n" + + "\n" + + " \n" + + "\n" + + "\n" + + " \n" + + " \n" + + "
      \n" + + " \n" + + "
      分享到:\n" + + " \n" + + " \n" + + "
      \n" + + "
      \n" + + "\n" + + " \n" + + "
      \n" + + " \n" + + "
      \n" + + "\n" + + "
      \n" + + "
      评论
      \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
      \n" + + "\n" + + "
      \n" + + "
      发表评论
      \n" + + "
      \n" + + "\n" + + "\n" + + " \n" + + "\n" + + "\n" + + "\n" + + "
      \n" + + "\n" + + "\n" + + "\n" + + "\n" + + "

      (快捷键 Alt+S / Ctrl+Enter)

      \n" + + "
      \n" + + " \n" + + "
      \n" + + "
      \n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
      \n" + + "\n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \"masong1987的博客\"
      \n" + + "
      masong1987
      \n" + + "
      \n" + + "\n" + + "
      \n" + + "
        \n" + + "
      • 浏览: 5401 次
      • \n" + + "
      • 性别: \"Icon_minigender_1\"
      • \n" + + "
      • 来自: 北京
      • \n" + + "
      • \n" + + " \n" + + "
      • \n" + + " 发短消息\n" + + " \n" + + " 更多访客>>\n" + + " \n" + + "
        \n" + + "
        \"flashsword20的博客\"
        \n" + + " \n" + + "
        \n" + + " \n" + + "
        \n" + + "
        \"dylinshi126的博客\"
        \n" + + " \n" + + "
        \n" + + " \n" + + "
        \n" + + "
        \"machoo的博客\"
        \n" + + " \n" + + "
        \n" + + " \n" + + "
        \n" + + "
        \"arson的博客\"
        \n" + + " \n" + + "
        \n" + + " \n" + + "
      \n" + + "\n" + + " \n" + + "\n" + + "
      \n" + + "
      文章分类
      \n" + + " \n" + + "
      \n" + + "
      \n" + + "
      社区版块
      \n" + + " \n" + + "
      \n" + + "
      \n" + + "
      存档分类
      \n" + + " \n" + + "
      \n" + + " \n" + + " \n" + + "\n" + + "
      \n" + + "
      最新评论
      \n" + + " \n" + + "
      \n" + + "\n" + + "
      \n" + + " \n" + + "
      \n" + + "
      \n" + + "\n" + + "
      \n" + + "
      \n" + + "
      \n" + + " 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。
      \n" + + " © 2003-2012 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ]\n" + + "
      \n" + + "
      \n" + + " \n" + + " \n" + "\n" + " \n" + " \n" + " \n" + "\n"; + String text2 = "
      aaa
      "; + XpathSelector xpathSelector = new XpathSelector( + "//div[@id='main']/div[@class='blog_main']/div[1][@class='blog_title']/h3/a"); String select = xpathSelector.select(text); - Assert.assertEquals("jsoup 解析页面商品信息",select); + Assert.assertEquals("jsoup 解析页面商品信息", select); } @Test - public void testOschina(){ + public void testOschina() { Html html1 = new Html(html); - Assert.assertEquals("再次吐槽easyui",html1.x(".//*[@class='QTitle']/h1/a").toString()); + Assert.assertEquals("再次吐槽easyui", html1.x(".//*[@class='QTitle']/h1/a").toString()); } - @Test - public void testOschinaBlog(){ - Html html1 = new Html(blogHtml); - System.out.println(html1.sc()); - } - - @Test - public void testHuxiuBlog(){ - Html html1 = new Html(huxiuHtml); - System.out.println(html1.sc()); - } } diff --git a/webmagic-core/src/test/resources/log4j.xml b/webmagic-core/src/test/resources/log4j.xml index a58e889b9..9084694eb 100644 --- a/webmagic-core/src/test/resources/log4j.xml +++ b/webmagic-core/src/test/resources/log4j.xml @@ -24,7 +24,7 @@ - + diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/HtmlTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/HtmlTest.java deleted file mode 100644 index f79909840..000000000 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/HtmlTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package us.codecraft.webmagic; - -import org.junit.Assert; -import org.junit.Test; -import us.codecraft.webmagic.selector.Html; - -/** - * User: cairne - * Date: 13-4-21 - * Time: 上午8:42 - */ -public class HtmlTest { - - @Test - public void testRegexSelector() { - Html selectable = new Html("aaaaaaab"); - Assert.assertEquals("abbabbab", (selectable.r("(.*)").rp("aa(a)", "$1bb").toString())); - - } -} diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 838c76b8e..6f795d743 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -15,12 +15,14 @@ public class SpiderTest { + @Ignore @Test public void testSpider() throws InterruptedException { Spider me = Spider.me().pipeline(new FilePipeline()).processor(new HuxiuProcessor()); me.run(); } + @Ignore @Test public void testGlobalSpider(){ // PageProcessor pageProcessor = new MeicanProcessor(); @@ -35,6 +37,7 @@ public void testGlobalSpider(){ } + @Ignore @Test public void test(){ System.out.println(System.getProperty("java.io.tmpdir")); diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 18b0680d9..63021342f 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.processor; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.ConsolePipeline; @@ -16,6 +17,7 @@ */ public class DiandianProcessorTest { + @Ignore @Test public void test() throws IOException { DiandianBlogProcessor diaoyuwengProcessor = new DiandianBlogProcessor(); diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 1e77c7c76..18498d36b 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.processor; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; @@ -16,6 +17,7 @@ */ public class DiaoyuwengProcessorTest { + @Ignore @Test public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index 0a5cc1b03..1fada8199 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.processor; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; @@ -16,6 +17,7 @@ */ public class SinablogProcessorTest { + @Ignore @Test public void test() throws IOException { SinaBlogProcesser sinaBlogProcesser = new SinaBlogProcesser(); From 62a8a6d1e75484a736374c4c59a612b8268ebc58 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 17 Jun 2013 11:14:44 +0800 Subject: [PATCH 007/175] invite travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..be7dfb8ca --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java \ No newline at end of file From 7ffd5551e2618e9d20ac80d45d9f8b1b8cddedaa Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 17 Jun 2013 11:23:29 +0800 Subject: [PATCH 008/175] fix pom --- pom.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pom.xml b/pom.xml index 68927f20b..39f068c5d 100644 --- a/pom.xml +++ b/pom.xml @@ -14,5 +14,20 @@ ./webmagic-samples/
      + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + + + + + From d0a3a2cbc34eb7448e4e79946b2230c47c884baf Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 17 Jun 2013 11:27:44 +0800 Subject: [PATCH 009/175] fix pom --- README.md | 3 +++ webmagic-core/pom.xml | 9 +++++++++ webmagic-plugin/pom.xml | 9 +++++++++ webmagic-samples/pom.xml | 9 +++++++++ 4 files changed, 30 insertions(+) diff --git a/README.md b/README.md index e92a4405c..063eca22f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ webmagic --------- + +[![Build Status](https://travis-ci.org/code4craft/webmagic.png?branch=master)](https://travis-ci.org/code4craft/webmagic) + ####*一个网络爬虫工具包* webmagic的发起源于工作中的需要,其定位是帮助开发者更便捷的开发一个垂直的网络爬虫。 diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index 607eb13c1..c0ef6a16f 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -62,6 +62,15 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + org.apache.maven.plugins maven-resources-plugin diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index 1128f7ac1..c2a08adb4 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -29,6 +29,15 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + org.apache.maven.plugins maven-resources-plugin diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index bfa1bfad2..4e345a286 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -30,6 +30,15 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.6 + 1.6 + + org.apache.maven.plugins maven-resources-plugin From b53bad227775dc480f26726b45b07cece45f22b5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 17 Jun 2013 13:21:47 +0800 Subject: [PATCH 010/175] add thanks --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 063eca22f..afa66ed55 100644 --- a/README.md +++ b/README.md @@ -82,3 +82,12 @@ webmagic定制的核心是PageProcessor接口。 webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) +### 致谢 + +webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: + +python爬虫**scrapy**[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) + +Java爬虫**Spiderman**[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) + + From 5a2c38475daf4f735a4d41855d4463f721b23a74 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 17 Jun 2013 13:29:17 +0800 Subject: [PATCH 011/175] format --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index afa66ed55..4611c2597 100644 --- a/README.md +++ b/README.md @@ -86,8 +86,8 @@ webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: -python爬虫**scrapy**[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) +python爬虫** scrapy **[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) -Java爬虫**Spiderman**[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) +Java爬虫** Spiderman **[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) From fb8fadbe93ce8f5bf7c2ee746d1fe4f5411d5514 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 07:24:19 +0800 Subject: [PATCH 012/175] change author info --- .../src/main/java/us/codecraft/webmagic/Page.java | 2 +- .../src/main/java/us/codecraft/webmagic/Request.java | 3 ++- .../src/main/java/us/codecraft/webmagic/Site.java | 2 +- .../src/main/java/us/codecraft/webmagic/Spider.java | 2 +- .../us/codecraft/webmagic/downloader/Downloader.java | 9 ++++++++- .../webmagic/downloader/HttpClientDownloader.java | 2 +- .../us/codecraft/webmagic/downloader/HttpClientPool.java | 2 +- .../us/codecraft/webmagic/pipeline/ConsolePipeline.java | 2 +- .../us/codecraft/webmagic/pipeline/FilePipeline.java | 2 +- .../java/us/codecraft/webmagic/pipeline/Pipeline.java | 2 +- .../us/codecraft/webmagic/processor/PageProcessor.java | 2 +- .../webmagic/processor/SimplePageProcessor.java | 2 +- .../webmagic/schedular/FileCacheQueueSchedular.java | 2 +- .../us/codecraft/webmagic/schedular/QueueSchedular.java | 2 +- .../java/us/codecraft/webmagic/schedular/Schedular.java | 2 +- .../main/java/us/codecraft/webmagic/selector/Html.java | 2 +- .../java/us/codecraft/webmagic/selector/PlainText.java | 2 +- .../java/us/codecraft/webmagic/selector/RegexResult.java | 2 +- .../us/codecraft/webmagic/selector/RegexSelector.java | 2 +- .../us/codecraft/webmagic/selector/ReplaceSelector.java | 2 +- .../java/us/codecraft/webmagic/selector/Selectable.java | 2 +- .../java/us/codecraft/webmagic/selector/Selector.java | 2 +- .../us/codecraft/webmagic/selector/SelectorFactory.java | 2 +- .../webmagic/selector/SmartContentSelector.java | 2 +- .../us/codecraft/webmagic/selector/XpathSelector.java | 2 +- .../main/java/us/codecraft/webmagic/utils/UrlUtils.java | 2 +- .../src/test/java/us/codecraft/webmagic/HtmlTest.java | 2 +- .../codecraft/webmagic/selector/RegexSelectorTest.java | 2 +- .../codecraft/webmagic/selector/XpathSelectorTest.java | 2 +- .../java/us/codecraft/webmagic/utils/UrlUtilsTest.java | 2 +- .../codecraft/webmagic/pipeline/FreemarkerPipeline.java | 2 +- .../us/codecraft/webmagic/FreemarkerPipelineTest.java | 2 +- .../webmagic/samples/DiandianBlogProcessor.java | 2 +- .../webmagic/samples/DianpingBlogProcessor.java | 2 +- .../codecraft/webmagic/samples/DiaoyuwengProcessor.java | 2 +- .../us/codecraft/webmagic/samples/F58PageProcesser.java | 2 +- .../us/codecraft/webmagic/samples/HuxiuProcessor.java | 2 +- .../us/codecraft/webmagic/samples/KaichibaProcessor.java | 2 +- .../us/codecraft/webmagic/samples/MeicanProcessor.java | 2 +- .../us/codecraft/webmagic/samples/NjuBBSProcessor.java | 2 +- .../webmagic/samples/OschinaBlogPageProcesser.java | 2 +- .../codecraft/webmagic/samples/OschinaPageProcesser.java | 2 +- .../codecraft/webmagic/samples/QzoneBlogProcessor.java | 2 +- .../us/codecraft/webmagic/samples/SinaBlogProcesser.java | 2 +- .../codecraft/webmagic/samples/TianyaPageProcesser.java | 2 +- .../src/test/java/us/codecraft/webmagic/SpiderTest.java | 2 +- .../webmagic/processor/DiandianProcessorTest.java | 2 +- .../webmagic/processor/DiaoyuwengProcessorTest.java | 2 +- .../webmagic/processor/SinablogProcessorTest.java | 2 +- 49 files changed, 57 insertions(+), 49 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index 8f1a4c77a..63b1b53a6 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -10,7 +10,7 @@ import java.util.concurrent.ConcurrentHashMap; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午11:22 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index ccefc7f9a..ce7870b8d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -1,7 +1,8 @@ package us.codecraft.webmagic; /** - * User: cairne + * Request对象是 + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午11:37 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 4c032aafb..05117f087 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -4,7 +4,7 @@ import java.util.Set; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午12:13 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index f3ec5f83a..bbab1a533 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -14,7 +14,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午6:53 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java index e84758487..2711ba4c8 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java @@ -5,11 +5,18 @@ import us.codecraft.webmagic.Site; /** - * User: cairne + * Downloader是webmagic抓取页面的核心接口。 + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午12:14 */ public interface Downloader { + /** + * + * @param request + * @param site + * @return + */ public Page download(Request request,Site site); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index 269ba6d37..2eb55c0ab 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -14,7 +14,7 @@ /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午12:15 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java index 4fdf42124..066a24e51 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java @@ -13,7 +13,7 @@ import us.codecraft.webmagic.Site; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午12:29 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 4115b8ce5..635bab62c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -7,7 +7,7 @@ import java.util.Map; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:45 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index d8407af57..ca3144ed7 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -13,7 +13,7 @@ import java.util.Map; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午6:28 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java index ef27cdae7..e5da1ea80 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Site; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:39 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java index e3c74a904..982005974 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Site; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午11:42 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index eb8f56ea2..c5d637712 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-22 * Time: 下午9:15 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java index 94002ed74..56c5f332b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java @@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:13 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java index 071f708c4..b9c39c327 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java @@ -10,7 +10,7 @@ import java.util.concurrent.LinkedBlockingQueue; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:13 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java index a5b71f5af..965ad2587 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Site; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:12 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index c385ff99c..22bf73d69 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -4,7 +4,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:54 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index 91ab7abd2..1d7a41e5d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -6,7 +6,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:54 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java index 8b14e8b75..06c00dd1c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.selector; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:39 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java index 671cbe79c..3b9871892 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java @@ -9,7 +9,7 @@ import java.util.regex.PatternSyntaxException; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:09 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java index 5f788982a..e240f0898 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java @@ -6,7 +6,7 @@ import java.util.regex.PatternSyntaxException; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:09 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 68ca47d44..f02cbc4c0 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -3,7 +3,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-20 * Time: 下午7:51 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java index 914e8ab01..3e1b056e1 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java @@ -3,7 +3,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-20 * Time: 下午8:02 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java index af1996943..633cb4abf 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java @@ -7,7 +7,7 @@ import java.util.concurrent.ConcurrentHashMap; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:56 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java index 10ab15c6c..919a795b3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java @@ -10,7 +10,7 @@ /** * readability算法,基础是找到所有p标签的父节点 * 写的比较乱,最终效果还在尝试中 - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午4:42 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java index 6de2f08ab..991f92674 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java @@ -6,7 +6,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午9:39 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java index 124ca6412..fd26499ce 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java @@ -6,7 +6,7 @@ import java.util.regex.Pattern; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:52 */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java index f79909840..0f8c06166 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.selector.Html; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午8:42 */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java index 6128f1708..3b80f92dc 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java @@ -4,7 +4,7 @@ import org.junit.Test; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午7:13 */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 469ff26c6..239630a93 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -4,7 +4,7 @@ import org.junit.Test; /** - * User: cairne Date: 13-4-21 Time: 上午10:06 + * Author: code4crafter@gmail.com Date: 13-4-21 Time: 上午10:06 */ public class XpathSelectorTest { diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java index d42400586..36361bfe7 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java @@ -4,7 +4,7 @@ import org.junit.Test; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午2:22 */ diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index 8487064ec..9afebb669 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -11,7 +11,7 @@ import java.io.*; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-6-8 * Time: 下午9:00 */ diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java b/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java index d52154f13..610edf55b 100644 --- a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java +++ b/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java @@ -6,7 +6,7 @@ import java.io.IOException; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-6-9 * Time: 上午7:14 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java index 53b10520b..b17b05dbf 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java index dd601adb3..cc91f89ad 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java index 03389f5bb..bcea9a31e 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java @@ -8,7 +8,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java index 78211c4c0..346b1e225 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java index 82552f956..8286d7816 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java index 58a2cb81c..866c903c9 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.processor.PageProcessor; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-5-20 * Time: 下午5:31 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java index 637aec172..30ba84d43 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-5-20 * Time: 下午5:31 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java index ca46de671..3b61d7649 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java index 2166d9b1b..58d87a7f6 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java index cdfbc1e0e..4f84a3f54 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java index 67ef671e7..e252eeff0 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java index 79065265f..07f6d4768 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.processor.PageProcessor; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java index 7a8920bef..564f1efb6 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 6f795d743..79f428ebe 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -8,7 +8,7 @@ import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-4-20 * Time: 下午7:46 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 63021342f..74de9c0e0 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -11,7 +11,7 @@ import java.io.IOException; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-6-9 * Time: 上午8:02 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 18498d36b..012b5e6fd 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -11,7 +11,7 @@ import java.io.IOException; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-6-9 * Time: 上午8:02 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index 1fada8199..72e6be0d6 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -11,7 +11,7 @@ import java.io.IOException; /** - * User: cairne + * Author: code4crafter@gmail.com * Date: 13-6-9 * Time: 上午8:02 */ From 61a1fe31c4aa2b794e00b5cd474f5997d911c6df Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 08:32:11 +0800 Subject: [PATCH 013/175] add cookie support & add docs --- .../main/java/us/codecraft/webmagic/Page.java | 9 +++++- .../java/us/codecraft/webmagic/Request.java | 30 ++++++++++++++++++- .../main/java/us/codecraft/webmagic/Site.java | 26 ++++++++-------- .../java/us/codecraft/webmagic/Spider.java | 4 ++- .../webmagic/downloader/Downloader.java | 5 ++-- .../webmagic/downloader/HttpClientPool.java | 21 ++++++++++--- .../downloader/HttpClientDownloaderTest.java | 23 ++++++++++++++ .../webmagic/samples/KaichibaProcessor.java | 2 +- 8 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index 63b1b53a6..eee1a8a74 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -10,6 +10,7 @@ import java.util.concurrent.ConcurrentHashMap; /** + * Page保存了抓取的结果,并可定义下一次抓取的链接内容。 * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午11:22 @@ -65,7 +66,7 @@ public void addTargetRequests(List requests) { } } - public void addTargetRequests(String requestString) { + public void addTargetRequest(String requestString) { if (StringUtils.isBlank(requestString) || requestString.equals("#")) { return; } @@ -75,6 +76,12 @@ public void addTargetRequests(String requestString) { } } + public void addTargetRequest(Request request) { + synchronized (targetRequests) { + targetRequests.add(request); + } + } + public Selectable getUrl() { return url; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index ce7870b8d..ecb8b4ef9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -1,7 +1,22 @@ package us.codecraft.webmagic; /** - * Request对象是 + * Request对象封装了待抓取的url信息。
      + * 在PageProcessor中,Request对象可以通过{@link us.codecraft.webmagic.Page#getRequest()} 获取。
      + * Request对象包含一个extra属性,可以写入一些必须的上下文,这个特性在某些场合会有用。
      + *
      + *      Example:
      + *          抓取${linktext}时,希望提取链接link,并保存linktext的信息。
      + *      在上一个页面:
      + *      public void process(Page page){
      + *          Request request = new Request(link,linktext);
      + *          page.addTargetRequest(request)
      + *      }
      + *      在下一个页面:
      + *      public void process(Page page){
      + *          String linktext =  (String)page.getRequest().getExtra()[0];
      + *      }
      + * 
      * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 上午11:37 @@ -12,15 +27,28 @@ public class Request { private Object[] extra; + /** + * 构建一个request对象 + * @param url 必须参数,待抓取的url + * @param extra 额外参数,可以保存一些需要的上下文信息 + */ public Request(String url, Object... extra) { this.url = url; this.extra = extra; } + /** + * 获取预存的对象 + * @return object[] 预存的对象数组 + */ public Object[] getExtra() { return extra; } + /** + * 获取待抓取的url + * @return url 待抓取的url + */ public String getUrl() { return url; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 05117f087..413d8d80a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -1,9 +1,9 @@ package us.codecraft.webmagic; -import java.util.HashSet; -import java.util.Set; +import java.util.*; /** + * Site定义一个待抓取的站点的各种信息。 * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午12:13 @@ -14,11 +14,11 @@ public class Site { private String userAgent; - private String cookie; + private Map cookies = new LinkedHashMap(); private String encoding; - private String startUrl; + private List startUrls; private int sleepTime = 3000; @@ -34,8 +34,8 @@ public static Site me() { return new Site(); } - public Site setCookie(String cookie) { - this.cookie = cookie; + public Site setCookie(String name,String value) { + cookies.put(name,value); return this; } @@ -44,8 +44,8 @@ public Site setUserAgent(String userAgent) { return this; } - public String getCookie() { - return cookie; + public Map getCookies() { + return cookies; } public String getUserAgent() { @@ -79,12 +79,12 @@ public Site setAcceptStatCode(Set acceptStatCode) { return this; } - public String getStartUrl() { - return startUrl; + public List getStartUrls() { + return startUrls; } public Site setStartUrl(String startUrl) { - this.startUrl = startUrl; + this.startUrls.add(startUrl); return this; } @@ -106,8 +106,8 @@ public boolean equals(Object o) { if (acceptStatCode != null ? !acceptStatCode.equals(site.acceptStatCode) : site.acceptStatCode != null) return false; - if (cookie != null ? !cookie.equals(site.cookie) : site.cookie != null) return false; if (!domain.equals(site.domain)) return false; + if (!startUrls.equals(site.startUrls)) return false; if (encoding != null ? !encoding.equals(site.encoding) : site.encoding != null) return false; if (userAgent != null ? !userAgent.equals(site.userAgent) : site.userAgent != null) return false; @@ -117,8 +117,8 @@ public boolean equals(Object o) { @Override public int hashCode() { int result = domain.hashCode(); + result = 31 * result + (startUrls != null ? startUrls.hashCode() : 0); result = 31 * result + (userAgent != null ? userAgent.hashCode() : 0); - result = 31 * result + (cookie != null ? cookie.hashCode() : 0); result = 31 * result + (encoding != null ? encoding.hashCode() : 0); result = 31 * result + (acceptStatCode != null ? acceptStatCode.hashCode() : 0); return result; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index bbab1a533..180d7529b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -36,7 +36,9 @@ public static Spider me() { public Spider processor(PageProcessor pageProcessor) { this.pageProcessor = pageProcessor; - schedular.push(new Request(pageProcessor.getSite().getStartUrl()), pageProcessor.getSite()); + for (String startUrl : pageProcessor.getSite().getStartUrls()) { + schedular.push(new Request(startUrl), pageProcessor.getSite()); + } return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java index 2711ba4c8..f276fde2b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.Site; /** - * Downloader是webmagic抓取页面的核心接口。 + * Downloader是webmagic下载页面的接口。webmagic默认使用了HttpComponent作为下载器,一般情况,你无需自己实现这个接口。 * Author: code4crafter@gmail.com * Date: 13-4-21 * Time: 下午12:14 @@ -13,10 +13,11 @@ public interface Downloader { /** + * 下载页面,并保存信息到Page对象中。 * * @param request * @param site * @return */ - public Page download(Request request,Site site); + public Page download(Request request, Site site); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java index 066a24e51..891ff188b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java @@ -1,17 +1,22 @@ package us.codecraft.webmagic.downloader; import org.apache.http.HttpVersion; +import org.apache.http.client.CookieStore; import org.apache.http.client.HttpClient; import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.CookiePolicy; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.PoolingClientConnectionManager; +import org.apache.http.impl.cookie.BasicClientCookie; import org.apache.http.params.*; import us.codecraft.webmagic.Site; +import java.util.Map; + /** * Author: code4crafter@gmail.com * Date: 13-4-21 @@ -50,15 +55,23 @@ private HttpClient generateClient(Site site) { schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry); - connectionManager.setMaxTotal(100); + connectionManager.setMaxTotal(poolSize); connectionManager.setDefaultMaxPerRoute(100); - HttpClient httpClient = new DefaultHttpClient(connectionManager, params); + DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager, params); + generateCookie(httpClient, site); httpClient.getParams().setIntParameter("http.socket.timeout", 60000); httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH); return httpClient; } - public void pushBack(HttpClient httpClient) { - + private void generateCookie(DefaultHttpClient httpClient, Site site) { + CookieStore cookieStore = new BasicCookieStore(); + for (Map.Entry cookieEntry : site.getCookies().entrySet()) { + BasicClientCookie cookie = new BasicClientCookie(cookieEntry.getKey(), cookieEntry.getValue()); + cookie.setDomain(site.getDomain()); + cookieStore.addCookie(cookie); + } + httpClient.setCookieStore(cookieStore); } + } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java new file mode 100644 index 000000000..7f00e17c0 --- /dev/null +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java @@ -0,0 +1,23 @@ +package us.codecraft.webmagic.downloader; + +import org.junit.Assert; +import org.junit.Test; +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Site; + +/** + * Author: code4crafer@gmail.com + * Date: 13-6-18 + * Time: 上午8:22 + */ +public class HttpClientDownloaderTest { + + @Test + public void testCookie() { + Site site = Site.me().setDomain("www.diandian.com").setCookie("t", "yct7q7e6v319wpg4cpxqduu5m77lcgix"); + HttpClientDownloader httpClientDownloader = new HttpClientDownloader(); + Page download = httpClientDownloader.download(new Request("http://www.diandian.com"), site); + Assert.assertTrue(download.getHtml().toString().contains("flashsword30")); + } +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java index 866c903c9..f2d405062 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java @@ -14,7 +14,7 @@ public class KaichibaProcessor implements PageProcessor { public void process(Page page) { //http://progressdaily.diandian.com/post/2013-01-24/40046867275 int i = Integer.valueOf(page.getUrl().r("shop/(\\d+)").toString()) + 1; - page.addTargetRequests("http://kaichiba.com/shop/"+i); + page.addTargetRequest("http://kaichiba.com/shop/" + i); page.putField("title",page.getHtml().x("//Title")); page.putField("items", page.getHtml().xs("//li[@class=\"foodTitle\"]").rp("^\\s+", "").rp("\\s+$", "").rp(".*?", "")); } From ff49617966c03ca1accd3018bad92c0c8c9ab387 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 10:02:11 +0800 Subject: [PATCH 014/175] add warning --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4611c2597..7f535362b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ webmagic的发起源于工作中的需要,其定位是帮助开发者更便捷 webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),开发者可以便捷的使用xpath和正则表达式进行链接和内容的提取,只需编写少量代码即可完成一个定制爬虫。 +#### 请注意 + +webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参与到webmagic的试用和修改中来。** 如果只是想以外部jar包的方式,引用webmagic并进行自己的业务开发,建议你等待webmagic的第一个稳定版本。** + ###特色### * ####垂直爬虫#### @@ -86,8 +90,8 @@ webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: -python爬虫** scrapy **[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) +python爬虫 ** scrapy **[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) -Java爬虫** Spiderman **[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) +Java爬虫 ** Spiderman **[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) From d7031f2515b0d619e16b398d58c524738d8591ce Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 11:21:53 +0800 Subject: [PATCH 015/175] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f535362b..92972ce9b 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载 #### 请注意 -webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参与到webmagic的试用和修改中来。** 如果只是想以外部jar包的方式,引用webmagic并进行自己的业务开发,建议你等待webmagic的第一个稳定版本。** +webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参与到webmagic的试用和修改中来。 ** 如果只是想以外部jar包的方式,引用webmagic并进行自己的业务开发,建议你等待webmagic的第一个稳定版本。** ###特色### From 188036b532ee0165561316fae0429e4d038f3462 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 14:34:09 +0800 Subject: [PATCH 016/175] add id --- .../main/java/us/codecraft/webmagic/Site.java | 24 +++++++++++++++---- .../java/us/codecraft/webmagic/Spider.java | 1 - .../webmagic/pipeline/FilePipeline.java | 4 ++-- .../schedular/FileCacheQueueSchedular.java | 16 ++++++++----- .../processor/DiaoyuwengProcessorTest.java | 2 -- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 413d8d80a..674ac5bc9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -12,13 +12,18 @@ public class Site { private String domain; + /** + * for identify a task + */ + private String identifier; + private String userAgent; - private Map cookies = new LinkedHashMap(); + private Map cookies = new LinkedHashMap(); private String encoding; - private List startUrls; + private List startUrls = new ArrayList(); private int sleepTime = 3000; @@ -34,8 +39,8 @@ public static Site me() { return new Site(); } - public Site setCookie(String name,String value) { - cookies.put(name,value); + public Site setCookie(String name, String value) { + cookies.put(name, value); return this; } @@ -44,7 +49,7 @@ public Site setUserAgent(String userAgent) { return this; } - public Map getCookies() { + public Map getCookies() { return cookies; } @@ -61,6 +66,15 @@ public Site setDomain(String domain) { return this; } + public String getIdentifier() { + return identifier; + } + + public Site setIdentifier(String identifier) { + this.identifier = identifier; + return this; + } + public String getEncoding() { return encoding; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 180d7529b..7f34850d8 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -85,7 +85,6 @@ private void sleep(int time) { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); - ; } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index ca3144ed7..84a94ce77 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -33,7 +33,7 @@ public FilePipeline(String path) { public void process(Page page, Site site) { String domain = site.getDomain(); domain = UrlUtils.getDomain(domain); - String path = this.path + "" + domain + "/"; + String path = this.path + "" + domain + "#" + site.getIdentifier() + "/"; File file = new File(path); if (!file.exists()) { file.mkdirs(); @@ -46,7 +46,7 @@ public void process(Page page, Site site) { } printWriter.close(); } catch (IOException e) { - e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + e.printStackTrace(); } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java index 56c5f332b..b3086a283 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java @@ -60,7 +60,7 @@ private void flush() { private void init() { File file = new File(filePath); - if (!file.exists()){ + if (!file.exists()) { file.mkdirs(); } readFile(); @@ -81,8 +81,8 @@ public void run() { private void initWriter() { try { - fileUrlWriter = new PrintWriter(new FileWriter(filePath + site.getDomain() + fileUrlAllName, true)); - fileCursorWriter = new PrintWriter(new FileWriter(filePath + site.getDomain() + fileCursor, false)); + fileUrlWriter = new PrintWriter(new FileWriter(getFileName(fileUrlAllName), true)); + fileCursorWriter = new PrintWriter(new FileWriter(getFileName(fileCursor), false)); } catch (IOException e) { throw new RuntimeException("init cache schedular error", e); } @@ -100,7 +100,7 @@ private void readFile() { private void readUrlFile() throws IOException { String line; - BufferedReader fileUrlReader = new BufferedReader(new FileReader(filePath + site.getDomain() + fileUrlAllName)); + BufferedReader fileUrlReader = new BufferedReader(new FileReader(getFileName(fileUrlAllName))); int lineReaded = 0; while ((line = fileUrlReader.readLine()) != null) { urls.add(line.trim()); @@ -112,7 +112,7 @@ private void readUrlFile() throws IOException { } private void readCursorFile() throws IOException { - BufferedReader fileCursorReader = new BufferedReader(new FileReader(filePath + site.getDomain() + fileCursor)); + BufferedReader fileCursorReader = new BufferedReader(new FileReader(getFileName(fileCursor))); String line = null; //read the last number while ((line = fileCursorReader.readLine()) != null) { @@ -120,8 +120,12 @@ private void readCursorFile() throws IOException { } } + private String getFileName(String filename) { + return filePath + site.getDomain() + "#" + site.getIdentifier() + filename; + } + @Override - public synchronized void push(Request request,Site site) { + public synchronized void push(Request request, Site site) { if (!inited.get()) { init(); } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 012b5e6fd..0c24b5771 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -1,6 +1,5 @@ package us.codecraft.webmagic.processor; -import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; @@ -17,7 +16,6 @@ */ public class DiaoyuwengProcessorTest { - @Ignore @Test public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); From 245e963d9976db19ddff675eede13234242454b1 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 17:42:31 +0800 Subject: [PATCH 017/175] add uuid to spider --- .../main/java/us/codecraft/webmagic/Site.java | 16 +----- .../java/us/codecraft/webmagic/Spider.java | 56 +++++++++++++++---- .../main/java/us/codecraft/webmagic/Task.java | 12 ++++ .../webmagic/pipeline/ConsolePipeline.java | 4 +- .../webmagic/pipeline/FilePipeline.java | 9 +-- .../codecraft/webmagic/pipeline/Pipeline.java | 4 +- .../processor/SimplePageProcessor.java | 2 +- .../schedular/FileCacheQueueSchedular.java | 20 +++---- .../webmagic/schedular/QueueSchedular.java | 6 +- .../webmagic/schedular/Schedular.java | 6 +- .../samples/DiandianBlogProcessor.java | 2 +- .../samples/DianpingBlogProcessor.java | 2 +- .../webmagic/samples/DiaoyuwengProcessor.java | 2 +- .../webmagic/samples/F58PageProcesser.java | 2 +- .../webmagic/samples/HuxiuProcessor.java | 2 +- .../webmagic/samples/KaichibaProcessor.java | 2 +- .../webmagic/samples/MeicanProcessor.java | 2 +- .../webmagic/samples/NjuBBSProcessor.java | 2 +- .../samples/OschinaBlogPageProcesser.java | 2 +- .../samples/OschinaPageProcesser.java | 2 +- .../webmagic/samples/QzoneBlogProcessor.java | 2 +- .../webmagic/samples/SinaBlogProcesser.java | 2 +- .../webmagic/samples/TianyaPageProcesser.java | 2 +- .../src/main/resources/ftl/wordpress.ftl | 6 +- 24 files changed, 98 insertions(+), 69 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/Task.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 674ac5bc9..a4d88d895 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -12,11 +12,6 @@ public class Site { private String domain; - /** - * for identify a task - */ - private String identifier; - private String userAgent; private Map cookies = new LinkedHashMap(); @@ -66,15 +61,6 @@ public Site setDomain(String domain) { return this; } - public String getIdentifier() { - return identifier; - } - - public Site setIdentifier(String identifier) { - this.identifier = identifier; - return this; - } - public String getEncoding() { return encoding; } @@ -97,7 +83,7 @@ public List getStartUrls() { return startUrls; } - public Site setStartUrl(String startUrl) { + public Site addStartUrl(String startUrl) { this.startUrls.add(startUrl); return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 7f34850d8..f7f560cb3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -18,7 +18,7 @@ * Date: 13-4-21 * Time: 上午6:53 */ -public class Spider implements Runnable { +public class Spider implements Runnable, Task { private Downloader downloader = new HttpClientDownloader(); @@ -26,6 +26,12 @@ public class Spider implements Runnable { private PageProcessor pageProcessor; + private List startUrls; + + private Site site; + + private String uuid; + private Schedular schedular = new QueueSchedular(); private Logger logger = Logger.getLogger(getClass()); @@ -36,9 +42,18 @@ public static Spider me() { public Spider processor(PageProcessor pageProcessor) { this.pageProcessor = pageProcessor; - for (String startUrl : pageProcessor.getSite().getStartUrls()) { - schedular.push(new Request(startUrl), pageProcessor.getSite()); - } + this.site = pageProcessor.getSite(); + return this; + } + + public Spider startUrls(List startUrls) { + this.startUrls = startUrls; + return this; + } + + public Spider startUrl(String startUrl) { + startUrls = new ArrayList(); + startUrls.add(startUrl); return this; } @@ -59,13 +74,15 @@ public Spider pipeline(Pipeline pipeline) { @Override public void run() { - Site site = pageProcessor.getSite(); - Request request = schedular.poll(site); - if (pipelines.isEmpty()){ + for (String startUrl : pageProcessor.getSite().getStartUrls()) { + schedular.push(new Request(startUrl), this); + } + Request request = schedular.poll(this); + if (pipelines.isEmpty()) { pipelines.add(new ConsolePipeline()); } while (request != null) { - Page page = downloader.download(request,site); + Page page = downloader.download(request, site); if (page == null) { sleep(site.getSleepTime()); continue; @@ -73,13 +90,19 @@ public void run() { pageProcessor.process(page); addRequest(page); for (Pipeline pipeline : pipelines) { - pipeline.process(page,site); + pipeline.process(page, this); } sleep(site.getSleepTime()); - request = schedular.poll(site); + request = schedular.poll(this); } } + public Spider setUUID(String uuid) { + this.uuid = uuid; + return this; + } + + private void sleep(int time) { try { Thread.sleep(time); @@ -91,8 +114,19 @@ private void sleep(int time) { private void addRequest(Page page) { if (CollectionUtils.isNotEmpty(page.getTargetRequests())) { for (Request request : page.getTargetRequests()) { - schedular.push(request,pageProcessor.getSite()); + schedular.push(request, this); } } } + + @Override + public String getUUID() { + if (uuid != null) { + return uuid; + } + if (site != null) { + return site.getDomain(); + } + return null; + } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java new file mode 100644 index 000000000..0eaf6c95c --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java @@ -0,0 +1,12 @@ +package us.codecraft.webmagic; + +/** + * Author: code4crafer@gmail.com + * Date: 13-6-18 + * Time: 下午2:57 + */ +public interface Task { + + public String getUUID(); + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 635bab62c..7b93876dc 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.pipeline; import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; import us.codecraft.webmagic.selector.Selectable; import java.util.Map; @@ -14,7 +14,7 @@ public class ConsolePipeline implements Pipeline{ @Override - public void process(Page page,Site site) { + public void process(Page page,Task task) { System.out.println("get page: "+page.getUrl()); for (Map.Entry entry : page.getFields().entrySet()) { System.out.println(entry.getKey()+":\t"+entry.getValue().toStrings()); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 84a94ce77..2311a75dd 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -2,9 +2,8 @@ import org.apache.commons.codec.digest.DigestUtils; import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; import us.codecraft.webmagic.selector.Selectable; -import us.codecraft.webmagic.utils.UrlUtils; import java.io.File; import java.io.FileWriter; @@ -30,10 +29,8 @@ public FilePipeline(String path) { } @Override - public void process(Page page, Site site) { - String domain = site.getDomain(); - domain = UrlUtils.getDomain(domain); - String path = this.path + "" + domain + "#" + site.getIdentifier() + "/"; + public void process(Page page, Task task) { + String path = this.path + "/" + task.getUUID() + "/"; File file = new File(path); if (!file.exists()) { file.mkdirs(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java index e5da1ea80..b2b51e0ae 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.pipeline; import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; /** * Author: code4crafter@gmail.com @@ -10,5 +10,5 @@ */ public interface Pipeline { - public void process(Page page,Site site); + public void process(Page page,Task task); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index c5d637712..9f4eed36f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -20,7 +20,7 @@ public class SimplePageProcessor implements PageProcessor { private Site site; public SimplePageProcessor(String startUrl, String urlPattern) { - this.site = Site.me().setStartUrl(startUrl). + this.site = Site.me().addStartUrl(startUrl). setDomain(UrlUtils.getDomain(startUrl)).setUserAgent(UA); this.urlPattern = "("+urlPattern.replace(".","\\.").replace("*","[^\"'#]*")+")"; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java index b3086a283..e9d4adb7c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java @@ -2,8 +2,8 @@ import org.apache.commons.lang3.math.NumberUtils; import org.apache.log4j.Logger; -import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Task; import java.io.*; import java.util.LinkedHashSet; @@ -28,7 +28,7 @@ public class FileCacheQueueSchedular implements Schedular { private String fileUrlAllName = ".urls.txt"; - private Site site; + private Task task; private String fileCursor = ".cursor.txt"; @@ -44,13 +44,13 @@ public class FileCacheQueueSchedular implements Schedular { private Set urls; - public FileCacheQueueSchedular(Site site) { - this.site = site; + public FileCacheQueueSchedular(Task task) { + this.task = task; } - public FileCacheQueueSchedular(Site site, String filePath) { + public FileCacheQueueSchedular(Task task, String filePath) { this.filePath = filePath; - this.site = site; + this.task = task; } private void flush() { @@ -106,7 +106,7 @@ private void readUrlFile() throws IOException { urls.add(line.trim()); lineReaded++; if (lineReaded > cursor.get()) { - queue.add(new Request(line, site)); + queue.add(new Request(line)); } } } @@ -121,11 +121,11 @@ private void readCursorFile() throws IOException { } private String getFileName(String filename) { - return filePath + site.getDomain() + "#" + site.getIdentifier() + filename; + return filePath + task.getUUID() + "/" + filename; } @Override - public synchronized void push(Request request, Site site) { + public synchronized void push(Request request, Task task) { if (!inited.get()) { init(); } @@ -140,7 +140,7 @@ public synchronized void push(Request request, Site site) { } @Override - public synchronized Request poll(Site site) { + public synchronized Request poll(Task task) { if (!inited.get()) { init(); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java index b9c39c327..8c3da3b00 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java @@ -2,7 +2,7 @@ import org.apache.log4j.Logger; import us.codecraft.webmagic.Request; -import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; import java.util.HashSet; import java.util.Set; @@ -23,7 +23,7 @@ public class QueueSchedular implements Schedular { private Set urls = new HashSet(); @Override - public synchronized void push(Request request,Site site) { + public synchronized void push(Request request,Task task) { if (logger.isDebugEnabled()){ logger.debug("push to queue "+request.getUrl()); } @@ -34,7 +34,7 @@ public synchronized void push(Request request,Site site) { } @Override - public synchronized Request poll(Site site) { + public synchronized Request poll(Task task) { return queue.poll(); } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java index 965ad2587..8e4edb420 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.schedular; import us.codecraft.webmagic.Request; -import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; /** * Author: code4crafter@gmail.com @@ -10,8 +10,8 @@ */ public interface Schedular { - public void push(Request request,Site site); + public void push(Request request,Task task); - public Request poll(Site site); + public Request poll(Task task); } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java index b17b05dbf..a9351a1be 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java @@ -37,7 +37,7 @@ public void process(Page page) { public Site getSite() { //site定义抽取配置,以及开始url等 if (site == null) { - site = Site.me().setDomain("progressdaily.diandian.com").setStartUrl("http://progressdaily.diandian.com/"). + site = Site.me().setDomain("progressdaily.diandian.com").addStartUrl("http://progressdaily.diandian.com/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } return site; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java index cc91f89ad..fafb7de25 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java @@ -27,7 +27,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("www.dianping.com").setStartUrl("http://www.dianping.com/"). + return Site.me().setDomain("www.dianping.com").addStartUrl("http://www.dianping.com/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java index bcea9a31e..8d64bbca5 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java @@ -33,7 +33,7 @@ public void process(Page page) { @Override public Site getSite() { if (site==null){ - site= Site.me().setDomain("www.diaoyuweng.com").setStartUrl("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space"). + site= Site.me().setDomain("www.diaoyuweng.com").addStartUrl("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31").setEncoding("GBK").setSleepTime(500); } return site; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java index 346b1e225..82db2dd7a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java @@ -23,6 +23,6 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("sh.58.com").setStartUrl("http://sh.58.com/"); //To change body of implemented methods use File | Settings | File Templates. + return Site.me().setDomain("sh.58.com").addStartUrl("http://sh.58.com/"); //To change body of implemented methods use File | Settings | File Templates. } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java index 8286d7816..36f69466f 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java @@ -23,7 +23,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("www.huxiu.com").setStartUrl("http://www.huxiu.com/"). + return Site.me().setDomain("www.huxiu.com").addStartUrl("http://www.huxiu.com/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java index f2d405062..11f046271 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java @@ -21,7 +21,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("kaichiba.com").setStartUrl("http://kaichiba.com/shop/41725781").setEncoding("utf-8"). + return Site.me().setDomain("kaichiba.com").addStartUrl("http://kaichiba.com/shop/41725781").setEncoding("utf-8"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java index 30ba84d43..aaeca8f88 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java @@ -27,7 +27,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("meican.com").setStartUrl("http://www.meican.com/shanghai/districts").setEncoding("utf-8"). + return Site.me().setDomain("meican.com").addStartUrl("http://www.meican.com/shanghai/districts").setEncoding("utf-8"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java index 3b61d7649..58e19c4ea 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java @@ -22,7 +22,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("bbs.nju.edu.cn").setStartUrl("http://bbs.nju.edu.cn/board?board=Pictures"). + return Site.me().setDomain("bbs.nju.edu.cn").addStartUrl("http://bbs.nju.edu.cn/board?board=Pictures"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java index 58d87a7f6..bcc2d6eec 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java @@ -24,7 +24,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("my.oschina.net").setStartUrl("http://www.oschina.net/"). + return Site.me().setDomain("my.oschina.net").addStartUrl("http://www.oschina.net/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java index 4f84a3f54..d85ca8142 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java @@ -23,7 +23,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("www.oschina.net").setStartUrl("http://www.oschina.net/"). + return Site.me().setDomain("www.oschina.net").addStartUrl("http://www.oschina.net/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java index e252eeff0..fac491dfd 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java @@ -26,7 +26,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("www.diandian.com").setStartUrl("http://17dujingdian.com/"). + return Site.me().setDomain("www.diandian.com").addStartUrl("http://17dujingdian.com/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java index 07f6d4768..37c686490 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java @@ -26,7 +26,7 @@ public void process(Page page) { @Override public Site getSite() { if (site==null){ - site = Site.me().setDomain("blog.sina.com.cn").setStartUrl("http://blog.sina.com.cn/flashsword20").setSleepTime(3000). + site = Site.me().setDomain("blog.sina.com.cn").addStartUrl("http://blog.sina.com.cn/flashsword20").setSleepTime(3000). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } return site; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java index 564f1efb6..db5f9ff21 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java @@ -23,6 +23,6 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("http://bbs.tianya.cn/").setStartUrl("http://bbs.tianya.cn/"); //To change body of implemented methods use File | Settings | File Templates. + return Site.me().setDomain("http://bbs.tianya.cn/").addStartUrl("http://bbs.tianya.cn/"); //To change body of implemented methods use File | Settings | File Templates. } } diff --git a/webmagic-samples/src/main/resources/ftl/wordpress.ftl b/webmagic-samples/src/main/resources/ftl/wordpress.ftl index f2feeb16c..c2442ab62 100644 --- a/webmagic-samples/src/main/resources/ftl/wordpress.ftl +++ b/webmagic-samples/src/main/resources/ftl/wordpress.ftl @@ -1,13 +1,13 @@ ${title} - http://127.0.0.1/wordpress/?p=${id} + http://127.0.0.1/wordpress/?p=${uuid} ${date} admin - http://127.0.0.1/wordpress/?p=${id} + http://127.0.0.1/wordpress/?p=${uuid} - ${id} + ${uuid} ${date} ${date} open From faba1b81a6f5cfd74f3c7ae2c19b05f92d6b79d9 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 17:46:00 +0800 Subject: [PATCH 018/175] update readme, markdown syntax ** --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 92972ce9b..e5dc333eb 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载 #### 请注意 -webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参与到webmagic的试用和修改中来。 ** 如果只是想以外部jar包的方式,引用webmagic并进行自己的业务开发,建议你等待webmagic的第一个稳定版本。** +webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参与到webmagic的试用和修改中来。 **如果只是想以外部jar包的方式,引用webmagic并进行自己的业务开发,建议你等待webmagic的第一个稳定版本。** ###特色### @@ -90,8 +90,8 @@ webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: -python爬虫 ** scrapy **[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) +python爬虫 **scrapy**[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) -Java爬虫 ** Spiderman **[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) +Java爬虫 **Spiderman**[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) From 4c71f22bd1b9bd135a34e0d1c7e4ae4688a2a987 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 18:02:30 +0800 Subject: [PATCH 019/175] fix compile error --- .../schedular/FileCacheQueueSchedular.java | 14 +++++--------- .../webmagic/pipeline/FreemarkerPipeline.java | 14 +++++++------- .../java/us/codecraft/webmagic/SpiderTest.java | 2 +- .../webmagic/processor/DiandianProcessorTest.java | 2 +- .../processor/DiaoyuwengProcessorTest.java | 4 +++- .../webmagic/processor/SinablogProcessorTest.java | 2 +- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java index e9d4adb7c..882f49824 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java @@ -44,13 +44,8 @@ public class FileCacheQueueSchedular implements Schedular { private Set urls; - public FileCacheQueueSchedular(Task task) { - this.task = task; - } - - public FileCacheQueueSchedular(Task task, String filePath) { + public FileCacheQueueSchedular(String filePath) { this.filePath = filePath; - this.task = task; } private void flush() { @@ -58,7 +53,8 @@ private void flush() { fileCursorWriter.flush(); } - private void init() { + private void init(Task task) { + this.task = task; File file = new File(filePath); if (!file.exists()) { file.mkdirs(); @@ -127,7 +123,7 @@ private String getFileName(String filename) { @Override public synchronized void push(Request request, Task task) { if (!inited.get()) { - init(); + init(task); } if (logger.isDebugEnabled()) { logger.debug("push to queue " + request.getUrl()); @@ -142,7 +138,7 @@ public synchronized void push(Request request, Task task) { @Override public synchronized Request poll(Task task) { if (!inited.get()) { - init(); + init(task); } fileCursorWriter.println(cursor.incrementAndGet()); return queue.poll(); diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index 9afebb669..112197113 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -5,10 +5,12 @@ import freemarker.template.TemplateException; import org.apache.commons.codec.digest.DigestUtils; import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.utils.UrlUtils; +import us.codecraft.webmagic.Task; -import java.io.*; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; /** * Author: code4crafter@gmail.com @@ -37,10 +39,8 @@ public FreemarkerPipeline(String template) throws IOException { @Override - public void process(Page page, Site site) { - String domain = site.getDomain(); - domain = UrlUtils.getDomain(domain); - String path = this.path + "" + domain + "/"; + public void process(Page page, Task task) { + String path = this.path + "" + task.getUUID() + "/"; File file = new File(path); if (!file.exists()) { file.mkdirs(); diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 79f428ebe..b67ffc4b7 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -31,7 +31,7 @@ public void testGlobalSpider(){ SimplePageProcessor pageProcessor2 = new SimplePageProcessor("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space", "http://www.diaoyuweng.com/thread-*-1-1.html"); System.out.println(pageProcessor2.getSite().getEncoding()); pageProcessor2.getSite().setSleepTime(500); - Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueSchedular(pageProcessor2.getSite(),"/data/temp/webmagic/cache/")). + Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). processor(pageProcessor2).run(); diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 74de9c0e0..721a5eb86 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -30,7 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 - Spider.me().pipeline(new ConsolePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular(diaoyuwengProcessor.getSite(), "/data/temp/webmagic/cache/")). + Spider.me().pipeline(new ConsolePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). processor(diaoyuwengProcessor).run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 0c24b5771..8f03b6a8a 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.processor; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; @@ -16,11 +17,12 @@ */ public class DiaoyuwengProcessorTest { + @Ignore @Test public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl"); - Spider.me().pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular(diaoyuwengProcessor.getSite(), "/data/temp/webmagic/cache/")). + Spider.me().pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). processor(diaoyuwengProcessor).run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index 72e6be0d6..8fb258378 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -30,7 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 - Spider.me().pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular(sinaBlogProcesser.getSite(), "/data/temp/webmagic/cache/")). + Spider.me().pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). processor(sinaBlogProcesser).run(); } } From d86716508f0e98f9a1e667418d341961cc455fd0 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 18:30:45 +0800 Subject: [PATCH 020/175] fix samples --- README.md | 4 ++-- .../java/us/codecraft/webmagic/Spider.java | 6 +---- .../webmagic/pipeline/FreemarkerPipeline.java | 2 +- .../webmagic/FreemarkerPipelineTest.java | 2 +- .../src/test/resources/ftl/wordpress.ftl | 23 ------------------- ...gProcessor.java => DianpingProcessor.java} | 15 ++++++++---- 6 files changed, 15 insertions(+), 37 deletions(-) delete mode 100644 webmagic-plugin/src/test/resources/ftl/wordpress.ftl rename webmagic-samples/src/main/java/us/codecraft/webmagic/samples/{DianpingBlogProcessor.java => DianpingProcessor.java} (61%) diff --git a/README.md b/README.md index e5dc333eb..421443f0a 100644 --- a/README.md +++ b/README.md @@ -90,8 +90,8 @@ webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: -python爬虫 **scrapy**[https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) +python爬虫 **scrapy** [https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) -Java爬虫 **Spiderman**[https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) +Java爬虫 **Spiderman** [https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index f7f560cb3..6464d6187 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -57,10 +57,6 @@ public Spider startUrl(String startUrl) { return this; } - public Thread thread() { - return new Thread(this); - } - public Spider schedular(Schedular schedular) { this.schedular = schedular; return this; @@ -74,7 +70,7 @@ public Spider pipeline(Pipeline pipeline) { @Override public void run() { - for (String startUrl : pageProcessor.getSite().getStartUrls()) { + for (String startUrl : startUrls) { schedular.push(new Request(startUrl), this); } Request request = schedular.poll(this); diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index 112197113..218276d2e 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -30,7 +30,7 @@ public FreemarkerPipeline(String template, String path) throws IOException { configuration.setDirectoryForTemplateLoading(new File(this.getClass().getClassLoader().getResource("ftl/").getFile())); this.template = configuration.getTemplate(template); this.path = path; - File file = new File(path); + new File(path); } public FreemarkerPipeline(String template) throws IOException { diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java b/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java index 610edf55b..9e6b9958c 100644 --- a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java +++ b/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java @@ -13,7 +13,7 @@ public class FreemarkerPipelineTest { @Test - public void test() throws IOException { + public void testTemplateLoad() throws IOException { FreemarkerPipeline freemarkerPipeline = new FreemarkerPipeline("wordpress.ftl"); } } diff --git a/webmagic-plugin/src/test/resources/ftl/wordpress.ftl b/webmagic-plugin/src/test/resources/ftl/wordpress.ftl deleted file mode 100644 index 61820b727..000000000 --- a/webmagic-plugin/src/test/resources/ftl/wordpress.ftl +++ /dev/null @@ -1,23 +0,0 @@ - - $it.Title - http://127.0.0.1/wordpress/?p=$it.Id - ${date} - admin - http://127.0.0.1/wordpress/?p=$it.Id - - - - <#--$it.Id--> - ${date} - ${date} - open - open - ${title} - publish - 0 - 0 - post - - 0 - $tags - \ No newline at end of file diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java similarity index 61% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index fafb7de25..63aa0f03d 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -2,6 +2,7 @@ import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; import java.util.List; @@ -11,15 +12,14 @@ * Date: 13-4-21 * Time: 下午8:08 */ -public class DianpingBlogProcessor implements PageProcessor { +public class DianpingProcessor implements PageProcessor { @Override public void process(Page page) { - //http://progressdaily.diandian.com/post/2013-01-24/40046867275 - List requests = page.getHtml().rs("]*href=[\"']{1}(/shop/.*?)[\"']{1}").toStrings(); + List requests = page.getHtml().as().rs(".*shop.*").toStrings(); page.addTargetRequests(requests); - requests = page.getHtml().rs("]*href=[\"']{1}(/search/category/.*?)[\"']{1}").toStrings(); + requests = page.getHtml().rs(".*search/category/.*").toStrings(); page.addTargetRequests(requests); - if (page.getUrl().toString().contains("shop")){ + if (page.getUrl().toString().contains("shop")) { page.putField("title", page.getHtml().x("//h1[@class='shop-title']")); page.putField("content", page.getHtml().sc()); } @@ -30,4 +30,9 @@ public Site getSite() { return Site.me().setDomain("www.dianping.com").addStartUrl("http://www.dianping.com/"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } + + public static void main(String[] args) { + DianpingProcessor dianpingProcessor = new DianpingProcessor(); + Spider.me().processor(dianpingProcessor).startUrl("http://www.dianping.com/shanghai/food").run(); + } } From a26b662ed8dfde95c915aaa35caf76b4fdc0b26a Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 22:13:40 +0800 Subject: [PATCH 021/175] update docs --- .../main/java/us/codecraft/webmagic/Page.java | 18 ++++++++++++++---- .../java/us/codecraft/webmagic/Request.java | 2 +- .../main/java/us/codecraft/webmagic/Site.java | 2 +- .../java/us/codecraft/webmagic/Spider.java | 2 +- .../main/java/us/codecraft/webmagic/Task.java | 2 +- .../webmagic/downloader/Downloader.java | 4 ++-- .../downloader/HttpClientDownloader.java | 2 +- .../webmagic/downloader/HttpClientPool.java | 2 +- .../webmagic/pipeline/ConsolePipeline.java | 2 +- .../webmagic/pipeline/FilePipeline.java | 2 +- .../codecraft/webmagic/pipeline/Pipeline.java | 2 +- .../webmagic/processor/PageProcessor.java | 2 +- .../processor/SimplePageProcessor.java | 2 +- .../schedular/FileCacheQueueSchedular.java | 2 +- .../webmagic/schedular/QueueSchedular.java | 2 +- .../webmagic/schedular/Schedular.java | 2 +- .../us/codecraft/webmagic/selector/Html.java | 2 +- .../codecraft/webmagic/selector/PlainText.java | 2 +- .../webmagic/selector/RegexResult.java | 2 +- .../webmagic/selector/RegexSelector.java | 2 +- .../webmagic/selector/ReplaceSelector.java | 2 +- .../webmagic/selector/Selectable.java | 2 +- .../codecraft/webmagic/selector/Selector.java | 2 +- .../webmagic/selector/SelectorFactory.java | 2 +- .../selector/SmartContentSelector.java | 2 +- .../webmagic/selector/XpathSelector.java | 2 +- .../us/codecraft/webmagic/utils/UrlUtils.java | 2 +- .../java/us/codecraft/webmagic/HtmlTest.java | 2 +- .../webmagic/selector/RegexSelectorTest.java | 2 +- .../webmagic/selector/XpathSelectorTest.java | 2 +- .../codecraft/webmagic/utils/UrlUtilsTest.java | 2 +- .../webmagic/pipeline/FreemarkerPipeline.java | 2 +- .../webmagic/FreemarkerPipelineTest.java | 2 +- .../samples/DiandianBlogProcessor.java | 2 +- .../webmagic/samples/DianpingProcessor.java | 2 +- .../webmagic/samples/DiaoyuwengProcessor.java | 2 +- .../webmagic/samples/F58PageProcesser.java | 2 +- .../webmagic/samples/HuxiuProcessor.java | 2 +- .../webmagic/samples/KaichibaProcessor.java | 2 +- .../webmagic/samples/MeicanProcessor.java | 2 +- .../webmagic/samples/NjuBBSProcessor.java | 2 +- .../samples/OschinaBlogPageProcesser.java | 2 +- .../webmagic/samples/OschinaPageProcesser.java | 2 +- .../webmagic/samples/QzoneBlogProcessor.java | 2 +- .../webmagic/samples/SinaBlogProcesser.java | 2 +- .../webmagic/samples/TianyaPageProcesser.java | 2 +- .../java/us/codecraft/webmagic/SpiderTest.java | 2 +- .../processor/DiandianProcessorTest.java | 2 +- .../processor/DiaoyuwengProcessorTest.java | 2 +- .../processor/SinablogProcessorTest.java | 2 +- 50 files changed, 64 insertions(+), 54 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index eee1a8a74..ec9f959e8 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -10,10 +10,16 @@ import java.util.concurrent.ConcurrentHashMap; /** - * Page保存了抓取的结果,并可定义下一次抓取的链接内容。 - * Author: code4crafter@gmail.com - * Date: 13-4-21 - * Time: 上午11:22 + *
      + *Page保存了上一次抓取的结果,并可定义待抓取的链接内容。
      + *
      + *     主要方法:
      + *     {@link #getUrl()} 获取页面的Url
      + *     {@link #getHtml()}  获取页面的html内容
      + *     {@link #addTargetRequests(java.util.List)} {@link #addTargetRequest(String)} 添加待抓取的链接
      + *
      + * 
      + * @author code4crafter@gmail.com
      */ public class Page { @@ -34,6 +40,10 @@ public void process() { public Page() { } + /** + * + * @return fields + */ public Map getFields() { return fields; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index ecb8b4ef9..37ede0dc4 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -17,7 +17,7 @@ * String linktext = (String)page.getRequest().getExtra()[0]; * } * - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午11:37 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index a4d88d895..5c208dd04 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -4,7 +4,7 @@ /** * Site定义一个待抓取的站点的各种信息。 - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:13 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 6464d6187..67e9c94d5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -14,7 +14,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午6:53 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java index 0eaf6c95c..2aab74a63 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic; /** - * Author: code4crafer@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-6-18 * Time: 下午2:57 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java index f276fde2b..e3ecff879 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java @@ -6,7 +6,7 @@ /** * Downloader是webmagic下载页面的接口。webmagic默认使用了HttpComponent作为下载器,一般情况,你无需自己实现这个接口。 - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:14 */ @@ -17,7 +17,7 @@ public interface Downloader { * * @param request * @param site - * @return + * @return page */ public Page download(Request request, Site site); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index 2eb55c0ab..4332fa329 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -14,7 +14,7 @@ /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:15 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java index 891ff188b..4e57e16f9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java @@ -18,7 +18,7 @@ import java.util.Map; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:29 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 7b93876dc..866db9239 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -7,7 +7,7 @@ import java.util.Map; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:45 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 2311a75dd..c7cd9c56a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -12,7 +12,7 @@ import java.util.Map; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午6:28 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java index b2b51e0ae..1be447c45 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Task; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:39 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java index 982005974..c36ae980d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Site; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午11:42 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index 9f4eed36f..3ffc9a32e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-22 * Time: 下午9:15 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java index 882f49824..0a93e52db 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java @@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:13 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java index 8c3da3b00..20576fc7c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java @@ -10,7 +10,7 @@ import java.util.concurrent.LinkedBlockingQueue; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:13 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java index 8e4edb420..8df776040 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Task; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:12 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 22bf73d69..3b3c80af9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -4,7 +4,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:54 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index 1d7a41e5d..a11c9a293 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -6,7 +6,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:54 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java index 06c00dd1c..9f4e2f060 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.selector; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:39 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java index 3b9871892..49fbffd0b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java @@ -9,7 +9,7 @@ import java.util.regex.PatternSyntaxException; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:09 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java index e240f0898..1ce7c4d59 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java @@ -6,7 +6,7 @@ import java.util.regex.PatternSyntaxException; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:09 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index f02cbc4c0..921e6c3f4 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -3,7 +3,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-20 * Time: 下午7:51 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java index 3e1b056e1..35632b3aa 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java @@ -3,7 +3,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-20 * Time: 下午8:02 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java index 633cb4abf..3c87ac9c4 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java @@ -7,7 +7,7 @@ import java.util.concurrent.ConcurrentHashMap; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:56 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java index 919a795b3..89748975d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SmartContentSelector.java @@ -10,7 +10,7 @@ /** * readability算法,基础是找到所有p标签的父节点 * 写的比较乱,最终效果还在尝试中 - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午4:42 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java index 991f92674..c2b408eb3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java @@ -6,7 +6,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午9:39 */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java index fd26499ce..74e486c7f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java @@ -6,7 +6,7 @@ import java.util.regex.Pattern; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:52 */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java index 0f8c06166..6dacc9833 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.selector.Html; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午8:42 */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java index 3b80f92dc..849a4d6e5 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/RegexSelectorTest.java @@ -4,7 +4,7 @@ import org.junit.Test; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:13 */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 239630a93..8ee888597 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -4,7 +4,7 @@ import org.junit.Test; /** - * Author: code4crafter@gmail.com Date: 13-4-21 Time: 上午10:06 + * @author code4crafter@gmail.com
      Date: 13-4-21 Time: 上午10:06 */ public class XpathSelectorTest { diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java index 36361bfe7..4cfdc046b 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java @@ -4,7 +4,7 @@ import org.junit.Test; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午2:22 */ diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index 218276d2e..f512f2628 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -13,7 +13,7 @@ import java.io.PrintWriter; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-6-8 * Time: 下午9:00 */ diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java b/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java index 9e6b9958c..68ff90464 100644 --- a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java +++ b/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java @@ -6,7 +6,7 @@ import java.io.IOException; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-6-9 * Time: 上午7:14 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java index a9351a1be..a5b355cb1 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index 63aa0f03d..2f28e6a39 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -8,7 +8,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java index 8d64bbca5..f5032ff75 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java @@ -8,7 +8,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java index 82db2dd7a..385e3f278 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java index 36f69466f..1fa0b7b55 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java index 11f046271..8ea4afe27 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.processor.PageProcessor; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-5-20 * Time: 下午5:31 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java index aaeca8f88..98fe8de7d 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-5-20 * Time: 下午5:31 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java index 58e19c4ea..e4cc33cfc 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java index bcc2d6eec..0d6354d8a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java index d85ca8142..b708ec51d 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java index fac491dfd..400ebd5ec 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午8:08 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java index 37c686490..5bc2fc68a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.processor.PageProcessor; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java index db5f9ff21..a15ef74a2 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java @@ -7,7 +7,7 @@ import java.util.List; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:48 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index b67ffc4b7..6293884c1 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -8,7 +8,7 @@ import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-4-20 * Time: 下午7:46 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 721a5eb86..b87815c4d 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -11,7 +11,7 @@ import java.io.IOException; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-6-9 * Time: 上午8:02 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 8f03b6a8a..2b2caaca1 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -11,7 +11,7 @@ import java.io.IOException; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-6-9 * Time: 上午8:02 */ diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index 8fb258378..9613c9e4e 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -11,7 +11,7 @@ import java.io.IOException; /** - * Author: code4crafter@gmail.com + * @author code4crafter@gmail.com
      * Date: 13-6-9 * Time: 上午8:02 */ From 4d7b2753980b54b41a2bb7ae25d0c9c0b96fba39 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 18 Jun 2013 22:39:37 +0800 Subject: [PATCH 022/175] docs --- .../main/java/us/codecraft/webmagic/Page.java | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index ec9f959e8..5bf5f26ed 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -16,6 +16,8 @@ * 主要方法: * {@link #getUrl()} 获取页面的Url * {@link #getHtml()} 获取页面的html内容 + * {@link #putField(String, us.codecraft.webmagic.selector.Selectable)} 保存抽取的结果 + * {@link #getFields()} 获取抽取的结果,在 {@link us.codecraft.webmagic.pipeline.Pipeline} 中调用 * {@link #addTargetRequests(java.util.List)} {@link #addTargetRequest(String)} 添加待抓取的链接 * * @@ -33,25 +35,30 @@ public class Page { private List targetRequests = new ArrayList(); - public void process() { - fields.put("title", html.x("").r("")); - } - public Page() { } /** - * - * @return fields + * 获取抽取的结果,在{@link us.codecraft.webmagic.pipeline.Pipeline} 中调用 + * @return fields 抽取的结果 */ public Map getFields() { return fields; } + /** + * 保存抽取的结果 + * @param key 结果的key + * @param field 结果的value + */ public void putField(String key, Selectable field) { fields.put(key, field); } + /** + * 获取页面的html内容 + * @return html 页面的html内容 + */ public Selectable getHtml() { return html; } @@ -64,6 +71,10 @@ public List getTargetRequests() { return targetRequests; } + /** + * 添加待抓取的链接 + * @param requests 待抓取的链接 + */ public void addTargetRequests(List requests) { synchronized (targetRequests) { for (String s : requests) { @@ -76,6 +87,10 @@ public void addTargetRequests(List requests) { } } + /** + * 添加待抓取的链接 + * @param requestString 待抓取的链接 + */ public void addTargetRequest(String requestString) { if (StringUtils.isBlank(requestString) || requestString.equals("#")) { return; @@ -86,20 +101,36 @@ public void addTargetRequest(String requestString) { } } + /** + * 添加待抓取的页面,在需要传递附加信息时使用 + * @param request 待抓取的页面 + */ public void addTargetRequest(Request request) { synchronized (targetRequests) { targetRequests.add(request); } } + /** + * 获取页面的Url + * @return url 当前页面的url,可用于抽取 + */ public Selectable getUrl() { return url; } + /** + * 设置url + * @param url + */ public void setUrl(Selectable url) { this.url = url; } + /** + * 获取抓取请求 + * @return request 抓取请求 + */ public Request getRequest() { return request; } From e550b72bfccda65c6f5b6f25b1855619d7b7de73 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 19 Jun 2013 08:20:21 +0800 Subject: [PATCH 023/175] add package infos --- .../main/java/us/codecraft/webmagic/downloader/package.html | 5 +++++ .../src/main/java/us/codecraft/webmagic/package.html | 5 +++++ .../main/java/us/codecraft/webmagic/pipeline/package.html | 5 +++++ .../main/java/us/codecraft/webmagic/processor/package.html | 5 +++++ .../main/java/us/codecraft/webmagic/schedular/package.html | 5 +++++ .../main/java/us/codecraft/webmagic/selector/Selector.java | 2 +- .../main/java/us/codecraft/webmagic/selector/package.html | 5 +++++ .../src/main/java/us/codecraft/webmagic/utils/package.html | 5 +++++ 8 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/downloader/package.html create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/package.html create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/package.html create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/processor/package.html create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/selector/package.html create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/utils/package.html diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/package.html new file mode 100644 index 000000000..cae5560ea --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/package.html @@ -0,0 +1,5 @@ + + +包含了页面下载的接口Downloader和实现类HttpClientDownloader,该实现类封装了HttpComponent库。 + + diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/package.html new file mode 100644 index 000000000..d5ff540a6 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/package.html @@ -0,0 +1,5 @@ + + +包括webmagic入口类Spider和一些数据传递的实体类。 + + diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/package.html new file mode 100644 index 000000000..498183ebd --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/package.html @@ -0,0 +1,5 @@ + + +包含了处理页面抽取结果的接口Pipeline和它的几个实现类。 + + diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/package.html new file mode 100644 index 000000000..47274a1fd --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/package.html @@ -0,0 +1,5 @@ + + +包含了封装页面处理逻辑的接口PageProcessor和一个实现类SimplePageProcessor。实现PageProcessor即可定制一个自己的爬虫。 + + diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html new file mode 100644 index 000000000..0e35610fe --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html @@ -0,0 +1,5 @@ + + +包含url管理和调度的接口Schedular及它的几个实现类。 + + diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java index 35632b3aa..f7771cfbd 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java @@ -7,7 +7,7 @@ * Date: 13-4-20 * Time: 下午8:02 */ -public interface Selector { +interface Selector { public String select(String text); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/package.html new file mode 100644 index 000000000..3c9ef7b25 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/package.html @@ -0,0 +1,5 @@ + + +提供了便捷抽取页面内容的工具,对外核心接口是Selectable,内部抽取则是通过实现Selector来定制。 + + diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/package.html new file mode 100644 index 000000000..bfbe8dfcd --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/package.html @@ -0,0 +1,5 @@ + + +提供一些处理链接的静态工具类。 + + From 9762834e60b88a6efef16696a86c6a8170c8c22c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 19 Jun 2013 09:57:41 +0800 Subject: [PATCH 024/175] update Select api: remove x() s() etc. --- .../downloader/HttpClientDownloader.java | 2 +- .../processor/SimplePageProcessor.java | 6 ++-- .../us/codecraft/webmagic/selector/Html.java | 18 ++-------- .../webmagic/selector/PlainText.java | 26 +++----------- .../webmagic/selector/Selectable.java | 34 +++---------------- .../java/us/codecraft/webmagic/HtmlTest.java | 2 +- .../webmagic/selector/XpathSelectorTest.java | 2 +- .../samples/DiandianBlogProcessor.java | 16 ++++----- .../webmagic/samples/DianpingProcessor.java | 8 ++--- .../webmagic/samples/DiaoyuwengProcessor.java | 12 +++---- .../webmagic/samples/F58PageProcesser.java | 6 ++-- .../webmagic/samples/HuxiuProcessor.java | 6 ++-- .../webmagic/samples/KaichibaProcessor.java | 6 ++-- .../webmagic/samples/MeicanProcessor.java | 8 ++--- .../webmagic/samples/NjuBBSProcessor.java | 6 ++-- .../samples/OschinaBlogPageProcesser.java | 8 ++--- .../samples/OschinaPageProcesser.java | 6 ++-- .../webmagic/samples/QzoneBlogProcessor.java | 6 ++-- .../webmagic/samples/SinaBlogProcesser.java | 12 +++---- .../webmagic/samples/TianyaPageProcesser.java | 6 ++-- .../us/codecraft/webmagic/SpiderTest.java | 6 ++-- 21 files changed, 75 insertions(+), 127 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index 4332fa329..c1ecff3e8 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -33,7 +33,7 @@ public Page download(Request request, Site site) { if (site.getAcceptStatCode().contains(statusCode)) { if (site.getEncoding() == null){ String value = httpResponse.getEntity().getContentType().getValue(); - site.setEncoding(new PlainText(value).r("charset=([^\\s]+)").toString()); + site.setEncoding(new PlainText(value).regex("charset=([^\\s]+)").toString()); } String content = IOUtils.toString(httpResponse.getEntity().getContent(), site.getEncoding()); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index 3ffc9a32e..0d5244629 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -28,13 +28,13 @@ public SimplePageProcessor(String startUrl, String urlPattern) { @Override public void process(Page page) { - List requests = page.getHtml().as().rs(urlPattern).toStrings(); + List requests = page.getHtml().links().regex(urlPattern).toStrings(); //调用page.addTargetRequests()方法添加待抓取链接 page.addTargetRequests(requests); //xpath方式抽取 - page.putField("title", page.getHtml().x("//title")); + page.putField("title", page.getHtml().xpath("//title")); //sc表示使用Readability技术抽取正文 - page.putField("content", page.getHtml().sc()); + page.putField("content", page.getHtml().smartContent()); } @Override diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 3b3c80af9..3cc84f79e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -18,12 +18,6 @@ public Html(String text) { super(text); } - @Override - public Selectable x(String xpath) { - XpathSelector xpathSelector = SelectorFactory.getInstatnce().newXpathSelector(xpath); - return select(xpathSelector,strings); - } - @Override protected Selectable select(Selector selector, List strings) { List results = new ArrayList(); @@ -47,25 +41,19 @@ protected Selectable selectList(Selector selector, List strings) { } @Override - public Selectable sc() { + public Selectable smartContent() { SmartContentSelector smartContentSelector = SelectorFactory.getInstatnce().newSmartContentSelector(); return select(smartContentSelector,strings); } @Override - public Selectable a() { - XpathSelector xpathSelector = SelectorFactory.getInstatnce().newXpathSelector("//a/@href"); - return select(xpathSelector,strings); - } - - @Override - public Selectable as() { + public Selectable links() { XpathSelector xpathSelector = SelectorFactory.getInstatnce().newXpathSelector("//a/@href"); return selectList(xpathSelector,strings); } @Override - public Selectable xs(String xpath) { + public Selectable xpath(String xpath) { XpathSelector xpathSelector = SelectorFactory.getInstatnce().newXpathSelector(xpath); return selectList(xpathSelector, strings); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index a11c9a293..935ababa3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -25,38 +25,22 @@ public PlainText(String text) { } @Override - public Selectable x(String xpath) { + public Selectable xpath(String xpath) { throw new UnsupportedOperationException(); } @Override - public Selectable xs(String xpath) { + public Selectable smartContent() { throw new UnsupportedOperationException(); } @Override - public Selectable sc() { + public Selectable links() { throw new UnsupportedOperationException(); } @Override - public Selectable a() { - throw new UnsupportedOperationException(); - } - - @Override - public Selectable as() { - throw new UnsupportedOperationException(); - } - - @Override - public Selectable r(String regex) { - RegexSelector regexSelector = SelectorFactory.getInstatnce().newRegexSelector(regex); - return select(regexSelector, strings); - } - - @Override - public Selectable rs(String regex) { + public Selectable regex(String regex) { RegexSelector regexSelector = SelectorFactory.getInstatnce().newRegexSelector(regex); return selectList(regexSelector, strings); } @@ -82,7 +66,7 @@ protected Selectable selectList(Selector selector, List strings) { } @Override - public Selectable rp(String regex, String replacement) { + public Selectable replace(String regex, String replacement) { ReplaceSelector replaceSelector = SelectorFactory.getInstatnce().newReplaceSelector(regex, replacement); return select(replaceSelector, strings); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 921e6c3f4..630808d3b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -9,51 +9,27 @@ */ public interface Selectable { - /** - * select with xpath - * - * @param xpath - * @return new Selectable after extract - */ - public Selectable x(String xpath); - /** * select list with xpath * * @param xpath * @return new Selectable after extract */ - public Selectable xs(String xpath); + public Selectable xpath(String xpath); /** * select smart content with ReadAbility algorithm * * @return content */ - public Selectable sc(); - - /** - * select a link - * - * @return first link - */ - public Selectable a(); + public Selectable smartContent(); /** * select all links * * @return all links */ - public Selectable as(); - - - /** - * select with regex - * - * @param regex - * @return new Selectable after extract - */ - public Selectable r(String regex); + public Selectable links(); /** * select list with regex @@ -61,7 +37,7 @@ public interface Selectable { * @param regex * @return new Selectable after extract */ - public Selectable rs(String regex); + public Selectable regex(String regex); /** * replace with regex @@ -70,7 +46,7 @@ public interface Selectable { * @param replacement * @return new Selectable after extract */ - public Selectable rp(String regex, String replacement); + public Selectable replace(String regex, String replacement); /** * single string result diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java index 6dacc9833..fcdbfeffa 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java @@ -14,7 +14,7 @@ public class HtmlTest { @Test public void testRegexSelector() { Html selectable = new Html("aaaaaaab"); - Assert.assertEquals("abbabbab", (selectable.r("(.*)").rp("aa(a)", "$1bb").toString())); + Assert.assertEquals("abbabbab", (selectable.regex("(.*)").replace("aa(a)", "$1bb").toString())); } } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 8ee888597..bebbb83dc 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1350,7 +1350,7 @@ public void test() { @Test public void testOschina() { Html html1 = new Html(html); - Assert.assertEquals("再次吐槽easyui", html1.x(".//*[@class='QTitle']/h1/a").toString()); + Assert.assertEquals("再次吐槽easyui", html1.xpath(".//*[@class='QTitle']/h1/a").toString()); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java index a5b355cb1..e5aafe7a3 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java @@ -17,20 +17,20 @@ public class DiandianBlogProcessor implements PageProcessor { @Override public void process(Page page) { - //a()表示提取链接,as()表示提取所有链接 + //a()表示提取链接,links()表示提取所有链接 //getHtml()返回Html对象,支持链式调用 - //r()表示用正则表达式提取一条内容,rs()表示提取多条内容 + //r()表示用正则表达式提取一条内容,regex()表示提取多条内容 //toString()表示取单条结果,toStrings()表示取多条 - List requests = page.getHtml().as().rs("(.*/post/.*)").toStrings(); + List requests = page.getHtml().links().regex("(.*/post/.*)").toStrings(); //使用page.addTargetRequests()方法将待抓取的链接加入队列 page.addTargetRequests(requests); //page.putField(key,value)将抽取的内容加入结果Map //x()和xs()使用xpath进行抽取 - page.putField("title", page.getHtml().x("//title").r("(.*?)\\|")); - //sc()使用readability技术直接抽取正文,对于规整的文本有比较好的抽取正确率 - page.putField("content", page.getHtml().sc()); - page.putField("date", page.getUrl().r("post/(\\d+-\\d+-\\d+)/")); - page.putField("id", page.getUrl().r("post/\\d+-\\d+-\\d+/(\\d+)")); + page.putField("title", page.getHtml().xpath("//title").regex("(.*?)\\|")); + //smartContent()使用readability技术直接抽取正文,对于规整的文本有比较好的抽取正确率 + page.putField("content", page.getHtml().smartContent()); + page.putField("date", page.getUrl().regex("post/(\\d+-\\d+-\\d+)/")); + page.putField("id", page.getUrl().regex("post/\\d+-\\d+-\\d+/(\\d+)")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index 2f28e6a39..7a211882e 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -15,13 +15,13 @@ public class DianpingProcessor implements PageProcessor { @Override public void process(Page page) { - List requests = page.getHtml().as().rs(".*shop.*").toStrings(); + List requests = page.getHtml().links().regex(".*shop.*").toStrings(); page.addTargetRequests(requests); - requests = page.getHtml().rs(".*search/category/.*").toStrings(); + requests = page.getHtml().regex(".*search/category/.*").toStrings(); page.addTargetRequests(requests); if (page.getUrl().toString().contains("shop")) { - page.putField("title", page.getHtml().x("//h1[@class='shop-title']")); - page.putField("content", page.getHtml().sc()); + page.putField("title", page.getHtml().xpath("//h1[@class='shop-title']")); + page.putField("content", page.getHtml().smartContent()); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java index f5032ff75..13ed2e115 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java @@ -18,15 +18,15 @@ public class DiaoyuwengProcessor implements PageProcessor { @Override public void process(Page page) { - List requests = page.getHtml().as().rs("(http://www\\.diaoyuweng\\.com/home\\.php\\?mod=space&uid=88304&do=thread&view=me&type=thread&order=dateline&from=space&page=\\d+)").toStrings(); + List requests = page.getHtml().links().regex("(http://www\\.diaoyuweng\\.com/home\\.php\\?mod=space&uid=88304&do=thread&view=me&type=thread&order=dateline&from=space&page=\\d+)").toStrings(); page.addTargetRequests(requests); - requests = page.getHtml().as().rs("(http://www\\.diaoyuweng\\.com/thread-\\d+-1-1.html)").toStrings(); + requests = page.getHtml().links().regex("(http://www\\.diaoyuweng\\.com/thread-\\d+-1-1.html)").toStrings(); page.addTargetRequests(requests); if (page.getUrl().toString().contains("thread")){ - page.putField("title", page.getHtml().x("//a[@id='thread_subject']")); - page.putField("content", page.getHtml().x("//div[@class='pcb']//tbody")); - page.putField("date",page.getHtml().r("发表于 (\\d{4}-\\d+-\\d+ \\d+:\\d+:\\d+)")); - page.putField("id",new PlainText("1000"+page.getUrl().r("http://www\\.diaoyuweng\\.com/thread-(\\d+)-1-1.html").toString())); + page.putField("title", page.getHtml().xpath("//a[@id='thread_subject']")); + page.putField("content", page.getHtml().xpath("//div[@class='pcb']//tbody")); + page.putField("date",page.getHtml().regex("发表于 (\\d{4}-\\d+-\\d+ \\d+:\\d+:\\d+)")); + page.putField("id",new PlainText("1000"+page.getUrl().regex("http://www\\.diaoyuweng\\.com/thread-(\\d+)-1-1.html").toString())); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java index 385e3f278..9d5140a2e 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java @@ -15,10 +15,10 @@ public class F58PageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().rs("]*href=[\"']{1}(/yewu/.*?)[\"']{1}").toStrings(); + List strings = page.getHtml().regex("]*href=[\"']{1}(/yewu/.*?)[\"']{1}").toStrings(); page.addTargetRequests(strings); - page.putField("title",page.getHtml().r("(.*)")); - page.putField("body",page.getHtml().x("//dd[@class='w133']")); + page.putField("title",page.getHtml().regex("(.*)")); + page.putField("body",page.getHtml().xpath("//dd[@class='w133']")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java index 1fa0b7b55..26c60cc27 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java @@ -15,10 +15,10 @@ public class HuxiuProcessor implements PageProcessor { @Override public void process(Page page) { //http://progressdaily.diandian.com/post/2013-01-24/40046867275 - List requests = page.getHtml().rs("\"']*href=[\"']{1}([/]{0,1}article[^<>#\"']*?)[\"']{1}").toStrings(); + List requests = page.getHtml().regex("\"']*href=[\"']{1}([/]{0,1}article[^<>#\"']*?)[\"']{1}").toStrings(); page.addTargetRequests(requests); - page.putField("title",page.getHtml().x("//div[@class='neirong']//h1[@class='ph xs5']")); - page.putField("content",page.getHtml().sc()); + page.putField("title",page.getHtml().xpath("//div[@class='neirong']//h1[@class='ph xs5']")); + page.putField("content",page.getHtml().smartContent()); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java index 8ea4afe27..0a51b364e 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java @@ -13,10 +13,10 @@ public class KaichibaProcessor implements PageProcessor { @Override public void process(Page page) { //http://progressdaily.diandian.com/post/2013-01-24/40046867275 - int i = Integer.valueOf(page.getUrl().r("shop/(\\d+)").toString()) + 1; + int i = Integer.valueOf(page.getUrl().regex("shop/(\\d+)").toString()) + 1; page.addTargetRequest("http://kaichiba.com/shop/" + i); - page.putField("title",page.getHtml().x("//Title")); - page.putField("items", page.getHtml().xs("//li[@class=\"foodTitle\"]").rp("^\\s+", "").rp("\\s+$", "").rp(".*?", "")); + page.putField("title",page.getHtml().xpath("//Title")); + page.putField("items", page.getHtml().xpath("//li[@class=\"foodTitle\"]").replace("^\\s+", "").replace("\\s+$", "").replace(".*?", "")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java index 98fe8de7d..bd218113b 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java @@ -15,14 +15,14 @@ public class MeicanProcessor implements PageProcessor { @Override public void process(Page page) { //http://progressdaily.diandian.com/post/2013-01-24/40046867275 - List requests = page.getHtml().xs("//a[@class=\"area_link flat_btn\"]/@href").toStrings(); + List requests = page.getHtml().xpath("//a[@class=\"area_link flat_btn\"]/@href").toStrings(); if (requests.size() > 2) { requests = requests.subList(0, 2); } page.addTargetRequests(requests); - page.addTargetRequests(page.getHtml().as().rs("(.*/restaurant/[^#]+)").toStrings()); - page.putField("items", page.getHtml().xs("//ul[@class=\"dishes menu_dishes\"]/li/span[@class=\"name\"]")); - page.putField("prices", page.getHtml().xs("//ul[@class=\"dishes menu_dishes\"]/li/span[@class=\"price_outer\"]/span[@class=\"price\"]")); + page.addTargetRequests(page.getHtml().links().regex("(.*/restaurant/[^#]+)").toStrings()); + page.putField("items", page.getHtml().xpath("//ul[@class=\"dishes menu_dishes\"]/li/span[@class=\"name\"]")); + page.putField("prices", page.getHtml().xpath("//ul[@class=\"dishes menu_dishes\"]/li/span[@class=\"price_outer\"]/span[@class=\"price\"]")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java index e4cc33cfc..a7e9c9ba9 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java @@ -14,10 +14,10 @@ public class NjuBBSProcessor implements PageProcessor { @Override public void process(Page page) { - List requests = page.getHtml().rs("]*href=(bbstcon\\?board=Pictures&file=[^>]*)").toStrings(); + List requests = page.getHtml().regex("]*href=(bbstcon\\?board=Pictures&file=[^>]*)").toStrings(); page.addTargetRequests(requests); - page.putField("title",page.getHtml().x("//div[@id='content']//h2/a")); - page.putField("content",page.getHtml().sc()); + page.putField("title",page.getHtml().xpath("//div[@id='content']//h2/a")); + page.putField("content",page.getHtml().smartContent()); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java index 0d6354d8a..9293b41c4 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java @@ -15,11 +15,11 @@ public class OschinaBlogPageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().as().r("(http://my\\.oschina\\.net)").toStrings(); + List strings = page.getHtml().links().regex("(http://my\\.oschina\\.net)").toStrings(); page.addTargetRequests(strings); - page.putField("title", page.getHtml().xs("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1")); - page.putField("content", page.getHtml().sc()); - page.putField("author", page.getUrl().r("my\\.oschina\\.net/(\\w+)/blog/\\d+")); + page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1")); + page.putField("content", page.getHtml().smartContent()); + page.putField("author", page.getUrl().regex("my\\.oschina\\.net/(\\w+)/blog/\\d+")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java index b708ec51d..f88ce06d2 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java @@ -15,10 +15,10 @@ public class OschinaPageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().rs("]*href=[\"']{1}(http://www\\.oschina\\.net/question/[\\w]+)[\"']{1}").toStrings(); + List strings = page.getHtml().regex("]*href=[\"']{1}(http://www\\.oschina\\.net/question/[\\w]+)[\"']{1}").toStrings(); page.addTargetRequests(strings); - page.putField("title", page.getHtml().x("//div[@class='QTitle']/h1/a")); - page.putField("content", page.getHtml().xs("//div[@class='Question']//div[@class='Content']/div[@class='detail']")); + page.putField("title", page.getHtml().xpath("//div[@class='QTitle']/h1/a")); + page.putField("content", page.getHtml().xpath("//div[@class='Question']//div[@class='Content']/div[@class='detail']")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java index 400ebd5ec..bf4dcc2a1 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java @@ -18,10 +18,10 @@ public void process(Page page) { //http://b1.cnc.qzone.qq.com/cgi-bin/blognew/get_abs?hostUin=233017404&uin=233017404&blogType=0&statYear=2013&source=0&statYear=2013&g_tk=291639571&g_tk=291639571&reqInfo=7&pos=0&num=15&source=0&rand=0.46480297949165106 // &cateName=&cateHex=&statYear=2013&reqInfo=7&pos=0&num=15&sortType=0&source=0&rand=0.46480297949165106&g_tk=291639571&verbose=1&ref=qzone - List requests = page.getHtml().rs("]*href=[\"']{1}(http://17dujingdian\\.com/post/[^#]*?)[\"']{1}").toStrings(); + List requests = page.getHtml().regex("]*href=[\"']{1}(http://17dujingdian\\.com/post/[^#]*?)[\"']{1}").toStrings(); page.addTargetRequests(requests); - page.putField("title",page.getHtml().x("//div[@id='content']//h2/a")); - page.putField("content",page.getHtml().sc()); + page.putField("title",page.getHtml().xpath("//div[@id='content']//h2/a")); + page.putField("content",page.getHtml().smartContent()); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java index 5bc2fc68a..bb77931fe 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java @@ -15,12 +15,12 @@ public class SinaBlogProcesser implements PageProcessor { @Override public void process(Page page) { - page.addTargetRequests(page.getHtml().as().rs("(http://blog\\.sina\\.com\\.cn/s/blog_.*)").toStrings()); - page.putField("title", page.getHtml().x("//div[@class='articalTitle']/h2")); - page.putField("content",page.getHtml().x("//div[@id='articlebody']//div[@class='articalContent']")); - page.putField("id",page.getUrl().r("http://blog\\.sina\\.com\\.cn/s/blog_(\\w+)")); - page.putField("date",page.getHtml().x("//div[@id='articlebody']//span[@class='time SG_txtc']").r("\\((.*)\\)")); -// page.putField("tags",page.getHtml().xs("//td[@class='blog_tag']/h3/a")); + page.addTargetRequests(page.getHtml().links().regex("(http://blog\\.sina\\.com\\.cn/s/blog_.*)").toStrings()); + page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2")); + page.putField("content",page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']")); + page.putField("id",page.getUrl().regex("http://blog\\.sina\\.com\\.cn/s/blog_(\\w+)")); + page.putField("date",page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)")); +// page.putField("tags",page.getHtml().xpath("//td[@class='blog_tag']/h3/a")); } @Override diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java index a15ef74a2..278657f09 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java @@ -15,10 +15,10 @@ public class TianyaPageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().rs("]*href=[\"']{1}(/post-free.*?\\.shtml)[\"']{1}").toStrings(); + List strings = page.getHtml().regex("]*href=[\"']{1}(/post-free.*?\\.shtml)[\"']{1}").toStrings(); page.addTargetRequests(strings); - page.putField("title", page.getHtml().x("//div[@id='post_head']//span[@class='s_title']//b")); - page.putField("body",page.getHtml().sc()); + page.putField("title", page.getHtml().xpath("//div[@id='post_head']//span[@class='s_title']//b")); + page.putField("body",page.getHtml().smartContent()); } @Override diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 6293884c1..681aac78e 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -51,7 +51,7 @@ public void languageSchema() { /** * - * _hrefs = rs("]*href=[\"']{1}(/yewu/.*?)[\"']{1}") + * _hrefs = regex("]*href=[\"']{1}(/yewu/.*?)[\"']{1}") * title = r(""(.*)"") * body = x("//dd[@class='w133']") * @@ -72,7 +72,7 @@ public void languageSchema() { * body[r(_currentUrl).g(1)] = body[r(_currentUrl).g(1)] + (x("").r("",1,2).c()) * * body=body[r(_currentUrl).g(1)] - * tags[%] = (tags[%] + xs('')) . r('') + * tags[%] = (tags[%] + xpath('')) . r('') * * _targetUrls.add('' + x('').r('')) * _sourceUrls.add() @@ -114,7 +114,7 @@ public void languageSchema() { * content = t(_html) > c() * title = x(_html, 'asd@asd') > r('',1) * body[r(_currentUrl).g(1)] = body[r(_currentUrl).g(1)] + (x('') > r('',1,2) > c()) | x('') - * tags[%] = tags + xs('') > r('') + * tags[%] = tags + xpath('') > r('') * model.setTargetUrl(); * * _targetUrl = '' + x('') & r('') From 6611d6e64f3b86152bfaf5832fd1c09190a0c0e3 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 19 Jun 2013 10:14:17 +0800 Subject: [PATCH 025/175] update api in READEME --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 421443f0a..2b687e6bc 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参 * ####垂直爬虫#### webmagic着重于页面抽取的工作。开发者可以使用xpath和正则表达式进行链接和内容的提取,支持链式API调用,以及单复数转换。 - String content = page.getHtml().x("//div[@class='body']").r("这段话比较重要(.*)").toString(); + String content = page.getHtml().xpath("//div[@class='body']").regex("这段话比较重要(.*)").toString(); * ####嵌入式&无配置#### webmagic与其他Full-Stack的框架不同,没有配置文件,大部分功能都通过简单的API调用完成。webmagic以jar包的形式存在,并且不依赖任何框架,在程序可以随处进行调用。 @@ -57,13 +57,13 @@ webmagic定制的核心是PageProcessor接口。 @Override public void process(Page page) { - List requests = page.getHtml().as().rs(urlPattern).toStrings(); + List requests = page.getHtml().links().regex(urlPattern).toStrings(); //调用page.addTargetRequests()方法添加待抓取链接 page.addTargetRequests(requests); //xpath方式抽取 - page.putField("title", page.getHtml().x("//title")); + page.putField("title", page.getHtml().xpath("//title")); //sc表示使用Readability技术抽取正文 - page.putField("content", page.getHtml().sc()); + page.putField("content", page.getHtml().smartContent()); } @Override From 6ede0e1b053808008339bb3d838514017e6156df Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 07:53:48 +0800 Subject: [PATCH 026/175] update Spider api --- .../main/java/us/codecraft/webmagic/Site.java | 114 +++++++++++++++--- .../java/us/codecraft/webmagic/Spider.java | 45 +++---- ...ular.java => FileCacheQueueScheduler.java} | 4 +- ...ueueSchedular.java => QueueScheduler.java} | 2 +- .../{Schedular.java => Scheduler.java} | 2 +- .../us/codecraft/webmagic/selector/Html.java | 14 ++- .../webmagic/selector/PlainText.java | 4 + .../downloader/HttpClientDownloaderTest.java | 2 +- .../webmagic/samples/DianpingProcessor.java | 2 +- .../us/codecraft/webmagic/SpiderTest.java | 10 +- .../processor/DiandianProcessorTest.java | 6 +- .../processor/DiaoyuwengProcessorTest.java | 10 +- .../processor/SinablogProcessorTest.java | 10 +- 13 files changed, 161 insertions(+), 64 deletions(-) rename webmagic-core/src/main/java/us/codecraft/webmagic/schedular/{FileCacheQueueSchedular.java => FileCacheQueueScheduler.java} (97%) rename webmagic-core/src/main/java/us/codecraft/webmagic/schedular/{QueueSchedular.java => QueueScheduler.java} (94%) rename webmagic-core/src/main/java/us/codecraft/webmagic/schedular/{Schedular.java => Scheduler.java} (90%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 5c208dd04..f9e0fd611 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -3,10 +3,12 @@ import java.util.*; /** - * Site定义一个待抓取的站点的各种信息。 + * Site定义一个待抓取的站点的各种信息。
      + * 这个类的所有getter方法,一般都只会被爬虫框架内部进行调用。
      + * * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午12:13 + * Date: 13-4-21 + * Time: 下午12:13 */ public class Site { @@ -30,73 +32,157 @@ public class Site { DEFAULT_STATUS_CODE_SET.add(200); } + /** + * 创建一个Site对象,等价于new Site() + * + * @return 新建的对象 + */ public static Site me() { return new Site(); } - public Site setCookie(String name, String value) { + /** + * 为这个站点添加一个cookie,可用于抓取某些需要登录访问的站点。这个cookie的域名与{@link #getDomain()}是一致的 + * + * @param name cookie的名称 + * @param value cookie的值 + * @return this + */ + public Site addCookie(String name, String value) { cookies.put(name, value); return this; } + /** + * 为这个站点设置user-agent,很多网站都对user-agent进行了限制,不设置此选项可能会得到期望之外的结果。 + * + * @param userAgent userAgent + * @return this + */ public Site setUserAgent(String userAgent) { this.userAgent = userAgent; return this; } + /** + * 获取已经设置的所有cookie + * + * @return 已经设置的所有cookie + */ public Map getCookies() { return cookies; } + /** + * 获取已设置的user-agent + * + * @return 已设置的user-agent + */ public String getUserAgent() { return userAgent; } + /** + * 获取已设置的domain + * + * @return + */ public String getDomain() { return domain; } + /** + * 设置这个站点所在域名,必须项。
      + * 目前不支持多个域名的抓取。抓取多个域名请新建一个Spider。 + * + * @param domain 爬虫会抓取的域名 + * @return this + */ public Site setDomain(String domain) { this.domain = domain; return this; } - public String getEncoding() { - return encoding; - } - + /** + * 设置页面编码,若不设置则自动根据Html meta信息获取。
      + * 一般无需设置encoding,如果发现下载的结果是乱码,则可以设置此项。
      + * + * @param encoding 编码格式,主要是"utf-8"、"gbk"两种 + * @return this + */ public Site setEncoding(String encoding) { this.encoding = encoding; return this; } - public Set getAcceptStatCode() { - return acceptStatCode; + /** + * 获取已设置的编码 + * + * @return 已设置的domain + */ + public String getEncoding() { + return encoding; } + /** + * 设置可接受的http状态码,仅当状态码在这个集合中时,才会读取页面内容。
      + * 默认为200,正常情况下,无须设置此项。
      + * 某些站点会错误的返回状态码,此时可以对这个选项进行设置。
      + * + * @param acceptStatCode 可接受的状态码 + * @return this + */ public Site setAcceptStatCode(Set acceptStatCode) { this.acceptStatCode = acceptStatCode; return this; } + /** + * 获取可接受的状态码 + * + * @return 可接受的状态码 + */ + public Set getAcceptStatCode() { + return acceptStatCode; + } + + /** + * 获取初始页面的地址列表 + * @return 初始页面的地址列表 + */ public List getStartUrls() { return startUrls; } + /** + * 增加初始页面的地址,可反复调用此方法增加多个初始地址。 + * @param startUrl 初始页面的地址 + * @return this + */ public Site addStartUrl(String startUrl) { this.startUrls.add(startUrl); return this; } - public int getSleepTime() { - return sleepTime; - } - + /** + * 设置两次抓取之间的间隔,避免对目标站点压力过大(或者避免被防火墙屏蔽...)。 + * + * @param sleepTime 单位毫秒 + * @return this + */ public Site setSleepTime(int sleepTime) { this.sleepTime = sleepTime; return this; } + /** + * 获取两次抓取之间的间隔 + * @return 两次抓取之间的间隔,单位毫秒 + */ + public int getSleepTime() { + return sleepTime; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 67e9c94d5..8c662eb4a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -7,13 +7,18 @@ import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.Pipeline; import us.codecraft.webmagic.processor.PageProcessor; -import us.codecraft.webmagic.schedular.QueueSchedular; -import us.codecraft.webmagic.schedular.Schedular; +import us.codecraft.webmagic.schedular.QueueScheduler; +import us.codecraft.webmagic.schedular.Scheduler; import java.util.ArrayList; import java.util.List; /** + *
      + * webmagic爬虫的入口类。
      + *      示例:
      + *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*")).run();
      + * 
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午6:53 @@ -32,18 +37,17 @@ public class Spider implements Runnable, Task { private String uuid; - private Schedular schedular = new QueueSchedular(); + private Scheduler scheduler = new QueueScheduler(); private Logger logger = Logger.getLogger(getClass()); - public static Spider me() { - return new Spider(); - } - - public Spider processor(PageProcessor pageProcessor) { + public Spider(PageProcessor pageProcessor){ this.pageProcessor = pageProcessor; this.site = pageProcessor.getSite(); - return this; + } + + public static Spider create(PageProcessor pageProcessor) { + return new Spider(pageProcessor); } public Spider startUrls(List startUrls) { @@ -57,8 +61,13 @@ public Spider startUrl(String startUrl) { return this; } - public Spider schedular(Schedular schedular) { - this.schedular = schedular; + public Spider setUUID(String uuid) { + this.uuid = uuid; + return this; + } + + public Spider schedular(Scheduler scheduler) { + this.scheduler = scheduler; return this; } @@ -71,9 +80,9 @@ public Spider pipeline(Pipeline pipeline) { @Override public void run() { for (String startUrl : startUrls) { - schedular.push(new Request(startUrl), this); + scheduler.push(new Request(startUrl), this); } - Request request = schedular.poll(this); + Request request = scheduler.poll(this); if (pipelines.isEmpty()) { pipelines.add(new ConsolePipeline()); } @@ -89,16 +98,10 @@ public void run() { pipeline.process(page, this); } sleep(site.getSleepTime()); - request = schedular.poll(this); + request = scheduler.poll(this); } } - public Spider setUUID(String uuid) { - this.uuid = uuid; - return this; - } - - private void sleep(int time) { try { Thread.sleep(time); @@ -110,7 +113,7 @@ private void sleep(int time) { private void addRequest(Page page) { if (CollectionUtils.isNotEmpty(page.getTargetRequests())) { for (Request request : page.getTargetRequests()) { - schedular.push(request, this); + scheduler.push(request, this); } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java similarity index 97% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java index 0a93e52db..246f7e0a7 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java @@ -20,7 +20,7 @@ * Date: 13-4-21 * Time: 下午1:13 */ -public class FileCacheQueueSchedular implements Schedular { +public class FileCacheQueueScheduler implements Scheduler { private Logger logger = Logger.getLogger(getClass()); @@ -44,7 +44,7 @@ public class FileCacheQueueSchedular implements Schedular { private Set urls; - public FileCacheQueueSchedular(String filePath) { + public FileCacheQueueScheduler(String filePath) { this.filePath = filePath; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java similarity index 94% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java index 20576fc7c..697688596 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueSchedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java @@ -14,7 +14,7 @@ * Date: 13-4-21 * Time: 下午1:13 */ -public class QueueSchedular implements Schedular { +public class QueueScheduler implements Scheduler { private Logger logger = Logger.getLogger(getClass()); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java similarity index 90% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java index 8df776040..7e0213275 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Schedular.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java @@ -8,7 +8,7 @@ * Date: 13-4-21 * Time: 下午1:12 */ -public interface Schedular { +public interface Scheduler { public void push(Request request,Task task); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 3cc84f79e..0b3637267 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -5,8 +5,8 @@ /** * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 上午7:54 + * Date: 13-4-21 + * Time: 上午7:54 */ public class Html extends PlainText { @@ -18,12 +18,16 @@ public Html(String text) { super(text); } + public static Html create(String text) { + return new Html(text); + } + @Override protected Selectable select(Selector selector, List strings) { List results = new ArrayList(); for (String string : strings) { String result = selector.select(string); - if (result!=null){ + if (result != null) { results.add(result); } } @@ -43,13 +47,13 @@ protected Selectable selectList(Selector selector, List strings) { @Override public Selectable smartContent() { SmartContentSelector smartContentSelector = SelectorFactory.getInstatnce().newSmartContentSelector(); - return select(smartContentSelector,strings); + return select(smartContentSelector, strings); } @Override public Selectable links() { XpathSelector xpathSelector = SelectorFactory.getInstatnce().newXpathSelector("//a/@href"); - return selectList(xpathSelector,strings); + return selectList(xpathSelector, strings); } @Override diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index 935ababa3..cedee6301 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -24,6 +24,10 @@ public PlainText(String text) { this.strings = results; } + public static PlainText create(String text) { + return new PlainText(text); + } + @Override public Selectable xpath(String xpath) { throw new UnsupportedOperationException(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java index 7f00e17c0..b2bcca2e5 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java @@ -15,7 +15,7 @@ public class HttpClientDownloaderTest { @Test public void testCookie() { - Site site = Site.me().setDomain("www.diandian.com").setCookie("t", "yct7q7e6v319wpg4cpxqduu5m77lcgix"); + Site site = Site.me().setDomain("www.diandian.com").addCookie("t", "yct7q7e6v319wpg4cpxqduu5m77lcgix"); HttpClientDownloader httpClientDownloader = new HttpClientDownloader(); Page download = httpClientDownloader.download(new Request("http://www.diandian.com"), site); Assert.assertTrue(download.getHtml().toString().contains("flashsword30")); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index 7a211882e..c7233e8b2 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -33,6 +33,6 @@ public Site getSite() { public static void main(String[] args) { DianpingProcessor dianpingProcessor = new DianpingProcessor(); - Spider.me().processor(dianpingProcessor).startUrl("http://www.dianping.com/shanghai/food").run(); + Spider.create(dianpingProcessor).startUrl("http://www.dianping.com/shanghai/food").run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 681aac78e..39018d908 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.SimplePageProcessor; import us.codecraft.webmagic.samples.HuxiuProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; +import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; /** * @author code4crafter@gmail.com
      @@ -18,7 +18,7 @@ public class SpiderTest { @Ignore @Test public void testSpider() throws InterruptedException { - Spider me = Spider.me().pipeline(new FilePipeline()).processor(new HuxiuProcessor()); + Spider me = Spider.create(new HuxiuProcessor()).pipeline(new FilePipeline()); me.run(); } @@ -26,13 +26,13 @@ public void testSpider() throws InterruptedException { @Test public void testGlobalSpider(){ // PageProcessor pageProcessor = new MeicanProcessor(); -// Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueSchedular(pageProcessor.getSite(),"/data/temp/webmagic/cache/")). +// Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueScheduler(pageProcessor.getSite(),"/data/temp/webmagic/cache/")). // processor(pageProcessor).run(); SimplePageProcessor pageProcessor2 = new SimplePageProcessor("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space", "http://www.diaoyuweng.com/thread-*-1-1.html"); System.out.println(pageProcessor2.getSite().getEncoding()); pageProcessor2.getSite().setSleepTime(500); - Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). - processor(pageProcessor2).run(); + Spider.create(pageProcessor2).pipeline(new FilePipeline()).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + run(); } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index b87815c4d..00491d9f0 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.FreemarkerPipeline; import us.codecraft.webmagic.samples.DiandianBlogProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; +import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; import java.io.IOException; @@ -30,7 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 - Spider.me().pipeline(new ConsolePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). - processor(diaoyuwengProcessor).run(); + Spider.create(diaoyuwengProcessor).pipeline(new ConsolePipeline()).pipeline(pipeline).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 2b2caaca1..a189126c8 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -6,14 +6,14 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.pipeline.FreemarkerPipeline; import us.codecraft.webmagic.samples.DiaoyuwengProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; +import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; import java.io.IOException; /** * @author code4crafter@gmail.com
      - * Date: 13-6-9 - * Time: 上午8:02 + * Date: 13-6-9 + * Time: 上午8:02 */ public class DiaoyuwengProcessorTest { @@ -22,7 +22,7 @@ public class DiaoyuwengProcessorTest { public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl"); - Spider.me().pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). - processor(diaoyuwengProcessor).run(); + Spider.create(diaoyuwengProcessor).pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index 9613c9e4e..4a2638328 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -6,14 +6,14 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.pipeline.FreemarkerPipeline; import us.codecraft.webmagic.samples.SinaBlogProcesser; -import us.codecraft.webmagic.schedular.FileCacheQueueSchedular; +import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; import java.io.IOException; /** * @author code4crafter@gmail.com
      - * Date: 13-6-9 - * Time: 上午8:02 + * Date: 13-6-9 + * Time: 上午8:02 */ public class SinablogProcessorTest { @@ -30,7 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 - Spider.me().pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueSchedular("/data/temp/webmagic/cache/")). - processor(sinaBlogProcesser).run(); + Spider.create(sinaBlogProcesser).pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + run(); } } From 2788ff3d28ffb557fb2cab45ad88981f284efab1 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 07:54:55 +0800 Subject: [PATCH 027/175] fix spell error=.= --- webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java | 2 +- .../codecraft/webmagic/schedular/FileCacheQueueScheduler.java | 4 ++-- .../src/test/java/us/codecraft/webmagic/SpiderTest.java | 4 ++-- .../codecraft/webmagic/processor/DiandianProcessorTest.java | 2 +- .../codecraft/webmagic/processor/DiaoyuwengProcessorTest.java | 2 +- .../codecraft/webmagic/processor/SinablogProcessorTest.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 8c662eb4a..4c4943a12 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -66,7 +66,7 @@ public Spider setUUID(String uuid) { return this; } - public Spider schedular(Scheduler scheduler) { + public Spider scheduler(Scheduler scheduler) { this.scheduler = scheduler; return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java index 246f7e0a7..e0d2c9481 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java @@ -63,7 +63,7 @@ private void init(Task task) { initWriter(); initFlushThread(); inited.set(true); - logger.info("init cache schedular success"); + logger.info("init cache scheduler success"); } private void initFlushThread() { @@ -80,7 +80,7 @@ private void initWriter() { fileUrlWriter = new PrintWriter(new FileWriter(getFileName(fileUrlAllName), true)); fileCursorWriter = new PrintWriter(new FileWriter(getFileName(fileCursor), false)); } catch (IOException e) { - throw new RuntimeException("init cache schedular error", e); + throw new RuntimeException("init cache scheduler error", e); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 39018d908..f2668f253 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -26,12 +26,12 @@ public void testSpider() throws InterruptedException { @Test public void testGlobalSpider(){ // PageProcessor pageProcessor = new MeicanProcessor(); -// Spider.me().pipeline(new FilePipeline()).schedular(new FileCacheQueueScheduler(pageProcessor.getSite(),"/data/temp/webmagic/cache/")). +// Spider.me().pipeline(new FilePipeline()).scheduler(new FileCacheQueueScheduler(pageProcessor.getSite(),"/data/temp/webmagic/cache/")). // processor(pageProcessor).run(); SimplePageProcessor pageProcessor2 = new SimplePageProcessor("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space", "http://www.diaoyuweng.com/thread-*-1-1.html"); System.out.println(pageProcessor2.getSite().getEncoding()); pageProcessor2.getSite().setSleepTime(500); - Spider.create(pageProcessor2).pipeline(new FilePipeline()).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + Spider.create(pageProcessor2).pipeline(new FilePipeline()).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 00491d9f0..ddca9c07f 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -30,7 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 - Spider.create(diaoyuwengProcessor).pipeline(new ConsolePipeline()).pipeline(pipeline).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + Spider.create(diaoyuwengProcessor).pipeline(new ConsolePipeline()).pipeline(pipeline).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index a189126c8..33bcf9c61 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -22,7 +22,7 @@ public class DiaoyuwengProcessorTest { public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl"); - Spider.create(diaoyuwengProcessor).pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + Spider.create(diaoyuwengProcessor).pipeline(new FilePipeline()).pipeline(pipeline).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index 4a2638328..a0160e186 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -30,7 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 - Spider.create(sinaBlogProcesser).pipeline(new FilePipeline()).pipeline(pipeline).schedular(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). + Spider.create(sinaBlogProcesser).pipeline(new FilePipeline()).pipeline(pipeline).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); } } From 763b7fe509531b5a9b6ac6facd2d0afd261ebeba Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 08:21:48 +0800 Subject: [PATCH 028/175] update javadoc --- .../java/us/codecraft/webmagic/Request.java | 1 + .../main/java/us/codecraft/webmagic/Site.java | 2 +- .../java/us/codecraft/webmagic/Spider.java | 58 +++++++++++++++---- .../main/java/us/codecraft/webmagic/Task.java | 5 ++ .../webmagic/samples/DianpingProcessor.java | 2 +- .../processor/DiandianProcessorTest.java | 1 + 6 files changed, 56 insertions(+), 13 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index 37ede0dc4..42dd079fa 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -3,6 +3,7 @@ /** * Request对象封装了待抓取的url信息。
      * 在PageProcessor中,Request对象可以通过{@link us.codecraft.webmagic.Page#getRequest()} 获取。
      + *
      * Request对象包含一个extra属性,可以写入一些必须的上下文,这个特性在某些场合会有用。
      *
        *      Example:
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java
      index f9e0fd611..423b0a6aa 100644
      --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java
      +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java
      @@ -85,7 +85,7 @@ public String getUserAgent() {
           /**
            * 获取已设置的domain
            *
      -     * @return
      +     * @return 已设置的domain
            */
           public String getDomain() {
               return domain;
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java
      index 4c4943a12..dc0102ce8 100644
      --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java
      +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java
      @@ -15,9 +15,19 @@
       
       /**
        * 
      - * webmagic爬虫的入口类。
      - *      示例:
      + *webmagic爬虫的入口类。
      + *
      + *示例:
      + *定义一个最简单的爬虫:
        *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*")).run();
      + *
      + *使用FilePipeline保存结果到文件:
      + *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*"))
      + *          .pipeline(new FilePipeline("/data/temp/webmagic/")).run();
      + *
      + *使用FileCacheQueueScheduler缓存URL,关闭爬虫后下次自动从停止的页面继续抓取:
      + *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*"))
      + *          .scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")).run();
        * 
      * @author code4crafter@gmail.com
      * Date: 13-4-21 @@ -41,36 +51,60 @@ public class Spider implements Runnable, Task { private Logger logger = Logger.getLogger(getClass()); - public Spider(PageProcessor pageProcessor){ + /** + * 使用已定义的抽取规则新建一个Spider。 + * @param pageProcessor 已定义的抽取规则 + */ + public Spider(PageProcessor pageProcessor) { this.pageProcessor = pageProcessor; this.site = pageProcessor.getSite(); + this.startUrls = pageProcessor.getSite().getStartUrls(); } + /** + * 使用已定义的抽取规则新建一个Spider。 + * @param pageProcessor 已定义的抽取规则 + * @return 新建的Spider + */ public static Spider create(PageProcessor pageProcessor) { return new Spider(pageProcessor); } + /** + * 重新设置startUrls,会覆盖Site本身的startUrls。 + * @param startUrls + * @return this + */ public Spider startUrls(List startUrls) { this.startUrls = startUrls; return this; } - public Spider startUrl(String startUrl) { - startUrls = new ArrayList(); - startUrls.add(startUrl); - return this; - } - + /** + * 为爬虫设置一个唯一ID,用于标志任务,默认情况下使用domain作为uuid,对于单domain多任务的情况,请为重复任务设置不同的ID。 + * @param uuid 唯一ID + * @return this + */ public Spider setUUID(String uuid) { this.uuid = uuid; return this; } + /** + * 设置调度器。调度器用于保存待抓取URL,并可以进行去重、同步、持久化等工作。默认情况下使用内存中的阻塞队列进行调度。 + * @param scheduler 调度器 + * @return this + */ public Spider scheduler(Scheduler scheduler) { this.scheduler = scheduler; return this; } + /** + * 设置处理管道。处理管道用于最终抽取结果的后处理,例如:保存到文件、保存到数据库等。默认情况下会输出到控制台。 + * @param pipeline 处理管道 + * @return this + */ public Spider pipeline(Pipeline pipeline) { this.pipelines.add(pipeline); return this; @@ -79,8 +113,10 @@ public Spider pipeline(Pipeline pipeline) { @Override public void run() { - for (String startUrl : startUrls) { - scheduler.push(new Request(startUrl), this); + if (startUrls != null) { + for (String startUrl : startUrls) { + scheduler.push(new Request(startUrl), this); + } } Request request = scheduler.poll(this); if (pipelines.isEmpty()) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java index 2aab74a63..136b467d9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java @@ -1,12 +1,17 @@ package us.codecraft.webmagic; /** + * 抓取任务的抽象接口。
      * @author code4crafter@gmail.com
      * Date: 13-6-18 * Time: 下午2:57 */ public interface Task { + /** + * 返回唯一标志该任务的字符串,以区分不同任务。 + * @return uuid + */ public String getUUID(); } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index c7233e8b2..33ac3d786 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -33,6 +33,6 @@ public Site getSite() { public static void main(String[] args) { DianpingProcessor dianpingProcessor = new DianpingProcessor(); - Spider.create(dianpingProcessor).startUrl("http://www.dianping.com/shanghai/food").run(); + Spider.create(dianpingProcessor).run(); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index ddca9c07f..13910b528 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -30,6 +30,7 @@ public void test() throws IOException { //ConsolePipeline输出结果到控制台 //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 //Spider.run()执行 + Spider.create(diaoyuwengProcessor).pipeline(new ConsolePipeline()).pipeline(pipeline).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); } From 6c227d31f3a22e0af7433d39b0fc592cfc1f7ba4 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 08:22:53 +0800 Subject: [PATCH 029/175] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b687e6bc..4bd8c7f04 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参 以下是爬取oschina博客的一段代码: - Spider.me().processor(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); + Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); * ####可扩展#### 参考[`scrapy`](https://github.com/scrapy/scrapy)的设计,webmagic将爬虫的扩展点分为Processor、Schedular、Downloader、Pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展Schedular实现断点续传乃至于分布式爬虫;可以通过扩展Pipeline实现业务可定制的持久化功能。 @@ -75,7 +75,7 @@ webmagic定制的核心是PageProcessor接口。 调用这个爬虫的代码如下: - Spider.me().processor(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); + Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); ### 示例 From ba3e90a71a972028c8c4ed4124da43a837919274 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 17:39:06 +0800 Subject: [PATCH 030/175] update api to support jdk 1.6 --- .../codecraft/webmagic/schedular/FileCacheQueueScheduler.java | 2 +- .../java/us/codecraft/webmagic/selector/SelectorFactory.java | 2 +- webmagic-plugin/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java index e0d2c9481..1f5298a00 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java @@ -117,7 +117,7 @@ private void readCursorFile() throws IOException { } private String getFileName(String filename) { - return filePath + task.getUUID() + "/" + filename; + return filePath + task.getUUID() + filename; } @Override diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java index 3c87ac9c4..2fa78d323 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java @@ -70,7 +70,7 @@ public T newSelector(Class clazz, String... param) { } else { throw new UnsupportedOperationException(); } - } catch (ReflectiveOperationException e) { + } catch (Exception e) { throw new IllegalArgumentException("init object error", e); } } diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index c2a08adb4..0a37a30ce 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -23,7 +23,7 @@ org.freemarker freemarker - 2.3.19 + 2.3.15 From de09d312d820e9e5bc221a78bb055c370055f17b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 17:43:33 +0800 Subject: [PATCH 031/175] bugfix --- webmagic-samples/src/main/resources/ftl/wordpress.ftl | 6 +++--- .../codecraft/webmagic/processor/DiandianProcessorTest.java | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/webmagic-samples/src/main/resources/ftl/wordpress.ftl b/webmagic-samples/src/main/resources/ftl/wordpress.ftl index c2442ab62..f2feeb16c 100644 --- a/webmagic-samples/src/main/resources/ftl/wordpress.ftl +++ b/webmagic-samples/src/main/resources/ftl/wordpress.ftl @@ -1,13 +1,13 @@ ${title} - http://127.0.0.1/wordpress/?p=${uuid} + http://127.0.0.1/wordpress/?p=${id} ${date} admin - http://127.0.0.1/wordpress/?p=${uuid} + http://127.0.0.1/wordpress/?p=${id} - ${uuid} + ${id} ${date} ${date} open diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 13910b528..3402479de 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -17,7 +17,6 @@ */ public class DiandianProcessorTest { - @Ignore @Test public void test() throws IOException { DiandianBlogProcessor diaoyuwengProcessor = new DiandianBlogProcessor(); From c387ef69415d1ba7a082b774da07c6c5fc0ffd21 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 17:53:07 +0800 Subject: [PATCH 032/175] ignore long time test --- .../us/codecraft/webmagic/processor/DiandianProcessorTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 3402479de..13910b528 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -17,6 +17,7 @@ */ public class DiandianProcessorTest { + @Ignore @Test public void test() throws IOException { DiandianBlogProcessor diaoyuwengProcessor = new DiandianBlogProcessor(); From 5a6d8a4b8777a18c58d81058175f2b813f274544 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 17:54:46 +0800 Subject: [PATCH 033/175] add jdk --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index be7dfb8ca..c7c99f406 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,4 @@ -language: java \ No newline at end of file +language: java +jdk: + - oraclejdk7 + - openjdk6 From af94f7d39a5174ac7aea211642ddccfad8109722 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 20 Jun 2013 17:57:31 +0800 Subject: [PATCH 034/175] ignore unstable test --- .../codecraft/webmagic/downloader/HttpClientDownloaderTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java index b2bcca2e5..5e83422ae 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java @@ -1,6 +1,7 @@ package us.codecraft.webmagic.downloader; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Request; @@ -13,6 +14,7 @@ */ public class HttpClientDownloaderTest { + @Ignore @Test public void testCookie() { Site site = Site.me().setDomain("www.diandian.com").addCookie("t", "yct7q7e6v319wpg4cpxqduu5m77lcgix"); From 68fd8a68a8a21078ec607a653d1d5e69f1bd5992 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 23 Jun 2013 16:57:01 +0800 Subject: [PATCH 035/175] add page skip --- .../src/main/java/us/codecraft/webmagic/Page.java | 10 ++++++++++ .../webmagic/pipeline/FreemarkerPipeline.java | 7 +++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index 5bf5f26ed..8a167ac7b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -35,6 +35,16 @@ public class Page { private List targetRequests = new ArrayList(); + private boolean skip; + + public boolean isSkip() { + return skip; + } + + public void setSkip(boolean skip) { + this.skip = skip; + } + public Page() { } diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index f512f2628..8741ef498 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -14,8 +14,8 @@ /** * @author code4crafter@gmail.com
      - * Date: 13-6-8 - * Time: 下午9:00 + * Date: 13-6-8 + * Time: 下午9:00 */ public class FreemarkerPipeline implements Pipeline { @@ -40,6 +40,9 @@ public FreemarkerPipeline(String template) throws IOException { @Override public void process(Page page, Task task) { + if (page.isSkip()) { + return; + } String path = this.path + "" + task.getUUID() + "/"; File file = new File(path); if (!file.exists()) { From 3b31c533e499fedc5167125018a3c7fa88464db8 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 23 Jun 2013 17:05:10 +0800 Subject: [PATCH 036/175] add extra for page --- .../main/java/us/codecraft/webmagic/Page.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index 8a167ac7b..5b1ceaf41 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -37,10 +37,20 @@ public class Page { private boolean skip; + private Object extra; + + /** + * 是否忽略这个页面,用于pipeline来判断是否对这个页面进行处理 + * @return 是否忽略 true 忽略 + */ public boolean isSkip() { return skip; } + /** + * 设置是否忽略这个页面,用于pipeline来判断是否对这个页面进行处理 + * @param skip 是否忽略 true 忽略 + */ public void setSkip(boolean skip) { this.skip = skip; } @@ -148,4 +158,22 @@ public Request getRequest() { public void setRequest(Request request) { this.request = request; } + + /** + * 获取附加对象 + * @param 对象类型 + * @return 对象内容 + */ + public T getExtra() { + return (T)extra; + } + + /** + * 设置附加对象 + * @param extra 对象内容 + * @param 对象类型 + */ + public void setExtra(T extra) { + this.extra = extra; + } } From cd5941fd60224694e4782b8f3f5d1442fa669075 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 23 Jun 2013 17:06:43 +0800 Subject: [PATCH 037/175] add extra --- .../java/us/codecraft/webmagic/pipeline/ConsolePipeline.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 866db9239..6c2abba8f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -19,5 +19,8 @@ public void process(Page page,Task task) { for (Map.Entry entry : page.getFields().entrySet()) { System.out.println(entry.getKey()+":\t"+entry.getValue().toStrings()); } + if (page.getExtra()!=null){ + System.out.println(page.getExtra()); + } } } From c80ae654999aa7cf79c712247690a3a5c7df49cf Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 23 Jun 2013 18:56:31 +0800 Subject: [PATCH 038/175] add gzip support --- .../downloader/HttpClientDownloader.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index c1ecff3e8..1b628cd75 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -1,8 +1,11 @@ package us.codecraft.webmagic.downloader; import org.apache.commons.io.IOUtils; +import org.apache.http.Header; +import org.apache.http.HeaderElement; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.GzipDecompressingEntity; import org.apache.http.client.methods.HttpGet; import org.apache.log4j.Logger; import us.codecraft.webmagic.Page; @@ -26,15 +29,19 @@ public class HttpClientDownloader implements Downloader { public Page download(Request request, Site site) { logger.info("downloading page " + request.getUrl()); HttpClient httpClient = HttpClientPool.getInstance().getClient(site); + String encoding = site.getEncoding(); try { HttpGet httpGet = new HttpGet(request.getUrl()); HttpResponse httpResponse = httpClient.execute(httpGet); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (site.getAcceptStatCode().contains(statusCode)) { - if (site.getEncoding() == null){ + //charset + if (encoding == null){ String value = httpResponse.getEntity().getContentType().getValue(); site.setEncoding(new PlainText(value).regex("charset=([^\\s]+)").toString()); } + // + handleGzip(httpResponse); String content = IOUtils.toString(httpResponse.getEntity().getContent(), site.getEncoding()); Page page = new Page(); @@ -50,4 +57,17 @@ public Page download(Request request, Site site) { } return null; } + + private void handleGzip(HttpResponse httpResponse) { + Header ceheader = httpResponse.getEntity().getContentEncoding(); + if (ceheader != null) { + HeaderElement[] codecs = ceheader.getElements(); + for (int i = 0; i < codecs.length; i++) { + if (codecs[i].getName().equalsIgnoreCase("gzip")) { + httpResponse.setEntity( + new GzipDecompressingEntity(httpResponse.getEntity())); + } + } + } + } } From 16d581ca5f6432f6b1ebb7ca82bad4c6fc422232 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 23 Jun 2013 21:09:26 +0800 Subject: [PATCH 039/175] add multithread support --- .../java/us/codecraft/webmagic/Spider.java | 97 +++++++++++++++++-- .../codecraft/webmagic/utils/ThreadUtils.java | 33 +++++++ 2 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index dc0102ce8..709b6579c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -9,9 +9,12 @@ import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.schedular.QueueScheduler; import us.codecraft.webmagic.schedular.Scheduler; +import us.codecraft.webmagic.utils.ThreadUtils; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicInteger; /** *
      @@ -51,6 +54,16 @@ public class Spider implements Runnable, Task {
       
           private Logger logger = Logger.getLogger(getClass());
       
      +    private ExecutorService executorService;
      +
      +    private AtomicInteger stat = new AtomicInteger(STAT_INIT);
      +
      +    private final static int STAT_INIT = 0;
      +
      +    private final static int STAT_RUNNING = 1;
      +
      +    private final static int STAT_STOPPED = 2;
      +
           /**
            * 使用已定义的抽取规则新建一个Spider。
            * @param pageProcessor 已定义的抽取规则
      @@ -76,6 +89,7 @@ public static Spider create(PageProcessor pageProcessor) {
            * @return this
            */
           public Spider startUrls(List startUrls) {
      +        checkIfNotRunning();
               this.startUrls = startUrls;
               return this;
           }
      @@ -96,6 +110,7 @@ public Spider setUUID(String uuid) {
            * @return this
            */
           public Spider scheduler(Scheduler scheduler) {
      +        checkIfNotRunning();
               this.scheduler = scheduler;
               return this;
           }
      @@ -106,6 +121,7 @@ public Spider scheduler(Scheduler scheduler) {
            * @return this
            */
           public Spider pipeline(Pipeline pipeline) {
      +        checkIfNotRunning();
               this.pipelines.add(pipeline);
               return this;
           }
      @@ -113,6 +129,9 @@ public Spider pipeline(Pipeline pipeline) {
       
           @Override
           public void run() {
      +        if (!stat.compareAndSet(STAT_INIT, STAT_RUNNING)) {
      +            throw new IllegalStateException("Spider is already running!");
      +        }
               if (startUrls != null) {
                   for (String startUrl : startUrls) {
                       scheduler.push(new Request(startUrl), this);
      @@ -122,20 +141,56 @@ public void run() {
               if (pipelines.isEmpty()) {
                   pipelines.add(new ConsolePipeline());
               }
      -        while (request != null) {
      -            Page page = downloader.download(request, site);
      -            if (page == null) {
      -                sleep(site.getSleepTime());
      -                continue;
      +        //singel thread
      +        if (executorService==null){
      +            while (request != null) {
      +                processRequest(request);
      +                request = scheduler.poll(this);
                   }
      -            pageProcessor.process(page);
      -            addRequest(page);
      -            for (Pipeline pipeline : pipelines) {
      -                pipeline.process(page, this);
      +        } else {
      +            final AtomicInteger threadAlive = new AtomicInteger(0);
      +            while (true) {
      +                if (request == null) {
      +                    try {
      +                        Thread.sleep(100);
      +                    } catch (InterruptedException e) {
      +                    }
      +                } else {
      +                    final Request requestFinal = request;
      +                    threadAlive.incrementAndGet();
      +                    executorService.execute(new Runnable() {
      +                        @Override
      +                        public void run() {
      +                            processRequest(requestFinal);
      +                            threadAlive.decrementAndGet();
      +                        }
      +                    });
      +                }
      +                request = scheduler.poll(this);
      +                if (threadAlive.get() == 0) {
      +                    request = scheduler.poll(this);
      +                    if (request == null) {
      +                        break;
      +                    }
      +                }
                   }
      +            executorService.shutdown();
      +        }
      +        stat.compareAndSet(STAT_RUNNING, STAT_STOPPED);
      +    }
      +
      +    private void processRequest(Request request) {
      +        Page page = downloader.download(request, site);
      +        if (page == null) {
                   sleep(site.getSleepTime());
      -            request = scheduler.poll(this);
      +            return;
      +        }
      +        pageProcessor.process(page);
      +        addRequest(page);
      +        for (Pipeline pipeline : pipelines) {
      +            pipeline.process(page, this);
               }
      +        sleep(site.getSleepTime());
           }
       
           private void sleep(int time) {
      @@ -154,6 +209,28 @@ private void addRequest(Page page) {
               }
           }
       
      +    private void checkIfNotRunning(){
      +        if (!stat.compareAndSet(STAT_INIT,STAT_INIT)){
      +            throw new IllegalStateException("Spider is already running!");
      +        }
      +    }
      +
      +    /**
      +     * 建立多个线程下载
      +     * @param threadNum 线程数
      +     * @return
      +     */
      +    public Spider thread(int threadNum) {
      +        checkIfNotRunning();
      +        if (threadNum <= 1) {
      +            throw new IllegalArgumentException("threadNum should be more than one!");
      +        }
      +        synchronized (this){
      +            this.executorService = ThreadUtils.newFixedThreadPool(threadNum);
      +        }
      +        return this;
      +    }
      +
           @Override
           public String getUUID() {
               if (uuid != null) {
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java
      new file mode 100644
      index 000000000..ebe61198d
      --- /dev/null
      +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java
      @@ -0,0 +1,33 @@
      +package us.codecraft.webmagic.utils;
      +
      +import java.util.concurrent.ExecutorService;
      +import java.util.concurrent.LinkedBlockingQueue;
      +import java.util.concurrent.ThreadPoolExecutor;
      +import java.util.concurrent.TimeUnit;
      +
      +/**
      + * @author code4crafer@gmail.com
      + *         Date: 13-6-23
      + *         Time: 下午7:11
      + */
      +public class ThreadUtils {
      +
      +    public static ExecutorService newFixedThreadPool(int threadSize) {
      +        return new ThreadPoolExecutor(threadSize, threadSize, 0L, TimeUnit.MILLISECONDS,
      +                new LinkedBlockingQueue(1) {
      +
      +                    private static final long serialVersionUID = -9028058603126367678L;
      +
      +                    @Override
      +                    public boolean offer(Runnable e) {
      +                        try {
      +                            put(e);
      +                            return true;
      +                        } catch (InterruptedException ie) {
      +                            Thread.currentThread().interrupt();
      +                        }
      +                        return false;
      +                    }
      +                });
      +    }
      +}
      
      From 82ab749d14a890d9fe5ad7f130e4d748f6189b7d Mon Sep 17 00:00:00 2001
      From: "yihua.huang" 
      Date: Sun, 23 Jun 2013 22:16:04 +0800
      Subject: [PATCH 040/175] add runasync
      
      ---
       .../src/main/java/us/codecraft/webmagic/Spider.java   | 11 +++++++++++
       1 file changed, 11 insertions(+)
      
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java
      index 709b6579c..a5e062436 100644
      --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java
      +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java
      @@ -215,6 +215,17 @@ private void checkIfNotRunning(){
               }
           }
       
      +    public void runAsync(){
      +        Thread thread = new Thread(){
      +            @Override
      +            public void run() {
      +                Spider.this.run();
      +            }
      +        };
      +        thread.setDaemon(false);
      +        thread.start();
      +    }
      +
           /**
            * 建立多个线程下载
            * @param threadNum 线程数
      
      From 323b2f22956e6e4dcf814d00141605a1bcceb261 Mon Sep 17 00:00:00 2001
      From: "yihua.huang" 
      Date: Mon, 24 Jun 2013 14:42:49 +0800
      Subject: [PATCH 041/175] add offline cache and process
      
      ---
       .../main/java/us/codecraft/webmagic/Site.java | 30 +++++--
       .../java/us/codecraft/webmagic/Spider.java    | 20 +++--
       .../main/java/us/codecraft/webmagic/Task.java |  6 ++
       .../webmagic/downloader/Downloader.java       |  6 +-
       .../webmagic/downloader/FileDownloader.java   | 88 +++++++++++++++++++
       .../downloader/HttpClientDownloader.java      | 12 +--
       .../webmagic/pipeline/FilePipeline.java       | 14 ++-
       .../us/codecraft/webmagic/utils/UrlUtils.java |  2 +-
       .../downloader/HttpClientDownloaderTest.java  |  2 +-
       .../webmagic/samples/DiaoyuwengProcessor.java |  2 +-
       .../webmagic/samples/GlobalProcessor.java     | 45 ++++++++++
       .../webmagic/samples/KaichibaProcessor.java   |  2 +-
       .../webmagic/samples/MeicanProcessor.java     |  2 +-
       .../us/codecraft/webmagic/SpiderTest.java     |  2 +-
       14 files changed, 196 insertions(+), 37 deletions(-)
       create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java
       create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java
      
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java
      index 423b0a6aa..676584ad5 100644
      --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java
      +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java
      @@ -18,7 +18,7 @@ public class Site {
       
           private Map cookies = new LinkedHashMap();
       
      -    private String encoding;
      +    private String charset;
       
           private List startUrls = new ArrayList();
       
      @@ -107,11 +107,11 @@ public Site setDomain(String domain) {
            * 设置页面编码,若不设置则自动根据Html meta信息获取。
      * 一般无需设置encoding,如果发现下载的结果是乱码,则可以设置此项。
      * - * @param encoding 编码格式,主要是"utf-8"、"gbk"两种 + * @param charset 编码格式,主要是"utf-8"、"gbk"两种 * @return this */ - public Site setEncoding(String encoding) { - this.encoding = encoding; + public Site setCharset(String charset) { + this.charset = charset; return this; } @@ -120,8 +120,8 @@ public Site setEncoding(String encoding) { * * @return 已设置的domain */ - public String getEncoding() { - return encoding; + public String getCharset() { + return charset; } /** @@ -194,18 +194,32 @@ public boolean equals(Object o) { return false; if (!domain.equals(site.domain)) return false; if (!startUrls.equals(site.startUrls)) return false; - if (encoding != null ? !encoding.equals(site.encoding) : site.encoding != null) return false; + if (charset != null ? !charset.equals(site.charset) : site.charset != null) return false; if (userAgent != null ? !userAgent.equals(site.userAgent) : site.userAgent != null) return false; return true; } + public Task toTask(){ + return new Task() { + @Override + public String getUUID() { + return Site.this.getDomain(); + } + + @Override + public Site getSite() { + return Site.this; + } + }; + } + @Override public int hashCode() { int result = domain.hashCode(); result = 31 * result + (startUrls != null ? startUrls.hashCode() : 0); result = 31 * result + (userAgent != null ? userAgent.hashCode() : 0); - result = 31 * result + (encoding != null ? encoding.hashCode() : 0); + result = 31 * result + (charset != null ? charset.hashCode() : 0); result = 31 * result + (acceptStatCode != null ? acceptStatCode.hashCode() : 0); return result; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index a5e062436..b2a2fa6b1 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -126,6 +126,12 @@ public Spider pipeline(Pipeline pipeline) { return this; } + public Spider downloader(Downloader downloader) { + checkIfNotRunning(); + this.downloader = downloader; + return this; + } + @Override public void run() { @@ -180,7 +186,7 @@ public void run() { } private void processRequest(Request request) { - Page page = downloader.download(request, site); + Page page = downloader.download(request, this); if (page == null) { sleep(site.getSleepTime()); return; @@ -216,12 +222,7 @@ private void checkIfNotRunning(){ } public void runAsync(){ - Thread thread = new Thread(){ - @Override - public void run() { - Spider.this.run(); - } - }; + Thread thread = new Thread(this); thread.setDaemon(false); thread.start(); } @@ -252,4 +253,9 @@ public String getUUID() { } return null; } + + @Override + public Site getSite() { + return site; + } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java index 136b467d9..14c1d319b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Task.java @@ -14,4 +14,10 @@ public interface Task { */ public String getUUID(); + /** + * 返回任务抓取的站点信息 + * @return site + */ + public Site getSite(); + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java index e3ecff879..9a8bac110 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java @@ -2,7 +2,7 @@ import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Request; -import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; /** * Downloader是webmagic下载页面的接口。webmagic默认使用了HttpComponent作为下载器,一般情况,你无需自己实现这个接口。 @@ -16,8 +16,8 @@ public interface Downloader { * 下载页面,并保存信息到Page对象中。 * * @param request - * @param site + * @param task * @return page */ - public Page download(Request request, Site site); + public Page download(Request request, Task task); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java new file mode 100644 index 000000000..b4a49ac37 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java @@ -0,0 +1,88 @@ +package us.codecraft.webmagic.downloader; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.selector.Html; +import us.codecraft.webmagic.selector.PlainText; + +import java.io.*; + +/** + * @author code4crafer@gmail.com + * Date: 13-6-24 + * Time: 上午7:24 + */ +public class FileDownloader implements Downloader { + + private String path = "/data/temp/webmagic/"; + + private Downloader downloaderWhenFileMiss; + + private Logger logger = Logger.getLogger(getClass()); + + public FileDownloader() { + this("/data/temp/webmagic/", null); + } + + public FileDownloader(String path) { + this(path, null); + } + + public FileDownloader(String path, Downloader downloaderWhenFileMiss) { + this.path = path; + this.downloaderWhenFileMiss = downloaderWhenFileMiss; + } + + @Override + public Page download(Request request, Task task) { + String path = this.path + "/" + task.getUUID() + "/"; + Page page = null; + try { + final File file = new File(path + DigestUtils.md5Hex(request.getUrl())); + BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); + String line = null; + line = bufferedReader.readLine(); + if (line.equals("url:\t" + request.getUrl())) { + final String html = getHtml(bufferedReader); + page = new Page(); + page.setRequest(request); + page.setUrl(PlainText.create(request.getUrl())); + page.setHtml(Html.create(html)); + } + } catch (IOException e) { + if (e instanceof FileNotFoundException) { + logger.info("File not exist for url " + request.getUrl()); + } else { + logger.warn("File read error for url " + request.getUrl(), e); + } + } + if (page == null) { + page = downloadWhenMiss(request, task); + } + return page; + } + + private String getHtml(BufferedReader bufferedReader) throws IOException { + String line; + StringBuilder htmlBuilder= new StringBuilder(); + line = bufferedReader.readLine(); + line = StringUtils.removeStart(line, "html:\t"); + htmlBuilder.append(line); + while ((line=bufferedReader.readLine())!=null){ + htmlBuilder.append(line); + } + return htmlBuilder.toString(); + } + + private Page downloadWhenMiss(Request request, Task task) { + Page page = null; + if (downloaderWhenFileMiss != null) { + page = downloaderWhenFileMiss.download(request, task); + } + return page; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index 1b628cd75..d2c2d62e7 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -11,6 +11,7 @@ import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; import us.codecraft.webmagic.selector.Html; import us.codecraft.webmagic.selector.PlainText; import us.codecraft.webmagic.utils.UrlUtils; @@ -26,24 +27,25 @@ public class HttpClientDownloader implements Downloader { private Logger logger = Logger.getLogger(getClass()); @Override - public Page download(Request request, Site site) { + public Page download(Request request, Task task) { + Site site = task.getSite(); logger.info("downloading page " + request.getUrl()); HttpClient httpClient = HttpClientPool.getInstance().getClient(site); - String encoding = site.getEncoding(); + String charset = site.getCharset(); try { HttpGet httpGet = new HttpGet(request.getUrl()); HttpResponse httpResponse = httpClient.execute(httpGet); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (site.getAcceptStatCode().contains(statusCode)) { //charset - if (encoding == null){ + if (charset == null){ String value = httpResponse.getEntity().getContentType().getValue(); - site.setEncoding(new PlainText(value).regex("charset=([^\\s]+)").toString()); + charset = new PlainText(value).regex("charset=([^\\s]+)").toString(); } // handleGzip(httpResponse); String content = IOUtils.toString(httpResponse.getEntity().getContent(), - site.getEncoding()); + charset); Page page = new Page(); page.setHtml(new Html(UrlUtils.fixAllRelativeHrefs(content, request.getUrl()))); page.setUrl(new PlainText(request.getUrl())); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index c7cd9c56a..b079dcc40 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -1,15 +1,14 @@ package us.codecraft.webmagic.pipeline; import org.apache.commons.codec.digest.DigestUtils; +import org.apache.log4j.Logger; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Task; -import us.codecraft.webmagic.selector.Selectable; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; -import java.util.Map; /** * @author code4crafter@gmail.com
      @@ -20,6 +19,8 @@ public class FilePipeline implements Pipeline { private String path = "/data/temp/webmagic/"; + private Logger logger = Logger.getLogger(getClass()); + public FilePipeline() { } @@ -36,15 +37,12 @@ public void process(Page page, Task task) { file.mkdirs(); } try { - PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(page.getUrl().toString()) + ".html")); + PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(page.getUrl().toString()))); printWriter.println("url:\t" + page.getUrl()); - for (Map.Entry entry : page.getFields().entrySet()) { - printWriter.println(entry.getKey() + ":\t" + entry.getValue().toStrings()); - } + printWriter.println("html:\t" + page.getHtml()); printWriter.close(); } catch (IOException e) { - e.printStackTrace(); + logger.warn("write file error",e); } - } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java index 74e486c7f..667aaf25f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java @@ -75,7 +75,7 @@ public static String getDomain(String url) { return domain; } - private static Pattern patternForHref = Pattern.compile("(]*href=)[\"']{0,1}([^\"']*)[\"']{0,1}", Pattern.CASE_INSENSITIVE); + private static Pattern patternForHref = Pattern.compile("(]*href=)[\"']{0,1}([^\"'<>\\s]*)[\"']{0,1}", Pattern.CASE_INSENSITIVE); public static String fixAllRelativeHrefs(String html, String url) { StringBuilder stringBuilder = new StringBuilder(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java index 5e83422ae..936aece62 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/downloader/HttpClientDownloaderTest.java @@ -19,7 +19,7 @@ public class HttpClientDownloaderTest { public void testCookie() { Site site = Site.me().setDomain("www.diandian.com").addCookie("t", "yct7q7e6v319wpg4cpxqduu5m77lcgix"); HttpClientDownloader httpClientDownloader = new HttpClientDownloader(); - Page download = httpClientDownloader.download(new Request("http://www.diandian.com"), site); + Page download = httpClientDownloader.download(new Request("http://www.diandian.com"), site.toTask()); Assert.assertTrue(download.getHtml().toString().contains("flashsword30")); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java index 13ed2e115..695d2e2ab 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java @@ -34,7 +34,7 @@ public void process(Page page) { public Site getSite() { if (site==null){ site= Site.me().setDomain("www.diaoyuweng.com").addStartUrl("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space"). - setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31").setEncoding("GBK").setSleepTime(500); + setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31").setCharset("GBK").setSleepTime(500); } return site; } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java new file mode 100644 index 000000000..07f0101a1 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java @@ -0,0 +1,45 @@ +package us.codecraft.webmagic.samples; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.downloader.FileDownloader; +import us.codecraft.webmagic.downloader.HttpClientDownloader; +import us.codecraft.webmagic.pipeline.FilePipeline; +import us.codecraft.webmagic.processor.PageProcessor; +import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; + +import java.util.List; + +/** + * Author yihua.huang@dianping.com + * Date: 13-6-24 + * Time: 下午2:12 + */ +public class GlobalProcessor implements PageProcessor { + + private Site site; + + @Override + public void process(Page page) { + final List requests = page.getHtml().links().regex(".*book\\.douban\\.com.*").toStrings(); + page.addTargetRequests(requests); + + } + + @Override + public Site getSite() { + if (site==null){ + site = Site.me().setDomain("douban.com").addStartUrl("http://book.douban.com/").setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); + } + return site; + } + + public static void main(String[] args) { + Spider.create(new GlobalProcessor()).thread(10) + .scheduler(new FileCacheQueueScheduler("/data/webmagic/github")) + .downloader(new FileDownloader("/data/webmagic/douban", new HttpClientDownloader())) + .pipeline(new FilePipeline("/data/webmagic/douban")) + .run(); + } +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java index 0a51b364e..aff18a6d3 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/KaichibaProcessor.java @@ -21,7 +21,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("kaichiba.com").addStartUrl("http://kaichiba.com/shop/41725781").setEncoding("utf-8"). + return Site.me().setDomain("kaichiba.com").addStartUrl("http://kaichiba.com/shop/41725781").setCharset("utf-8"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java index bd218113b..39f5723ec 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java @@ -27,7 +27,7 @@ public void process(Page page) { @Override public Site getSite() { - return Site.me().setDomain("meican.com").addStartUrl("http://www.meican.com/shanghai/districts").setEncoding("utf-8"). + return Site.me().setDomain("meican.com").addStartUrl("http://www.meican.com/shanghai/districts").setCharset("utf-8"). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index f2668f253..76a423fbf 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -29,7 +29,7 @@ public void testGlobalSpider(){ // Spider.me().pipeline(new FilePipeline()).scheduler(new FileCacheQueueScheduler(pageProcessor.getSite(),"/data/temp/webmagic/cache/")). // processor(pageProcessor).run(); SimplePageProcessor pageProcessor2 = new SimplePageProcessor("http://www.diaoyuweng.com/home.php?mod=space&uid=88304&do=thread&view=me&type=thread&from=space", "http://www.diaoyuweng.com/thread-*-1-1.html"); - System.out.println(pageProcessor2.getSite().getEncoding()); + System.out.println(pageProcessor2.getSite().getCharset()); pageProcessor2.getSite().setSleepTime(500); Spider.create(pageProcessor2).pipeline(new FilePipeline()).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); From 4ce808573d97420425a8e48330fd4b8a9ed1cbe9 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 18 Jul 2013 17:22:26 +0800 Subject: [PATCH 042/175] add retry --- .gitignore | 1 + webmagic-core/pom.xml | 2 +- .../main/java/us/codecraft/webmagic/Site.java | 19 +++++++ .../downloader/HttpClientDownloader.java | 28 ++++++++-- webmagic-samples/pom.xml | 32 +++++++++++ .../samples/DianpingIndexProcessor.java | 53 +++++++++++++++++++ .../webmagic/samples/DianpingProcessor.java | 30 ++++++----- .../webmagic/samples/GlobalProcessor.java | 13 +++-- .../webmagic/samples/GuoxueProcessor.java | 20 +++++++ .../processor/DiaoyuwengProcessorTest.java | 2 - 10 files changed, 175 insertions(+), 25 deletions(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java diff --git a/.gitignore b/.gitignore index 0af075f75..cd33b6188 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target/* *.iml +out/ diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index c0ef6a16f..df482f725 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -12,7 +12,7 @@ org.apache.httpcomponents httpclient - 4.2.1 + 4.2.4 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 676584ad5..2c6118c75 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -24,6 +24,8 @@ public class Site { private int sleepTime = 3000; + private int retryTimes = 0; + private static final Set DEFAULT_STATUS_CODE_SET = new HashSet(); private Set acceptStatCode = DEFAULT_STATUS_CODE_SET; @@ -183,6 +185,23 @@ public int getSleepTime() { return sleepTime; } + /** + * 获取重新下载的次数,默认为0 + * @return 重新下载的次数 + */ + public int getRetryTimes() { + return retryTimes; + } + + /** + * 设置获取重新下载的次数,默认为0 + * @return this + */ + public Site setRetryTimes(int retryTimes) { + this.retryTimes = retryTimes; + return this; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index d2c2d62e7..e4ae0ff6e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -16,11 +16,13 @@ import us.codecraft.webmagic.selector.PlainText; import us.codecraft.webmagic.utils.UrlUtils; +import java.io.IOException; + /** * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午12:15 + * Date: 13-4-21 + * Time: 下午12:15 */ public class HttpClientDownloader implements Downloader { @@ -34,11 +36,27 @@ public Page download(Request request, Task task) { String charset = site.getCharset(); try { HttpGet httpGet = new HttpGet(request.getUrl()); - HttpResponse httpResponse = httpClient.execute(httpGet); + HttpResponse httpResponse = null; + int tried = 0; + boolean retry; + do { + try { + httpResponse = httpClient.execute(httpGet); + retry = false; + } catch (IOException e) { + tried++; + if (tried > site.getRetryTimes()) { + logger.warn("download page " + request.getUrl() + " error", e); + return null; + } + logger.info("download page " + request.getUrl() + " error, retry the "+tried+" time!"); + retry = true; + } + } while (retry); int statusCode = httpResponse.getStatusLine().getStatusCode(); if (site.getAcceptStatCode().contains(statusCode)) { //charset - if (charset == null){ + if (charset == null) { String value = httpResponse.getEntity().getContentType().getValue(); charset = new PlainText(value).regex("charset=([^\\s]+)").toString(); } @@ -52,7 +70,7 @@ public Page download(Request request, Task task) { page.setRequest(request); return page; } else { - logger.warn("code error " + statusCode); + logger.warn("code error " + statusCode + "\t" + request.getUrl()); } } catch (Exception e) { logger.warn("download page " + request.getUrl() + " error", e); diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index 4e345a286..f1f680667 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -39,6 +39,25 @@ 1.6 + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + false + false + true + + + + org.apache.maven.plugins maven-resources-plugin @@ -70,6 +89,19 @@ + + org.apache.maven.plugins + maven-jar-plugin + + + + true + ./lib/ + us.codecraft.webmagic.samples.DianpingIndexProcessor + + + + org.apache.maven.plugins maven-release-plugin diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java new file mode 100644 index 000000000..1f5da5187 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java @@ -0,0 +1,53 @@ +package us.codecraft.webmagic.samples; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.processor.PageProcessor; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author code4crafter@gmail.com
      + * Date: 13-4-21 Time: 下午8:08 + */ +public class DianpingIndexProcessor implements PageProcessor { + @Override + public void process(Page page) { + if (page.getUrl().toString().equals("http://www.dianping.com/citylist")) { + page.addTargetRequests(page.getHtml().links().regex("http://www\\.dianping\\.com/\\w+$").toStrings()); + return; + } + Pattern p = Pattern.compile("http://www\\.dianping\\.com/\\w+"); + Matcher matcher = p.matcher(page.getUrl().toString()); + if (matcher.matches()) { + page.addTargetRequests(page.getHtml().xpath("//li[@class='term-list-item']//a/@href").regex("http://www\\.dianping\\.com/search/.*").toStrings()); + } else { + p = Pattern.compile("http://www\\.dianping\\.com/search/.*"); + matcher = p.matcher(page.getUrl().toString()); + if (matcher.matches()) { + String result = page.getHtml().regex("您要查看的内容不存在").toString(); + if (result != null) { + System.err.println("No!Url not exist!" + page.getUrl()); + } + } + } + } + + @Override + public Site getSite() { + return Site.me().setDomain("www.dianping.com").addStartUrl("http://www.dianping.com/citylist") + .setSleepTime(0).setUserAgent("I'm a performance tester created by yihua.huang"); + } + + public static void main(String[] args) { + int sleepTime = 0; + if (args.length > 0) { + sleepTime = Integer.parseInt(args[0]); + } + DianpingIndexProcessor dianpingProcessor = new DianpingIndexProcessor(); + dianpingProcessor.getSite().setSleepTime(sleepTime); + Spider.create(dianpingProcessor).thread(10).run(); + } +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index 33ac3d786..056da0aae 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.samples; -import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; @@ -9,30 +9,36 @@ /** * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午8:08 + * Date: 13-4-21 + * Time: 下午8:08 */ public class DianpingProcessor implements PageProcessor { + + private Site site; + @Override public void process(Page page) { - List requests = page.getHtml().links().regex(".*shop.*").toStrings(); + List requests = page.getHtml().links().regex("http://info-search-web121361\\.alpha\\.dp:8080/search/.*").toStrings(); page.addTargetRequests(requests); - requests = page.getHtml().regex(".*search/category/.*").toStrings(); - page.addTargetRequests(requests); - if (page.getUrl().toString().contains("shop")) { - page.putField("title", page.getHtml().xpath("//h1[@class='shop-title']")); - page.putField("content", page.getHtml().smartContent()); - } } @Override public Site getSite() { - return Site.me().setDomain("www.dianping.com").addStartUrl("http://www.dianping.com/"). - setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); + if (site == null) { + site = Site.me().setDomain("info-search-web361.alpha.dp:8080").addStartUrl("http://info11-search-web361.alpha.dp:8080/search/category/1/0"). + setSleepTime(100). + setUserAgent("I'm a performance tester created by yihua.huang"); + } + return site; } public static void main(String[] args) { + int sleepTime = 0; + if (args.length > 0) { + sleepTime = Integer.parseInt(args[0]); + } DianpingProcessor dianpingProcessor = new DianpingProcessor(); + dianpingProcessor.getSite().setSleepTime(sleepTime).setRetryTimes(10); Spider.create(dianpingProcessor).run(); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java index 07f0101a1..383422f62 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java @@ -22,7 +22,7 @@ public class GlobalProcessor implements PageProcessor { @Override public void process(Page page) { - final List requests = page.getHtml().links().regex(".*book\\.douban\\.com.*").toStrings(); + final List requests = page.getHtml().links().toStrings(); page.addTargetRequests(requests); } @@ -30,16 +30,19 @@ public void process(Page page) { @Override public Site getSite() { if (site==null){ - site = Site.me().setDomain("douban.com").addStartUrl("http://book.douban.com/").setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); + site = Site.me().setDomain("www.2345.com") + .addStartUrl("http://www.2345.com/").addStartUrl("http://hao.360.cn/") + .addStartUrl("http://www.baidu.com/s?wd=%E7%BD%91%E7%AB%99%E5%AF%BC%E8%88%AA&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=80039098_oem_dg&rsv_n=2&rsv_sug3=6&rsv_sug4=698&rsv_sug=0&rsv_sug1=3") + .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } return site; } public static void main(String[] args) { Spider.create(new GlobalProcessor()).thread(10) - .scheduler(new FileCacheQueueScheduler("/data/webmagic/github")) - .downloader(new FileDownloader("/data/webmagic/douban", new HttpClientDownloader())) - .pipeline(new FilePipeline("/data/webmagic/douban")) + .scheduler(new FileCacheQueueScheduler("/data/webmagic/test")) + .downloader(new FileDownloader("/data/webmagic/test", new HttpClientDownloader())) + .pipeline(new FilePipeline("/data/webmagic/test")) .run(); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java new file mode 100644 index 000000000..54d995e59 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java @@ -0,0 +1,20 @@ +package us.codecraft.webmagic.samples; + +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.pipeline.FilePipeline; +import us.codecraft.webmagic.processor.SimplePageProcessor; +import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-14
      + * Time: 上午8:33
      + */ +public class GuoxueProcessor { + + public static void main(String[] args) { + SimplePageProcessor simplePageProcessor = new SimplePageProcessor("http://www.guoxue123.cn/", "http://www.guoxue123.cn/*"); + simplePageProcessor.getSite().setCharset("GBK").setSleepTime(500); + Spider.create(simplePageProcessor).pipeline(new FilePipeline("/data/webmagic/")).scheduler(new FileCacheQueueScheduler("/data/webmagic/")).run(); + } +} diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 33bcf9c61..5680d1237 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -1,6 +1,5 @@ package us.codecraft.webmagic.processor; -import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; @@ -17,7 +16,6 @@ */ public class DiaoyuwengProcessorTest { - @Ignore @Test public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); From 0ac2bded860e5505b371bf95d9f51ce37a8a7874 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 18 Jul 2013 18:12:16 +0800 Subject: [PATCH 043/175] remove --- .gitignore | 1 + .../samples/DianpingIndexProcessor.java | 53 ------------------- 2 files changed, 1 insertion(+), 53 deletions(-) delete mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java diff --git a/.gitignore b/.gitignore index cd33b6188..c28a71a54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ target/* *.iml out/ +Dianping*.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java deleted file mode 100644 index 1f5da5187..000000000 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingIndexProcessor.java +++ /dev/null @@ -1,53 +0,0 @@ -package us.codecraft.webmagic.samples; - -import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.processor.PageProcessor; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author code4crafter@gmail.com
      - * Date: 13-4-21 Time: 下午8:08 - */ -public class DianpingIndexProcessor implements PageProcessor { - @Override - public void process(Page page) { - if (page.getUrl().toString().equals("http://www.dianping.com/citylist")) { - page.addTargetRequests(page.getHtml().links().regex("http://www\\.dianping\\.com/\\w+$").toStrings()); - return; - } - Pattern p = Pattern.compile("http://www\\.dianping\\.com/\\w+"); - Matcher matcher = p.matcher(page.getUrl().toString()); - if (matcher.matches()) { - page.addTargetRequests(page.getHtml().xpath("//li[@class='term-list-item']//a/@href").regex("http://www\\.dianping\\.com/search/.*").toStrings()); - } else { - p = Pattern.compile("http://www\\.dianping\\.com/search/.*"); - matcher = p.matcher(page.getUrl().toString()); - if (matcher.matches()) { - String result = page.getHtml().regex("您要查看的内容不存在").toString(); - if (result != null) { - System.err.println("No!Url not exist!" + page.getUrl()); - } - } - } - } - - @Override - public Site getSite() { - return Site.me().setDomain("www.dianping.com").addStartUrl("http://www.dianping.com/citylist") - .setSleepTime(0).setUserAgent("I'm a performance tester created by yihua.huang"); - } - - public static void main(String[] args) { - int sleepTime = 0; - if (args.length > 0) { - sleepTime = Integer.parseInt(args[0]); - } - DianpingIndexProcessor dianpingProcessor = new DianpingIndexProcessor(); - dianpingProcessor.getSite().setSleepTime(sleepTime); - Spider.create(dianpingProcessor).thread(10).run(); - } -} From 9e391fbe05d286e5bc6f01e2e2725a6e45ebe9cb Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 18 Jul 2013 18:23:15 +0800 Subject: [PATCH 044/175] ignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index c28a71a54..cd33b6188 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ target/* *.iml out/ -Dianping*.java From 5708b6e9c325e703d866fbbd68d9cb2e288bf364 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 19 Jul 2013 12:34:22 +0800 Subject: [PATCH 045/175] +sina blog --- .../webmagic/selector/XpathSelectorTest.java | 1 + .../codecraft/webmagic/samples/SinaBlogProcesser.java | 11 ++++++++--- .../webmagic/processor/DiaoyuwengProcessorTest.java | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index bebbb83dc..e13b80978 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1351,6 +1351,7 @@ public void test() { public void testOschina() { Html html1 = new Html(html); Assert.assertEquals("再次吐槽easyui", html1.xpath(".//*[@class='QTitle']/h1/a").toString()); + System.out.println(html1.regex("(.*?)").links().toStrings()); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java index bb77931fe..baa375d81 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java @@ -1,7 +1,8 @@ package us.codecraft.webmagic.samples; -import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; /** @@ -15,7 +16,7 @@ public class SinaBlogProcesser implements PageProcessor { @Override public void process(Page page) { - page.addTargetRequests(page.getHtml().links().regex("(http://blog\\.sina\\.com\\.cn/s/blog_.*)").toStrings()); + page.addTargetRequests(page.getHtml().xpath("//div[@class='articalfrontback SG_j_linedot1 clearfix']").links().toStrings()); page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2")); page.putField("content",page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']")); page.putField("id",page.getUrl().regex("http://blog\\.sina\\.com\\.cn/s/blog_(\\w+)")); @@ -26,9 +27,13 @@ public void process(Page page) { @Override public Site getSite() { if (site==null){ - site = Site.me().setDomain("blog.sina.com.cn").addStartUrl("http://blog.sina.com.cn/flashsword20").setSleepTime(3000). + site = Site.me().setDomain("blog.sina.com.cn").addStartUrl("http://blog.sina.com.cn/s/blog_4701280b0102egl0.html").setSleepTime(3000). setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); } return site; } + + public static void main(String[] args) { + Spider.create(new SinaBlogProcesser()).run(); + } } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 5680d1237..33bcf9c61 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.processor; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; @@ -16,6 +17,7 @@ */ public class DiaoyuwengProcessorTest { + @Ignore @Test public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); From a5b58bc8fb091863287a4e3cda4d44fa27e5a12b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 20 Jul 2013 08:34:18 +0800 Subject: [PATCH 046/175] invite jsoup and cssselector --- webmagic-core/pom.xml | 6 +++ .../java/us/codecraft/webmagic/Spider.java | 2 + .../webmagic/selector/CssSelector.java | 47 +++++++++++++++++++ .../us/codecraft/webmagic/selector/Html.java | 6 +++ .../webmagic/selector/PlainText.java | 5 ++ .../webmagic/selector/Selectable.java | 8 ++++ .../java/us/codecraft/webmagic/HtmlTest.java | 1 + .../webmagic/selector/XpathSelectorTest.java | 2 +- 8 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index df482f725..7d787aa85 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -52,6 +52,12 @@ 2.4
      + + org.jsoup + jsoup + 1.7.2 + + org.apache.commons commons-io diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index b2a2fa6b1..1288ff8ed 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -154,9 +154,11 @@ public void run() { request = scheduler.poll(this); } } else { + //multi thread final AtomicInteger threadAlive = new AtomicInteger(0); while (true) { if (request == null) { + //when no request found but some thread is alive, sleep a while. try { Thread.sleep(100); } catch (InterruptedException e) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java new file mode 100644 index 000000000..c2d654af5 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java @@ -0,0 +1,47 @@ +package us.codecraft.webmagic.selector; + +import org.apache.commons.collections.CollectionUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author code4crafter@gmail.com
      + * Date: 13-4-21 + * Time: 上午9:39 + */ +public class CssSelector implements Selector { + + private String selectorText; + + public CssSelector(String selectorText) { + this.selectorText = selectorText; + } + + @Override + public String select(String text) { + Document doc = Jsoup.parse(text); + Elements elements = doc.select(selectorText); + if (CollectionUtils.isNotEmpty(elements)) { + return null; + } + return elements.get(0).outerHtml(); + } + + @Override + public List selectList(String text) { + List strings = new ArrayList(); + Document doc = Jsoup.parse(text); + Elements elements = doc.select(selectorText); + if (CollectionUtils.isNotEmpty(elements)) { + for (Element element : elements) { + strings.add(element.outerHtml()); + } + } + return strings; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 0b3637267..099f50746 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -62,4 +62,10 @@ public Selectable xpath(String xpath) { return selectList(xpathSelector, strings); } + @Override + public Selectable $(String selector) { + CssSelector cssSelector = new CssSelector(selector); + return selectList(cssSelector,strings); + } + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index cedee6301..0137de814 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -33,6 +33,11 @@ public Selectable xpath(String xpath) { throw new UnsupportedOperationException(); } + @Override + public Selectable $(String selector) { + throw new UnsupportedOperationException(); + } + @Override public Selectable smartContent() { throw new UnsupportedOperationException(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 630808d3b..f4aa9a530 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -17,6 +17,14 @@ public interface Selectable { */ public Selectable xpath(String xpath); + /** + * select list with jquery selector + * + * @param + * @return + */ + public Selectable $(String selector); + /** * select smart content with ReadAbility algorithm * diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java index fcdbfeffa..c90001460 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/HtmlTest.java @@ -17,4 +17,5 @@ public void testRegexSelector() { Assert.assertEquals("abbabbab", (selectable.regex("(.*)").replace("aa(a)", "$1bb").toString())); } + } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index e13b80978..3ef0a9279 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1351,7 +1351,7 @@ public void test() { public void testOschina() { Html html1 = new Html(html); Assert.assertEquals("再次吐槽easyui", html1.xpath(".//*[@class='QTitle']/h1/a").toString()); - System.out.println(html1.regex("(.*?)").links().toStrings()); + Assert.assertNotNull(html1.$("a[href]").xpath("//@href").toStrings()); } } From 74cd7cab5c54b07c6eec5c0b0e6fea879d49afe5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 18:26:54 +0800 Subject: [PATCH 047/175] update java doc --- .../src/main/java/us/codecraft/webmagic/Page.java | 4 ++-- .../webmagic/downloader/HttpClientDownloader.java | 6 +++--- .../webmagic/pipeline/ConsolePipeline.java | 1 + .../codecraft/webmagic/pipeline/FilePipeline.java | 8 ++++++++ .../us/codecraft/webmagic/pipeline/Pipeline.java | 1 + .../webmagic/processor/PageProcessor.java | 6 ++++-- .../webmagic/processor/SimplePageProcessor.java | 2 ++ .../schedular/FileCacheQueueScheduler.java | 4 +++- .../webmagic/schedular/QueueScheduler.java | 1 + .../us/codecraft/webmagic/schedular/Scheduler.java | 12 ++++++++++++ .../us/codecraft/webmagic/schedular/package.html | 2 +- .../codecraft/webmagic/selector/CssSelector.java | 1 + .../codecraft/webmagic/selector/RegexResult.java | 1 + .../us/codecraft/webmagic/selector/Selectable.java | 2 +- .../codecraft/webmagic/selector/XpathSelector.java | 9 +++++---- .../java/us/codecraft/webmagic/utils/UrlUtils.java | 14 ++++++++++---- .../us/codecraft/webmagic/utils/UrlUtilsTest.java | 11 +++++------ .../codecraft/webmagic/FreemarkerPipelineTest.java | 2 +- 18 files changed, 62 insertions(+), 25 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index 5b1ceaf41..b2dd3db71 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -101,7 +101,7 @@ public void addTargetRequests(List requests) { if (StringUtils.isBlank(s) || s.equals("#") || s.startsWith("javascript:")) { break; } - s = UrlUtils.fixRelativeUrl(s, url.toString()); + s = UrlUtils.canonicalizeUrl(s, url.toString()); targetRequests.add(new Request(s)); } } @@ -116,7 +116,7 @@ public void addTargetRequest(String requestString) { return; } synchronized (targetRequests) { - requestString = UrlUtils.fixRelativeUrl(requestString, url.toString()); + requestString = UrlUtils.canonicalizeUrl(requestString, url.toString()); targetRequests.add(new Request(requestString)); } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index e4ae0ff6e..ac3ea0fb0 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -58,7 +58,7 @@ public Page download(Request request, Task task) { //charset if (charset == null) { String value = httpResponse.getEntity().getContentType().getValue(); - charset = new PlainText(value).regex("charset=([^\\s]+)").toString(); + charset = UrlUtils.getCharset(value); } // handleGzip(httpResponse); @@ -82,8 +82,8 @@ private void handleGzip(HttpResponse httpResponse) { Header ceheader = httpResponse.getEntity().getContentEncoding(); if (ceheader != null) { HeaderElement[] codecs = ceheader.getElements(); - for (int i = 0; i < codecs.length; i++) { - if (codecs[i].getName().equalsIgnoreCase("gzip")) { + for (HeaderElement codec : codecs) { + if (codec.getName().equalsIgnoreCase("gzip")) { httpResponse.setEntity( new GzipDecompressingEntity(httpResponse.getEntity())); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 6c2abba8f..dff2ded75 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -7,6 +7,7 @@ import java.util.Map; /** + * 命令行输出抽取结果。可用于测试。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:45 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index b079dcc40..e48e2bb44 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -11,6 +11,7 @@ import java.io.PrintWriter; /** + * 持久化到文件的接口。 * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午6:28 @@ -21,10 +22,17 @@ public class FilePipeline implements Pipeline { private Logger logger = Logger.getLogger(getClass()); + /** + * 新建一个FilePipeline,使用默认保存路径"/data/temp/webmagic/" + */ public FilePipeline() { } + /** + * 新建一个FilePipeline + * @param path 文件保存路径 + */ public FilePipeline(String path) { this.path = path; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java index 1be447c45..408392d9a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java @@ -4,6 +4,7 @@ import us.codecraft.webmagic.Task; /** + * Pipeline是数据离线处理和持久化的接口。通过实现Pipeline以实现不同的持久化方式(例如保存到数据库)。 * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:39 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java index c36ae980d..3963d0805 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/PageProcessor.java @@ -4,6 +4,8 @@ import us.codecraft.webmagic.Site; /** + * 定制爬虫的核心接口。通过实现PageProcessor可以实现一个定制的爬虫。
      + * extends the class to implements various spiders.
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午11:42 @@ -11,13 +13,13 @@ public interface PageProcessor { /** - * extends the class to implements variaty spiders + * 定义如何处理页面,包括链接提取、内容抽取等。 * @param page */ public void process(Page page); /** - * the site the processor for + * 定义任务一些配置信息,例如开始链接、抓取间隔、自定义cookie、自定义UA等。 * @return site */ public Site getSite(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index 0d5244629..47d3748b9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -7,6 +7,7 @@ import java.util.List; /** + * 非常简单的抽取器。链接抽取使用定义的通配符,并保存抽取整个内容到content字段。
      * @author code4crafter@gmail.com
      * Date: 13-4-22 * Time: 下午9:15 @@ -22,6 +23,7 @@ public class SimplePageProcessor implements PageProcessor { public SimplePageProcessor(String startUrl, String urlPattern) { this.site = Site.me().addStartUrl(startUrl). setDomain(UrlUtils.getDomain(startUrl)).setUserAgent(UA); + //compile "*" expression to regex this.urlPattern = "("+urlPattern.replace(".","\\.").replace("*","[^\"'#]*")+")"; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java index 1f5298a00..77a6c0b35 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java @@ -16,6 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** + * 磁盘文件实现的安全Scheduler,可以保证在长时间执行的任务中断后,下次启动从中断位置重新开始。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:13 @@ -91,6 +92,7 @@ private void readFile() { readCursorFile(); readUrlFile(); } catch (IOException e) { + logger.error("init file error",e); } } @@ -109,7 +111,7 @@ private void readUrlFile() throws IOException { private void readCursorFile() throws IOException { BufferedReader fileCursorReader = new BufferedReader(new FileReader(getFileName(fileCursor))); - String line = null; + String line; //read the last number while ((line = fileCursorReader.readLine()) != null) { cursor = new AtomicInteger(NumberUtils.toInt(line)); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java index 697688596..613e4062c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java @@ -10,6 +10,7 @@ import java.util.concurrent.LinkedBlockingQueue; /** + * 内存队列实现的线程安全Scheduler。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:13 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java index 7e0213275..bf440baf8 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java @@ -4,14 +4,26 @@ import us.codecraft.webmagic.Task; /** + * 包含url管理和调度的接口。包括url抓取队列,url去重等功能。
      + * Scheduler的接口包含一个Task参数,该参数是为单Scheduler多Task预留的(Spider就是一个Task)。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:12 */ public interface Scheduler { + /** + * 加入一个待抓取的链接 + * @param request 待抓取的链接 + * @param task 定义的任务,以满足单Scheduler多Task的情况 + */ public void push(Request request,Task task); + /** + * 返回下一个要抓取的链接 + * @param task 定义的任务,以满足单Scheduler多Task的情况 + * @return + */ public Request poll(Task task); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html index 0e35610fe..7887dd536 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html @@ -1,5 +1,5 @@ -包含url管理和调度的接口Schedular及它的几个实现类。 +包含url管理和调度的接口Scheduler及它的几个实现类。 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java index c2d654af5..10dfb6230 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java @@ -10,6 +10,7 @@ import java.util.List; /** + * css风格的选择器。包装了Jsoup。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午9:39 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java index 9f4e2f060..04467bcce 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexResult.java @@ -1,6 +1,7 @@ package us.codecraft.webmagic.selector; /** + * 封装正则表达式抽取接口的类。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:39 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index f4aa9a530..932115cdf 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -18,7 +18,7 @@ public interface Selectable { public Selectable xpath(String xpath); /** - * select list with jquery selector + * select list with css selector * * @param * @return diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java index c2b408eb3..02afe2912 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/XpathSelector.java @@ -6,6 +6,7 @@ import java.util.List; /** + * xpath的选择器。包装了HtmlCleaner。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午9:39 @@ -52,12 +53,12 @@ public List selectList(String text) { try { Object[] objects = tagNode.evaluateXPath(xpathStr); if (objects != null && objects.length >= 1) { - for (int i = 0; i < objects.length; i++) { - if (objects[i] instanceof TagNode) { - TagNode tagNode1 = (TagNode) objects[i]; + for (Object object : objects) { + if (object instanceof TagNode) { + TagNode tagNode1 = (TagNode) object; results.add(htmlCleaner.getInnerHtml(tagNode1)); } else { - results.add(objects[i].toString()); + results.add(object.toString()); } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java index 667aaf25f..0b7201d61 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java @@ -14,7 +14,13 @@ public class UrlUtils { private static Pattern relativePathPattern = Pattern.compile("^([\\.]+)/"); - public static String fixRelativeUrl(String url, String refer) { + /** + * 将url想对地址转化为绝对地址 + * @param url url地址 + * @param refer url地址来自哪个页面 + * @return + */ + public static String canonicalizeUrl(String url, String refer) { if (StringUtils.isBlank(url) || StringUtils.isBlank(refer)) { return url; } @@ -62,12 +68,12 @@ public static String getHost(String url) { private static Pattern patternForProtocal = Pattern.compile("[\\w]+://"); - public static String removeProtocal(String url) { + public static String removeProtocol(String url) { return patternForProtocal.matcher(url).replaceAll(""); } public static String getDomain(String url) { - String domain = removeProtocal(url); + String domain = removeProtocol(url); int i = StringUtils.indexOf(domain, "/", 1); if (i > 0) { domain = StringUtils.substring(domain, 0, i); @@ -84,7 +90,7 @@ public static String fixAllRelativeHrefs(String html, String url) { while (matcher.find()) { stringBuilder.append(StringUtils.substring(html, lastEnd, matcher.start())); stringBuilder.append(matcher.group(1)); - stringBuilder.append("\"" + fixRelativeUrl(matcher.group(2), url) + "\""); + stringBuilder.append("\"").append(canonicalizeUrl(matcher.group(2), url)).append("\""); lastEnd = matcher.end(); } stringBuilder.append(StringUtils.substring(html, lastEnd)); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java index 4cfdc046b..cd55b2c77 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java @@ -12,18 +12,18 @@ public class UrlUtilsTest { @Test public void testFixRelativeUrl() { - String fixrelativeurl = UrlUtils.fixRelativeUrl("aa", "http://www.dianping.com/sh/ss/com"); + String fixrelativeurl = UrlUtils.canonicalizeUrl("aa", "http://www.dianping.com/sh/ss/com"); System.out.println("fix: " + fixrelativeurl); Assert.assertEquals("http://www.dianping.com/sh/ss/aa", fixrelativeurl); - fixrelativeurl = UrlUtils.fixRelativeUrl("../aa", "http://www.dianping.com/sh/ss/com"); + fixrelativeurl = UrlUtils.canonicalizeUrl("../aa", "http://www.dianping.com/sh/ss/com"); Assert.assertEquals("http://www.dianping.com/sh/aa", fixrelativeurl); - fixrelativeurl = UrlUtils.fixRelativeUrl("..../aa", "http://www.dianping.com/sh/ss/com"); + fixrelativeurl = UrlUtils.canonicalizeUrl("..../aa", "http://www.dianping.com/sh/ss/com"); Assert.assertEquals("http://www.dianping.com/aa", fixrelativeurl); - fixrelativeurl = UrlUtils.fixRelativeUrl(".../aa", "http://www.dianping.com/sh/ss/com"); + fixrelativeurl = UrlUtils.canonicalizeUrl(".../aa", "http://www.dianping.com/sh/ss/com"); Assert.assertEquals("http://www.dianping.com/aa", fixrelativeurl); - fixrelativeurl = UrlUtils.fixRelativeUrl("..aa", "http://www.dianping.com/sh/ss/com"); + fixrelativeurl = UrlUtils.canonicalizeUrl("..aa", "http://www.dianping.com/sh/ss/com"); Assert.assertEquals("http://www.dianping.com/sh/ss/..aa", fixrelativeurl); // fixrelativeurl = fixrelativeurl("/aa", "http://www.dianping.com"); // System.out.println("fix: " + fixrelativeurl); @@ -628,7 +628,6 @@ public void testFixRelativeHtml(){ "\t\t\t\n" + "\n"; String newHtml = UrlUtils.fixAllRelativeHrefs(html, "http://www.huxiu.com/"); - String text = "订阅虎嗅"; Assert.assertTrue(html.contains(" Date: Wed, 24 Jul 2013 19:49:00 +0800 Subject: [PATCH 048/175] update java docs --- .../main/java/us/codecraft/webmagic/schedular/Scheduler.java | 2 +- .../src/main/java/us/codecraft/webmagic/selector/Html.java | 1 + .../main/java/us/codecraft/webmagic/selector/PlainText.java | 1 + .../java/us/codecraft/webmagic/selector/RegexSelector.java | 1 + .../java/us/codecraft/webmagic/selector/ReplaceSelector.java | 1 + .../main/java/us/codecraft/webmagic/selector/Selectable.java | 5 +++-- .../main/java/us/codecraft/webmagic/selector/Selector.java | 1 + .../java/us/codecraft/webmagic/selector/SelectorFactory.java | 1 + .../main/java/us/codecraft/webmagic/utils/ThreadUtils.java | 1 + .../src/main/java/us/codecraft/webmagic/utils/UrlUtils.java | 3 ++- 10 files changed, 13 insertions(+), 4 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java index bf440baf8..8d9649be1 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java @@ -22,7 +22,7 @@ public interface Scheduler { /** * 返回下一个要抓取的链接 * @param task 定义的任务,以满足单Scheduler多Task的情况 - * @return + * @return 下一个要抓取的链接 */ public Request poll(Task task); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 099f50746..114eef996 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -4,6 +4,7 @@ import java.util.List; /** + * 可抽取的html文本。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:54 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index 0137de814..9e8d19418 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -6,6 +6,7 @@ import java.util.List; /** + * 可抽取的纯文本,不包括xpath和css selector实现。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:54 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java index 49fbffd0b..e95138b7a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/RegexSelector.java @@ -9,6 +9,7 @@ import java.util.regex.PatternSyntaxException; /** + * 正则表达式抽取器。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:09 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java index 1ce7c4d59..38b95f787 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/ReplaceSelector.java @@ -6,6 +6,7 @@ import java.util.regex.PatternSyntaxException; /** + * 对文本进行替换。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:09 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 932115cdf..1b0ba10a3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -3,6 +3,7 @@ import java.util.List; /** + * 可进行抽取的文本。
      * @author code4crafter@gmail.com
      * Date: 13-4-20 * Time: 下午7:51 @@ -20,8 +21,8 @@ public interface Selectable { /** * select list with css selector * - * @param - * @return + * @param selector css selector expression + * @return new Selectable after extract */ public Selectable $(String selector); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java index f7771cfbd..845c0b6c5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java @@ -3,6 +3,7 @@ import java.util.List; /** + * 抽取器。
      * @author code4crafter@gmail.com
      * Date: 13-4-20 * Time: 下午8:02 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java index 2fa78d323..1dd56e01c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java @@ -7,6 +7,7 @@ import java.util.concurrent.ConcurrentHashMap; /** + * 产生selector的工厂。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 上午7:56 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java index ebe61198d..d6876c719 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/ThreadUtils.java @@ -6,6 +6,7 @@ import java.util.concurrent.TimeUnit; /** + * 线程工具类。
      * @author code4crafer@gmail.com * Date: 13-6-23 * Time: 下午7:11 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java index 0b7201d61..9f038bc87 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/UrlUtils.java @@ -6,6 +6,7 @@ import java.util.regex.Pattern; /** + * url及html处理工具类。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:52 @@ -18,7 +19,7 @@ public class UrlUtils { * 将url想对地址转化为绝对地址 * @param url url地址 * @param refer url地址来自哪个页面 - * @return + * @return url绝对地址 */ public static String canonicalizeUrl(String url, String refer) { if (StringUtils.isBlank(url) || StringUtils.isBlank(refer)) { From 68059fef69dd8b1d277d30c603ed18d7cbeb113b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 20:38:49 +0800 Subject: [PATCH 049/175] update java docs --- webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java | 2 +- .../main/java/us/codecraft/webmagic/downloader/Downloader.java | 2 +- .../java/us/codecraft/webmagic/downloader/FileDownloader.java | 1 + .../us/codecraft/webmagic/downloader/HttpClientDownloader.java | 1 + .../codecraft/webmagic/schedular/FileCacheQueueScheduler.java | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 1288ff8ed..57e29b18d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -232,7 +232,7 @@ public void runAsync(){ /** * 建立多个线程下载 * @param threadNum 线程数 - * @return + * @return this */ public Spider thread(int threadNum) { checkIfNotRunning(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java index 9a8bac110..c431fc3b4 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.Task; /** - * Downloader是webmagic下载页面的接口。webmagic默认使用了HttpComponent作为下载器,一般情况,你无需自己实现这个接口。 + * Downloader是webmagic下载页面的接口。webmagic默认使用了HttpComponent作为下载器,一般情况,你无需自己实现这个接口。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:14 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java index b4a49ac37..d22bf0815 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java @@ -12,6 +12,7 @@ import java.io.*; /** + * 使用缓存到本地的文件来模拟下载,可以在Spider框架中仅进行抽取工作。
      * @author code4crafer@gmail.com * Date: 13-6-24 * Time: 上午7:24 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index ac3ea0fb0..7eb627724 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -20,6 +20,7 @@ /** + * 封装了HttpClient的下载器。已实现指定次数重试、处理gzip、自定义UA/cookie等功能。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:15 diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java index 77a6c0b35..f5393a33e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java @@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * 磁盘文件实现的安全Scheduler,可以保证在长时间执行的任务中断后,下次启动从中断位置重新开始。
      + * 磁盘文件实现的url管理模块,可以保证在长时间执行的任务中断后,下次启动从中断位置重新开始。
      * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午1:13 From d998312db72b29daa9e6afa31d902423ffad76b8 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 20:45:45 +0800 Subject: [PATCH 050/175] update version --- webmagic-core/pom.xml | 2 +- webmagic-plugin/pom.xml | 2 +- webmagic-samples/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index 7d787aa85..b0de214cd 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> us.codecraft - 0.0.1-SNAPSHOT + 0.1.0 4.0.0 webmagic-core diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index 0a37a30ce..9add44714 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> us.codecraft - 0.0.1-SNAPSHOT + 0.1.0 4.0.0 webmagic-plugin diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index f1f680667..a921c454e 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> us.codecraft - 0.0.1-SNAPSHOT + 0.1.0 4.0.0 webmagic-samples From 9de17009430f350bc151d1e1538cecf2830ec6fa Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 20:48:58 +0800 Subject: [PATCH 051/175] update docs --- webmagic-plugin/pom.xml | 2 +- webmagic-samples/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index 9add44714..6eb7d615e 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -12,7 +12,7 @@ us.codecraft webmagic-core - 0.0.1-SNAPSHOT + 0.1.0 junit diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index a921c454e..ac2092f6a 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -13,12 +13,12 @@ us.codecraft webmagic-core - 0.0.1-SNAPSHOT + 0.1.0 us.codecraft webmagic-plugin - 0.0.1-SNAPSHOT + 0.1.0 junit From acce8600641661f7a50a01ae9866d6b27d3dec99 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 20:58:37 +0800 Subject: [PATCH 052/175] readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4bd8c7f04..3b8d40b19 100644 --- a/README.md +++ b/README.md @@ -77,10 +77,15 @@ webmagic定制的核心是PageProcessor接口。 Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); +### 技术架构及原理 + +见作者的一篇文章:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796) ### 示例 -可参考作者博客[使用webmagic抓取页面并保存为wordpress文件](http://my.oschina.net/flashsword/blog/136846) +webmagic-samples目录里有一些定制PageProcessor以抽取不同站点的例子。 + +作者还有一个使用webmagic进行抽取并持久化到数据库的项目[JobHunter](http://git.oschina.net/flashsword20/jobhunter)。这个项目整合了Spring,自定义了Pipeline,使用mybatis进行数据持久化。 ### 协议 From 8169923d85927ccbf736c7efdcbc5fa8fe19c378 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 21:09:40 +0800 Subject: [PATCH 053/175] release note --- release-note.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 release-note.md diff --git a/release-note.md b/release-note.md new file mode 100755 index 000000000..893fc86c2 --- /dev/null +++ b/release-note.md @@ -0,0 +1,17 @@ +Release Notes +---- +*2012-7-16* `version:0.1.0` + +第一个稳定版本。 + +修改了若干API,使得可扩展性更强,为每个任务分配一个ID,可以通过ID区分不同任务。 + +增加下载的重试机制,支持gzip,支持自定义UA/cookie。 + +增加jquery形式的CSS Selector API,可以通过`page.getHtml().$("div.body")`形式抽取元素。 + +完善了文档,架构说明:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796),Javadoc:[http://code4craft.github.io/webmagic/docs](http://code4craft.github.io/webmagic/docs)。 + + + + From e9cef8fc4cfe492af25e7e478b0233873d47fa6c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 22:07:54 +0800 Subject: [PATCH 054/175] release --- README.md | 4 ---- release-note.md | 8 +++----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3b8d40b19..ade3b5e4a 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,6 @@ webmagic的发起源于工作中的需要,其定位是帮助开发者更便捷 webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),开发者可以便捷的使用xpath和正则表达式进行链接和内容的提取,只需编写少量代码即可完成一个定制爬虫。 -#### 请注意 - -webmagic正处于开发阶段,目前还没有稳定版本。欢迎开发者参与到webmagic的试用和修改中来。 **如果只是想以外部jar包的方式,引用webmagic并进行自己的业务开发,建议你等待webmagic的第一个稳定版本。** - ###特色### * ####垂直爬虫#### diff --git a/release-note.md b/release-note.md index 893fc86c2..7dbe92a96 100755 --- a/release-note.md +++ b/release-note.md @@ -8,10 +8,8 @@ Release Notes 增加下载的重试机制,支持gzip,支持自定义UA/cookie。 -增加jquery形式的CSS Selector API,可以通过`page.getHtml().$("div.body")`形式抽取元素。 - -完善了文档,架构说明:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796),Javadoc:[http://code4craft.github.io/webmagic/docs](http://code4craft.github.io/webmagic/docs)。 - - +增加多线程抓取功能,只需在初始化的时候指定线程数即可。 +增加jquery形式的CSS Selector API,可以通过`page.getHtml().$("div.body")`形式抽取元素。 +完善了文档,架构说明:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796),Javadoc:[http://code4craft.github.io/webmagic/docs](http://code4craft.github.io/webmagic/docs)。 \ No newline at end of file From 02a7f4e77d39bf8c180a0467a427d0ee23f83e93 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 24 Jul 2013 22:10:48 +0800 Subject: [PATCH 055/175] readme --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ade3b5e4a..78756ac26 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载 Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); * ####可扩展#### - 参考[`scrapy`](https://github.com/scrapy/scrapy)的设计,webmagic将爬虫的扩展点分为Processor、Schedular、Downloader、Pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展Schedular实现断点续传乃至于分布式爬虫;可以通过扩展Pipeline实现业务可定制的持久化功能。 + 参考[`scrapy`](https://github.com/scrapy/scrapy)的设计,webmagic将爬虫的扩展点分为Processor、Schedular、Downloader、Pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展Schedular实现断点续传乃至于分布式爬虫;可以通过扩展Pipeline实现业务可定制的持久化功能。webmagic的架构原理见作者的一篇文章:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796) - +![image](http://code4craft.github.io/images/posts/webmagic.png) ------ @@ -73,9 +73,6 @@ webmagic定制的核心是PageProcessor接口。 Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); -### 技术架构及原理 - -见作者的一篇文章:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796) ### 示例 From 4e3ee63badf3af3cadcffcb8d06db0cbff663858 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 25 Jul 2013 08:20:21 +0800 Subject: [PATCH 056/175] invite redis for distribution --- webmagic-plugin/pom.xml | 5 +++ .../webmagic/scheduler/RedisScheduler.java | 45 +++++++++++++++++++ .../scheduler/RedisSchedulerTest.java | 41 +++++++++++++++++ .../webmagic/samples/GlobalProcessor.java | 13 +++--- 4 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java create mode 100644 webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index 6eb7d615e..634f09d34 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -25,6 +25,11 @@ freemarker 2.3.15 + + redis.clients + jedis + 2.0.0 + diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java new file mode 100644 index 000000000..e87ee3357 --- /dev/null +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -0,0 +1,45 @@ +package us.codecraft.webmagic.scheduler; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.schedular.Scheduler; + +/** + * 使用redis管理url,构建一个分布式的爬虫。
      + * @author yihua.huang@dianping.com
      + * @date: 13-7-25
      + * Time: 上午7:07
      + */ +public class RedisScheduler implements Scheduler{ + + private JedisPool pool; + + private static final String QUEUE_PREFIX = "queue_"; + + private static final String SET_PREFIX = "set_"; + + public RedisScheduler(String host){ + pool = new JedisPool(new JedisPoolConfig(), host); + } + + @Override + public synchronized void push(Request request, Task task) { + Jedis jedis = pool.getResource(); + if (jedis.zrank(SET_PREFIX+task.getUUID(),request.getUrl())==null){ + jedis.rpush(QUEUE_PREFIX+task.getUUID(),request.getUrl()); + jedis.zadd(SET_PREFIX+task.getUUID(),System.currentTimeMillis(),request.getUrl()); + } + pool.returnResource(jedis); + } + + @Override + public synchronized Request poll(Task task) { + Jedis jedis = pool.getResource(); + String url = jedis.lpop(QUEUE_PREFIX+task.getUUID()); + pool.returnResource(jedis); + return new Request(url); + } +} diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java new file mode 100644 index 000000000..0f556d284 --- /dev/null +++ b/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java @@ -0,0 +1,41 @@ +package us.codecraft.webmagic.scheduler; + +import org.junit.Before; +import org.junit.Test; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-25
      + * Time: 上午7:51
      + */ +public class RedisSchedulerTest { + + private RedisScheduler redisScheduler; + + @Before + public void setUp() { + redisScheduler = new RedisScheduler("localhost"); + } + + @Test + public void test() { + Task task = new Task() { + @Override + public String getUUID() { + return "1"; + } + + @Override + public Site getSite() { + return null; + } + }; + redisScheduler.push(new Request("http://www.ibm.com/developerworks/cn/java/j-javadev2-22/"), task); + Request poll = redisScheduler.poll(task); + System.out.println(poll.getUrl()); + + } +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java index 383422f62..f7c5f7fad 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java @@ -3,11 +3,9 @@ import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.downloader.FileDownloader; -import us.codecraft.webmagic.downloader.HttpClientDownloader; import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.PageProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; +import us.codecraft.webmagic.scheduler.RedisScheduler; import java.util.List; @@ -40,9 +38,12 @@ public Site getSite() { public static void main(String[] args) { Spider.create(new GlobalProcessor()).thread(10) - .scheduler(new FileCacheQueueScheduler("/data/webmagic/test")) - .downloader(new FileDownloader("/data/webmagic/test", new HttpClientDownloader())) - .pipeline(new FilePipeline("/data/webmagic/test")) + .scheduler(new RedisScheduler("localhost")) + .pipeline(new FilePipeline("/data/webmagic/test/")) + .runAsync(); + Spider.create(new GlobalProcessor()).thread(10) + .scheduler(new RedisScheduler("localhost")) + .pipeline(new FilePipeline("/data/webmagic/test/")) .run(); } } From 2aee2e0f3efc267d91bbabea4503ae6c2c2ce895 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 25 Jul 2013 13:32:39 +0800 Subject: [PATCH 057/175] update pipeline api --- .../main/java/us/codecraft/webmagic/Page.java | 55 ++-------------- .../us/codecraft/webmagic/ResultItems.java | 64 +++++++++++++++++++ .../java/us/codecraft/webmagic/Spider.java | 2 +- .../webmagic/pipeline/ConsolePipeline.java | 14 ++-- .../webmagic/pipeline/FilePipeline.java | 13 ++-- .../codecraft/webmagic/pipeline/Pipeline.java | 4 +- .../processor/SimplePageProcessor.java | 3 +- .../webmagic/selector/PlainText.java | 6 +- .../webmagic/selector/Selectable.java | 2 +- .../webmagic/selector/XpathSelectorTest.java | 2 +- .../webmagic/pipeline/FreemarkerPipeline.java | 10 +-- .../webmagic/scheduler/RedisScheduler.java | 2 + .../scheduler/RedisSchedulerTest.java | 3 +- .../samples/DiandianBlogProcessor.java | 6 +- .../webmagic/samples/DianpingProcessor.java | 2 +- .../webmagic/samples/DiaoyuwengProcessor.java | 4 +- .../webmagic/samples/F58PageProcesser.java | 2 +- .../webmagic/samples/GlobalProcessor.java | 2 +- .../webmagic/samples/HuxiuProcessor.java | 2 +- .../webmagic/samples/MeicanProcessor.java | 4 +- .../webmagic/samples/NjuBBSProcessor.java | 2 +- .../samples/OschinaBlogPageProcesser.java | 2 +- .../samples/OschinaPageProcesser.java | 2 +- .../webmagic/samples/QzoneBlogProcessor.java | 2 +- .../webmagic/samples/SinaBlogProcesser.java | 2 +- .../webmagic/samples/TianyaPageProcesser.java | 2 +- 26 files changed, 119 insertions(+), 95 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index b2dd3db71..40f17f0aa 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -6,8 +6,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; /** *
      @@ -27,7 +25,7 @@ public class Page {
       
           private Request request;
       
      -    private Map fields = new ConcurrentHashMap();
      +    private ResultItems resultItems = new ResultItems();
       
           private Selectable html;
       
      @@ -35,44 +33,16 @@ public class Page {
       
           private List targetRequests = new ArrayList();
       
      -    private boolean skip;
      -
      -    private Object extra;
      -
      -    /**
      -     * 是否忽略这个页面,用于pipeline来判断是否对这个页面进行处理
      -     * @return 是否忽略 true 忽略
      -     */
      -    public boolean isSkip() {
      -        return skip;
      -    }
      -
      -    /**
      -     * 设置是否忽略这个页面,用于pipeline来判断是否对这个页面进行处理
      -     * @param skip 是否忽略 true 忽略
      -     */
      -    public void setSkip(boolean skip) {
      -        this.skip = skip;
      -    }
      -
           public Page() {
           }
       
      -    /**
      -     * 获取抽取的结果,在{@link us.codecraft.webmagic.pipeline.Pipeline} 中调用
      -     * @return fields 抽取的结果
      -     */
      -    public Map getFields() {
      -        return fields;
      -    }
      -
           /**
            * 保存抽取的结果
            * @param key 结果的key
            * @param field 结果的value
            */
      -    public void putField(String key, Selectable field) {
      -        fields.put(key, field);
      +    public void putField(String key, Object field) {
      +        resultItems.put(key, field);
           }
       
           /**
      @@ -157,23 +127,10 @@ public Request getRequest() {
       
           public void setRequest(Request request) {
               this.request = request;
      +        this.resultItems.setRequest(request);
           }
       
      -    /**
      -     * 获取附加对象
      -     * @param  对象类型
      -     * @return 对象内容
      -     */
      -    public  T getExtra() {
      -        return (T)extra;
      -    }
      -
      -    /**
      -     * 设置附加对象
      -     * @param extra 对象内容
      -     * @param  对象类型
      -     */
      -    public  void setExtra(T extra) {
      -        this.extra = extra;
      +    public ResultItems getResultItems() {
      +        return resultItems;
           }
       }
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java b/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java
      new file mode 100644
      index 000000000..0c1d94c5b
      --- /dev/null
      +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java
      @@ -0,0 +1,64 @@
      +package us.codecraft.webmagic;
      +
      +import java.util.HashMap;
      +import java.util.Map;
      +
      +/**
      + * 保存抽取结果的类,由PageProcessor处理得到,传递给{@link us.codecraft.webmagic.pipeline.Pipeline}进行持久化。
      + * @author yihua.huang@dianping.com
      + * @date: 13-7-25
      + * Time: 下午12:20
      + */ +public class ResultItems { + + private Map fields = new HashMap(); + + private Request request; + + private boolean skip; + + public T get(String key) { + Object o = fields.get(key); + if (o == null) { + return null; + } + return (T) fields.get(key); + } + + public Map getAll() { + return fields; + } + + public ResultItems put(String key, T value) { + fields.put(key, value); + return this; + } + + public Request getRequest() { + return request; + } + + public ResultItems setRequest(Request request) { + this.request = request; + return this; + } + + /** + * 是否忽略这个页面,用于pipeline来判断是否对这个页面进行处理 + * @return 是否忽略 true 忽略 + */ + public boolean isSkip() { + return skip; + } + + + /** + * 设置是否忽略这个页面,用于pipeline来判断是否对这个页面进行处理 + * @param skip + * @return this + */ + public ResultItems setSkip(boolean skip) { + this.skip = skip; + return this; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 57e29b18d..a51ed9601 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -196,7 +196,7 @@ private void processRequest(Request request) { pageProcessor.process(page); addRequest(page); for (Pipeline pipeline : pipelines) { - pipeline.process(page, this); + pipeline.process(page.getResultItems(), this); } sleep(site.getSleepTime()); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index dff2ded75..72c3bf3ff 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -1,8 +1,7 @@ package us.codecraft.webmagic.pipeline; -import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; -import us.codecraft.webmagic.selector.Selectable; import java.util.Map; @@ -15,13 +14,10 @@ public class ConsolePipeline implements Pipeline{ @Override - public void process(Page page,Task task) { - System.out.println("get page: "+page.getUrl()); - for (Map.Entry entry : page.getFields().entrySet()) { - System.out.println(entry.getKey()+":\t"+entry.getValue().toStrings()); - } - if (page.getExtra()!=null){ - System.out.println(page.getExtra()); + public void process(ResultItems resultItems,Task task) { + System.out.println("get page: "+resultItems.getRequest().getUrl()); + for (Map.Entry entry : resultItems.getAll().entrySet()) { + System.out.println(entry.getKey()+":\t"+entry.getValue()); } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index e48e2bb44..0948bfe0f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -2,13 +2,14 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.log4j.Logger; -import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.util.Map; /** * 持久化到文件的接口。 @@ -38,16 +39,18 @@ public FilePipeline(String path) { } @Override - public void process(Page page, Task task) { + public void process(ResultItems resultItems, Task task) { String path = this.path + "/" + task.getUUID() + "/"; File file = new File(path); if (!file.exists()) { file.mkdirs(); } try { - PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(page.getUrl().toString()))); - printWriter.println("url:\t" + page.getUrl()); - printWriter.println("html:\t" + page.getHtml()); + PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()))); + printWriter.println("url:\t" + resultItems.getRequest().getUrl()); + for (Map.Entry entry : resultItems.getAll().entrySet()) { + printWriter.println(entry.getKey()+":\t"+entry.getValue()); + } printWriter.close(); } catch (IOException e) { logger.warn("write file error",e); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java index 408392d9a..595a8e87b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/Pipeline.java @@ -1,6 +1,6 @@ package us.codecraft.webmagic.pipeline; -import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; /** @@ -11,5 +11,5 @@ */ public interface Pipeline { - public void process(Page page,Task task); + public void process(ResultItems resultItems,Task task); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java index 47d3748b9..ff9646054 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/processor/SimplePageProcessor.java @@ -30,12 +30,13 @@ public SimplePageProcessor(String startUrl, String urlPattern) { @Override public void process(Page page) { - List requests = page.getHtml().links().regex(urlPattern).toStrings(); + List requests = page.getHtml().links().regex(urlPattern).all(); //调用page.addTargetRequests()方法添加待抓取链接 page.addTargetRequests(requests); //xpath方式抽取 page.putField("title", page.getHtml().xpath("//title")); //sc表示使用Readability技术抽取正文 + page.putField("html", page.getHtml().toString()); page.putField("content", page.getHtml().smartContent()); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index 9e8d19418..d06a53105 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -82,14 +82,14 @@ public Selectable replace(String regex, String replacement) { } @Override - public List toStrings() { + public List all() { return strings; } @Override public String toString() { - if (CollectionUtils.isNotEmpty(toStrings())) { - return toStrings().get(0); + if (CollectionUtils.isNotEmpty(all())) { + return all().get(0); } else { return null; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 1b0ba10a3..42f3d1083 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -69,5 +69,5 @@ public interface Selectable { * * @return multi string result */ - public List toStrings(); + public List all(); } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 3ef0a9279..30d8a817b 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1351,7 +1351,7 @@ public void test() { public void testOschina() { Html html1 = new Html(html); Assert.assertEquals("再次吐槽easyui", html1.xpath(".//*[@class='QTitle']/h1/a").toString()); - Assert.assertNotNull(html1.$("a[href]").xpath("//@href").toStrings()); + Assert.assertNotNull(html1.$("a[href]").xpath("//@href").all()); } } diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index 8741ef498..9a045eff0 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -4,7 +4,7 @@ import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.codec.digest.DigestUtils; -import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; import java.io.File; @@ -39,8 +39,8 @@ public FreemarkerPipeline(String template) throws IOException { @Override - public void process(Page page, Task task) { - if (page.isSkip()) { + public void process(ResultItems resultItems, Task task) { + if (resultItems.isSkip()) { return; } String path = this.path + "" + task.getUUID() + "/"; @@ -49,8 +49,8 @@ public void process(Page page, Task task) { file.mkdirs(); } try { - PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(page.getUrl().toString()) + ".html")); - template.process(page.getFields(), printWriter); + PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()) + ".html")); + template.process(resultItems.getAll(), printWriter); printWriter.close(); } catch (TemplateException e) { } catch (IOException e) { diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index e87ee3357..481981dba 100644 --- a/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -28,7 +28,9 @@ public RedisScheduler(String host){ @Override public synchronized void push(Request request, Task task) { Jedis jedis = pool.getResource(); + //使用SortedSet进行url去重 if (jedis.zrank(SET_PREFIX+task.getUUID(),request.getUrl())==null){ + //使用List保存队列 jedis.rpush(QUEUE_PREFIX+task.getUUID(),request.getUrl()); jedis.zadd(SET_PREFIX+task.getUUID(),System.currentTimeMillis(),request.getUrl()); } diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java index 0f556d284..6db21a8f9 100644 --- a/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java +++ b/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java @@ -1,6 +1,7 @@ package us.codecraft.webmagic.scheduler; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Site; @@ -20,6 +21,7 @@ public void setUp() { redisScheduler = new RedisScheduler("localhost"); } + @Ignore("environment depended") @Test public void test() { Task task = new Task() { @@ -35,7 +37,6 @@ public Site getSite() { }; redisScheduler.push(new Request("http://www.ibm.com/developerworks/cn/java/j-javadev2-22/"), task); Request poll = redisScheduler.poll(task); - System.out.println(poll.getUrl()); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java index e5aafe7a3..a1189e45d 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiandianBlogProcessor.java @@ -20,13 +20,13 @@ public void process(Page page) { //a()表示提取链接,links()表示提取所有链接 //getHtml()返回Html对象,支持链式调用 //r()表示用正则表达式提取一条内容,regex()表示提取多条内容 - //toString()表示取单条结果,toStrings()表示取多条 - List requests = page.getHtml().links().regex("(.*/post/.*)").toStrings(); + //toString()表示取单条结果,all()表示取多条 + List requests = page.getHtml().links().regex("(.*/post/.*)").all(); //使用page.addTargetRequests()方法将待抓取的链接加入队列 page.addTargetRequests(requests); //page.putField(key,value)将抽取的内容加入结果Map //x()和xs()使用xpath进行抽取 - page.putField("title", page.getHtml().xpath("//title").regex("(.*?)\\|")); + page.putField("title", page.getHtml().xpath("//title").regex("(.*?)\\|").toString()); //smartContent()使用readability技术直接抽取正文,对于规整的文本有比较好的抽取正确率 page.putField("content", page.getHtml().smartContent()); page.putField("date", page.getUrl().regex("post/(\\d+-\\d+-\\d+)/")); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java index 056da0aae..b7e3ee02d 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java @@ -18,7 +18,7 @@ public class DianpingProcessor implements PageProcessor { @Override public void process(Page page) { - List requests = page.getHtml().links().regex("http://info-search-web121361\\.alpha\\.dp:8080/search/.*").toStrings(); + List requests = page.getHtml().links().regex("http://info-search-web121361\\.alpha\\.dp:8080/search/.*").all(); page.addTargetRequests(requests); } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java index 695d2e2ab..115f18342 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DiaoyuwengProcessor.java @@ -18,9 +18,9 @@ public class DiaoyuwengProcessor implements PageProcessor { @Override public void process(Page page) { - List requests = page.getHtml().links().regex("(http://www\\.diaoyuweng\\.com/home\\.php\\?mod=space&uid=88304&do=thread&view=me&type=thread&order=dateline&from=space&page=\\d+)").toStrings(); + List requests = page.getHtml().links().regex("(http://www\\.diaoyuweng\\.com/home\\.php\\?mod=space&uid=88304&do=thread&view=me&type=thread&order=dateline&from=space&page=\\d+)").all(); page.addTargetRequests(requests); - requests = page.getHtml().links().regex("(http://www\\.diaoyuweng\\.com/thread-\\d+-1-1.html)").toStrings(); + requests = page.getHtml().links().regex("(http://www\\.diaoyuweng\\.com/thread-\\d+-1-1.html)").all(); page.addTargetRequests(requests); if (page.getUrl().toString().contains("thread")){ page.putField("title", page.getHtml().xpath("//a[@id='thread_subject']")); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java index 9d5140a2e..4ffe127b4 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/F58PageProcesser.java @@ -15,7 +15,7 @@ public class F58PageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().regex("]*href=[\"']{1}(/yewu/.*?)[\"']{1}").toStrings(); + List strings = page.getHtml().regex("]*href=[\"']{1}(/yewu/.*?)[\"']{1}").all(); page.addTargetRequests(strings); page.putField("title",page.getHtml().regex("(.*)")); page.putField("body",page.getHtml().xpath("//dd[@class='w133']")); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java index f7c5f7fad..0e3f9a327 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java @@ -20,7 +20,7 @@ public class GlobalProcessor implements PageProcessor { @Override public void process(Page page) { - final List requests = page.getHtml().links().toStrings(); + final List requests = page.getHtml().links().all(); page.addTargetRequests(requests); } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java index 26c60cc27..89b74d63f 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuxiuProcessor.java @@ -15,7 +15,7 @@ public class HuxiuProcessor implements PageProcessor { @Override public void process(Page page) { //http://progressdaily.diandian.com/post/2013-01-24/40046867275 - List requests = page.getHtml().regex("\"']*href=[\"']{1}([/]{0,1}article[^<>#\"']*?)[\"']{1}").toStrings(); + List requests = page.getHtml().regex("\"']*href=[\"']{1}([/]{0,1}article[^<>#\"']*?)[\"']{1}").all(); page.addTargetRequests(requests); page.putField("title",page.getHtml().xpath("//div[@class='neirong']//h1[@class='ph xs5']")); page.putField("content",page.getHtml().smartContent()); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java index 39f5723ec..a4e6e43b1 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/MeicanProcessor.java @@ -15,12 +15,12 @@ public class MeicanProcessor implements PageProcessor { @Override public void process(Page page) { //http://progressdaily.diandian.com/post/2013-01-24/40046867275 - List requests = page.getHtml().xpath("//a[@class=\"area_link flat_btn\"]/@href").toStrings(); + List requests = page.getHtml().xpath("//a[@class=\"area_link flat_btn\"]/@href").all(); if (requests.size() > 2) { requests = requests.subList(0, 2); } page.addTargetRequests(requests); - page.addTargetRequests(page.getHtml().links().regex("(.*/restaurant/[^#]+)").toStrings()); + page.addTargetRequests(page.getHtml().links().regex("(.*/restaurant/[^#]+)").all()); page.putField("items", page.getHtml().xpath("//ul[@class=\"dishes menu_dishes\"]/li/span[@class=\"name\"]")); page.putField("prices", page.getHtml().xpath("//ul[@class=\"dishes menu_dishes\"]/li/span[@class=\"price_outer\"]/span[@class=\"price\"]")); } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java index a7e9c9ba9..2337da598 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/NjuBBSProcessor.java @@ -14,7 +14,7 @@ public class NjuBBSProcessor implements PageProcessor { @Override public void process(Page page) { - List requests = page.getHtml().regex("]*href=(bbstcon\\?board=Pictures&file=[^>]*)").toStrings(); + List requests = page.getHtml().regex("]*href=(bbstcon\\?board=Pictures&file=[^>]*)").all(); page.addTargetRequests(requests); page.putField("title",page.getHtml().xpath("//div[@id='content']//h2/a")); page.putField("content",page.getHtml().smartContent()); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java index 9293b41c4..f2dbe8e10 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java @@ -15,7 +15,7 @@ public class OschinaBlogPageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().links().regex("(http://my\\.oschina\\.net)").toStrings(); + List strings = page.getHtml().links().regex("(http://my\\.oschina\\.net)").all(); page.addTargetRequests(strings); page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1")); page.putField("content", page.getHtml().smartContent()); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java index f88ce06d2..522eb2c6a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaPageProcesser.java @@ -15,7 +15,7 @@ public class OschinaPageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().regex("]*href=[\"']{1}(http://www\\.oschina\\.net/question/[\\w]+)[\"']{1}").toStrings(); + List strings = page.getHtml().regex("]*href=[\"']{1}(http://www\\.oschina\\.net/question/[\\w]+)[\"']{1}").all(); page.addTargetRequests(strings); page.putField("title", page.getHtml().xpath("//div[@class='QTitle']/h1/a")); page.putField("content", page.getHtml().xpath("//div[@class='Question']//div[@class='Content']/div[@class='detail']")); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java index bf4dcc2a1..49418b605 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/QzoneBlogProcessor.java @@ -18,7 +18,7 @@ public void process(Page page) { //http://b1.cnc.qzone.qq.com/cgi-bin/blognew/get_abs?hostUin=233017404&uin=233017404&blogType=0&statYear=2013&source=0&statYear=2013&g_tk=291639571&g_tk=291639571&reqInfo=7&pos=0&num=15&source=0&rand=0.46480297949165106 // &cateName=&cateHex=&statYear=2013&reqInfo=7&pos=0&num=15&sortType=0&source=0&rand=0.46480297949165106&g_tk=291639571&verbose=1&ref=qzone - List requests = page.getHtml().regex("]*href=[\"']{1}(http://17dujingdian\\.com/post/[^#]*?)[\"']{1}").toStrings(); + List requests = page.getHtml().regex("]*href=[\"']{1}(http://17dujingdian\\.com/post/[^#]*?)[\"']{1}").all(); page.addTargetRequests(requests); page.putField("title",page.getHtml().xpath("//div[@id='content']//h2/a")); page.putField("content",page.getHtml().smartContent()); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java index baa375d81..b4c5bc885 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/SinaBlogProcesser.java @@ -16,7 +16,7 @@ public class SinaBlogProcesser implements PageProcessor { @Override public void process(Page page) { - page.addTargetRequests(page.getHtml().xpath("//div[@class='articalfrontback SG_j_linedot1 clearfix']").links().toStrings()); + page.addTargetRequests(page.getHtml().xpath("//div[@class='articalfrontback SG_j_linedot1 clearfix']").links().all()); page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2")); page.putField("content",page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']")); page.putField("id",page.getUrl().regex("http://blog\\.sina\\.com\\.cn/s/blog_(\\w+)")); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java index 278657f09..ecc55b424 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/TianyaPageProcesser.java @@ -15,7 +15,7 @@ public class TianyaPageProcesser implements PageProcessor { @Override public void process(Page page) { - List strings = page.getHtml().regex("]*href=[\"']{1}(/post-free.*?\\.shtml)[\"']{1}").toStrings(); + List strings = page.getHtml().regex("]*href=[\"']{1}(/post-free.*?\\.shtml)[\"']{1}").all(); page.addTargetRequests(strings); page.putField("title", page.getHtml().xpath("//div[@id='post_head']//span[@class='s_title']//b")); page.putField("body",page.getHtml().smartContent()); From 57a00da4ca9acdd3043c3182dfaa8a71beb4fc3e Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 25 Jul 2013 13:48:56 +0800 Subject: [PATCH 058/175] add results --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 78756ac26..75bea5287 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载 * ####可扩展#### 参考[`scrapy`](https://github.com/scrapy/scrapy)的设计,webmagic将爬虫的扩展点分为Processor、Schedular、Downloader、Pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展Schedular实现断点续传乃至于分布式爬虫;可以通过扩展Pipeline实现业务可定制的持久化功能。webmagic的架构原理见作者的一篇文章:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796) -![image](http://code4craft.github.io/images/posts/webmagic.png) +![image](http://code4craft.github.io/images/posts/webmagic-0.1.0.png) ------ From 223a36f587245735521eccc59901f49e75cb7ab3 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 25 Jul 2013 13:51:03 +0800 Subject: [PATCH 059/175] release notes --- release-note.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/release-note.md b/release-note.md index 7dbe92a96..e9c8d9927 100755 --- a/release-note.md +++ b/release-note.md @@ -1,11 +1,13 @@ Release Notes ---- -*2012-7-16* `version:0.1.0` +*2012-7-25* `version:0.1.0` 第一个稳定版本。 修改了若干API,使得可扩展性更强,为每个任务分配一个ID,可以通过ID区分不同任务。 +重写了Pipeline接口,将抽取结果集包装到ResultItems对象,而不是通用一个Page对象,便于逻辑分离。 + 增加下载的重试机制,支持gzip,支持自定义UA/cookie。 增加多线程抓取功能,只需在初始化的时候指定线程数即可。 From 433e87da78a6dd130f5222705e3809b692c6c47e Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 08:24:08 +0800 Subject: [PATCH 060/175] add iteye sample --- .../java/us/codecraft/webmagic/Spider.java | 37 +++++++++++------- .../webmagic/pipeline/FilePipeline.java | 2 +- .../webmagic/samples/IteyeBlogProcessor.java | 38 +++++++++++++++++++ webmagic-samples/src/main/resources/log4j.xml | 26 +++++++++++++ 4 files changed, 89 insertions(+), 14 deletions(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java create mode 100644 webmagic-samples/src/main/resources/log4j.xml diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index a51ed9601..f3065422e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -18,23 +18,24 @@ /** *
      - *webmagic爬虫的入口类。
      + * webmagic爬虫的入口类。
        *
      - *示例:
      - *定义一个最简单的爬虫:
      + * 示例:
      + * 定义一个最简单的爬虫:
        *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*")).run();
        *
      - *使用FilePipeline保存结果到文件:
      + * 使用FilePipeline保存结果到文件:
        *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*"))
        *          .pipeline(new FilePipeline("/data/temp/webmagic/")).run();
        *
      - *使用FileCacheQueueScheduler缓存URL,关闭爬虫后下次自动从停止的页面继续抓取:
      + * 使用FileCacheQueueScheduler缓存URL,关闭爬虫后下次自动从停止的页面继续抓取:
        *      Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*blog/*"))
        *          .scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")).run();
        * 
      + * * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 上午6:53 + * Date: 13-4-21 + * Time: 上午6:53 */ public class Spider implements Runnable, Task { @@ -66,6 +67,7 @@ public class Spider implements Runnable, Task { /** * 使用已定义的抽取规则新建一个Spider。 + * * @param pageProcessor 已定义的抽取规则 */ public Spider(PageProcessor pageProcessor) { @@ -76,6 +78,7 @@ public Spider(PageProcessor pageProcessor) { /** * 使用已定义的抽取规则新建一个Spider。 + * * @param pageProcessor 已定义的抽取规则 * @return 新建的Spider */ @@ -85,6 +88,7 @@ public static Spider create(PageProcessor pageProcessor) { /** * 重新设置startUrls,会覆盖Site本身的startUrls。 + * * @param startUrls * @return this */ @@ -96,6 +100,7 @@ public Spider startUrls(List startUrls) { /** * 为爬虫设置一个唯一ID,用于标志任务,默认情况下使用domain作为uuid,对于单domain多任务的情况,请为重复任务设置不同的ID。 + * * @param uuid 唯一ID * @return this */ @@ -106,6 +111,7 @@ public Spider setUUID(String uuid) { /** * 设置调度器。调度器用于保存待抓取URL,并可以进行去重、同步、持久化等工作。默认情况下使用内存中的阻塞队列进行调度。 + * * @param scheduler 调度器 * @return this */ @@ -117,6 +123,7 @@ public Spider scheduler(Scheduler scheduler) { /** * 设置处理管道。处理管道用于最终抽取结果的后处理,例如:保存到文件、保存到数据库等。默认情况下会输出到控制台。 + * * @param pipeline 处理管道 * @return this */ @@ -148,7 +155,7 @@ public void run() { pipelines.add(new ConsolePipeline()); } //singel thread - if (executorService==null){ + if (executorService == null) { while (request != null) { processRequest(request); request = scheduler.poll(this); @@ -217,13 +224,13 @@ private void addRequest(Page page) { } } - private void checkIfNotRunning(){ - if (!stat.compareAndSet(STAT_INIT,STAT_INIT)){ + private void checkIfNotRunning() { + if (!stat.compareAndSet(STAT_INIT, STAT_INIT)) { throw new IllegalStateException("Spider is already running!"); } } - public void runAsync(){ + public void runAsync() { Thread thread = new Thread(this); thread.setDaemon(false); thread.start(); @@ -231,15 +238,19 @@ public void runAsync(){ /** * 建立多个线程下载 + * * @param threadNum 线程数 * @return this */ public Spider thread(int threadNum) { checkIfNotRunning(); - if (threadNum <= 1) { + if (threadNum <= 0) { throw new IllegalArgumentException("threadNum should be more than one!"); } - synchronized (this){ + if (threadNum == 1) { + return this; + } + synchronized (this) { this.executorService = ThreadUtils.newFixedThreadPool(threadNum); } return this; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 0948bfe0f..10d97a83c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -46,7 +46,7 @@ public void process(ResultItems resultItems, Task task) { file.mkdirs(); } try { - PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()))); + PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl())+".html")); printWriter.println("url:\t" + resultItems.getRequest().getUrl()); for (Map.Entry entry : resultItems.getAll().entrySet()) { printWriter.println(entry.getKey()+":\t"+entry.getValue()); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java new file mode 100644 index 000000000..188f3a1f9 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java @@ -0,0 +1,38 @@ +package us.codecraft.webmagic.samples; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.pipeline.FilePipeline; +import us.codecraft.webmagic.processor.PageProcessor; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 上午7:31
      + */ +public class IteyeBlogProcessor implements PageProcessor { + + private Site site; + + @Override + public void process(Page page) { + page.addTargetRequests(page.getHtml().links().regex(".*yanghaoli\\.iteye\\.com/blog/\\d+").all()); + page.putField("title",page.getHtml().xpath("//title").toString()); + page.putField("content",page.getHtml().smartContent().toString()); + } + + @Override + public Site getSite() { + if (site == null) { + site = Site.me().setDomain("yanghaoli.iteye.com").addStartUrl("http://yanghaoli.iteye.com/"). + setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31") + .setSleepTime(100).setRetryTimes(3); + } + return site; + } + + public static void main(String[] args) { + Spider.create(new IteyeBlogProcessor()).thread(5).pipeline(new FilePipeline()).run(); + } +} diff --git a/webmagic-samples/src/main/resources/log4j.xml b/webmagic-samples/src/main/resources/log4j.xml new file mode 100644 index 000000000..a6630f813 --- /dev/null +++ b/webmagic-samples/src/main/resources/log4j.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + From 2153045f77b52a166590d00dc3636d5447dd1cbe Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 11:52:23 +0800 Subject: [PATCH 061/175] try invite selenium --- pom.xml | 114 +++++++++++++++++- webmagic-core/pom.xml | 73 +---------- webmagic-plugin/pom.xml | 62 +--------- webmagic-samples/pom.xml | 97 ++------------- .../webmagic/samples/IteyeBlogProcessor.java | 5 +- webmagic-selenium/pom.xml | 37 ++++++ 6 files changed, 165 insertions(+), 223 deletions(-) create mode 100644 webmagic-selenium/pom.xml diff --git a/pom.xml b/pom.xml index 39f068c5d..f0b3a7d74 100644 --- a/pom.xml +++ b/pom.xml @@ -3,18 +3,65 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> us.codecraft - 0.0.1-SNAPSHOT + 0.1.0 4.0.0 pom webmagic - ./webmagic-core - ./webmagic-plugin/ - ./webmagic-samples/ - + webmagic-core + webmagic-plugin/ + webmagic-samples/ + webmagic-selenium + - + + + + junit + junit + 4.7 + test + + + org.apache.httpcomponents + httpclient + 4.2.4 + + + log4j + log4j + 1.2.17 + + + org.apache.commons + commons-lang3 + 3.1 + + + commons-collections + commons-collections + 3.2.1 + + + net.sourceforge.htmlcleaner + htmlcleaner + 2.4 + + + org.apache.commons + commons-io + 1.3.2 + + + org.jsoup + jsoup + 1.7.2 + + + + + org.apache.maven.plugins @@ -25,6 +72,61 @@ 1.6 + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + false + false + true + + + + + + org.apache.maven.plugins + maven-resources-plugin + + UTF-8 + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.0-beta-7 + diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index b0de214cd..60c37c025 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -2,8 +2,11 @@ - us.codecraft - 0.1.0 + + us.codecraft + webmagic + 0.1.0 + 4.0.0 webmagic-core @@ -12,109 +15,43 @@ org.apache.httpcomponents httpclient - 4.2.4 junit junit - 4.7 - test - - - - com.google.guava - guava - 13.0.1 org.apache.commons commons-lang3 - 3.1 log4j log4j - 1.2.17 commons-collections commons-collections - 3.2.1 net.sourceforge.htmlcleaner htmlcleaner - 2.4 org.jsoup jsoup - 1.7.2 org.apache.commons commons-io - 1.3.2 - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-resources-plugin - - UTF-8 - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.0-beta-7 - - - - - \ No newline at end of file diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index 634f09d34..b75dc9e76 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -2,8 +2,11 @@ - us.codecraft - 0.1.0 + + us.codecraft + webmagic + 0.1.0 + 4.0.0 webmagic-plugin @@ -12,13 +15,11 @@ us.codecraft webmagic-core - 0.1.0 + ${project.version} junit junit - 4.7 - test org.freemarker @@ -32,55 +33,4 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-resources-plugin - - UTF-8 - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.0-beta-7 - - - - - \ No newline at end of file diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index ac2092f6a..8af7672d1 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -2,9 +2,11 @@ - - us.codecraft - 0.1.0 + + us.codecraft + webmagic + 0.1.0 + 4.0.0 webmagic-samples @@ -13,102 +15,17 @@ us.codecraft webmagic-core - 0.1.0 + ${project.version} us.codecraft webmagic-plugin - 0.1.0 + ${project.version} junit junit - 4.7 - test - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - false - false - true - - - - - - org.apache.maven.plugins - maven-resources-plugin - - UTF-8 - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - ./lib/ - us.codecraft.webmagic.samples.DianpingIndexProcessor - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.0-beta-7 - - - - - \ No newline at end of file diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java index 188f3a1f9..76f9cc30e 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java @@ -26,13 +26,12 @@ public void process(Page page) { public Site getSite() { if (site == null) { site = Site.me().setDomain("yanghaoli.iteye.com").addStartUrl("http://yanghaoli.iteye.com/"). - setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31") - .setSleepTime(100).setRetryTimes(3); + setSleepTime(100).setRetryTimes(3); } return site; } public static void main(String[] args) { - Spider.create(new IteyeBlogProcessor()).thread(5).pipeline(new FilePipeline()).run(); + Spider.create(new IteyeBlogProcessor()).thread(5).pipeline(new FilePipeline("/data/webmagic/")).run(); } } diff --git a/webmagic-selenium/pom.xml b/webmagic-selenium/pom.xml new file mode 100644 index 000000000..209fbe8f2 --- /dev/null +++ b/webmagic-selenium/pom.xml @@ -0,0 +1,37 @@ + + + + + us.codecraft + webmagic + 0.1.0 + + 4.0.0 + webmagic-selenium + + + + us.codecraft + webmagic-core + ${project.version} + + + us.codecraft + webmagic-plugin + ${project.version} + + + junit + junit + + + org.seleniumhq.selenium + selenium-java + 2.33.0 + + + + + \ No newline at end of file From 18d835c73592afa378960a9834697ca7fccbb72a Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 11:55:40 +0800 Subject: [PATCH 062/175] update readme --- webmagic-core/README.md | 3 +++ webmagic-plugin/README.md | 6 ++++++ webmagic-selenium/README.md | 3 +++ 3 files changed, 12 insertions(+) create mode 100644 webmagic-core/README.md create mode 100644 webmagic-plugin/README.md create mode 100644 webmagic-selenium/README.md diff --git a/webmagic-core/README.md b/webmagic-core/README.md new file mode 100644 index 000000000..4964e1677 --- /dev/null +++ b/webmagic-core/README.md @@ -0,0 +1,3 @@ +webmagic-core +------- +webmagic核心部分。 \ No newline at end of file diff --git a/webmagic-plugin/README.md b/webmagic-plugin/README.md new file mode 100644 index 000000000..e97c2563e --- /dev/null +++ b/webmagic-plugin/README.md @@ -0,0 +1,6 @@ +webmagic-plugin +------- +webmagic的插件模块。 +目前仅实现了freemarker模板渲染,和redis实现分布式爬虫。 + +这部分依赖比较杂,以后考虑多分几个包。 \ No newline at end of file diff --git a/webmagic-selenium/README.md b/webmagic-selenium/README.md new file mode 100644 index 000000000..5e5ce8211 --- /dev/null +++ b/webmagic-selenium/README.md @@ -0,0 +1,3 @@ +webmagic-selenium +------- +尝试使用selenium来进行页面动态渲染,开发中。 \ No newline at end of file From a8da1124fb13bc89eb4199eeef73e57f2b37e004 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 12:04:08 +0800 Subject: [PATCH 063/175] update structrue --- pom.xml | 1 - webmagic-plugin/pom.xml | 15 ++++------- webmagic-plugin/webmagic-misc/pom.xml | 27 +++++++++++++++++++ .../webmagic/pipeline/FreemarkerPipeline.java | 0 .../webmagic/scheduler/RedisScheduler.java | 0 .../src/main/resources/ftl/wordpress.ftl | 0 .../webmagic/FreemarkerPipelineTest.java | 0 .../scheduler/RedisSchedulerTest.java | 0 .../webmagic-selenium}/README.md | 0 .../webmagic-selenium}/pom.xml | 16 +---------- webmagic-samples/pom.xml | 2 +- 11 files changed, 34 insertions(+), 27 deletions(-) create mode 100644 webmagic-plugin/webmagic-misc/pom.xml rename webmagic-plugin/{ => webmagic-misc}/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java (100%) rename webmagic-plugin/{ => webmagic-misc}/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java (100%) rename webmagic-plugin/{ => webmagic-misc}/src/main/resources/ftl/wordpress.ftl (100%) rename webmagic-plugin/{ => webmagic-misc}/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java (100%) rename webmagic-plugin/{ => webmagic-misc}/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java (100%) rename {webmagic-selenium => webmagic-plugin/webmagic-selenium}/README.md (100%) rename {webmagic-selenium => webmagic-plugin/webmagic-selenium}/pom.xml (55%) diff --git a/pom.xml b/pom.xml index f0b3a7d74..086437d11 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,6 @@ webmagic-core webmagic-plugin/ webmagic-samples/ - webmagic-selenium diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index b75dc9e76..22257222c 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -7,7 +7,12 @@ webmagic 0.1.0 + pom 4.0.0 + + webmagic-misc + webmagic-selenium + webmagic-plugin @@ -21,16 +26,6 @@ junit junit - - org.freemarker - freemarker - 2.3.15 - - - redis.clients - jedis - 2.0.0 - \ No newline at end of file diff --git a/webmagic-plugin/webmagic-misc/pom.xml b/webmagic-plugin/webmagic-misc/pom.xml new file mode 100644 index 000000000..c54561596 --- /dev/null +++ b/webmagic-plugin/webmagic-misc/pom.xml @@ -0,0 +1,27 @@ + + + + us.codecraft + webmagic-plugin + 0.1.0 + + 4.0.0 + + webmagic-misc + + + + org.freemarker + freemarker + 2.3.15 + + + redis.clients + jedis + 2.0.0 + + + + \ No newline at end of file diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java similarity index 100% rename from webmagic-plugin/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java diff --git a/webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java similarity index 100% rename from webmagic-plugin/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java diff --git a/webmagic-plugin/src/main/resources/ftl/wordpress.ftl b/webmagic-plugin/webmagic-misc/src/main/resources/ftl/wordpress.ftl similarity index 100% rename from webmagic-plugin/src/main/resources/ftl/wordpress.ftl rename to webmagic-plugin/webmagic-misc/src/main/resources/ftl/wordpress.ftl diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java similarity index 100% rename from webmagic-plugin/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java rename to webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java diff --git a/webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java similarity index 100% rename from webmagic-plugin/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java rename to webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java diff --git a/webmagic-selenium/README.md b/webmagic-plugin/webmagic-selenium/README.md similarity index 100% rename from webmagic-selenium/README.md rename to webmagic-plugin/webmagic-selenium/README.md diff --git a/webmagic-selenium/pom.xml b/webmagic-plugin/webmagic-selenium/pom.xml similarity index 55% rename from webmagic-selenium/pom.xml rename to webmagic-plugin/webmagic-selenium/pom.xml index 209fbe8f2..0da4504f7 100644 --- a/webmagic-selenium/pom.xml +++ b/webmagic-plugin/webmagic-selenium/pom.xml @@ -5,27 +5,13 @@ us.codecraft - webmagic + webmagic-plugin 0.1.0 4.0.0 webmagic-selenium - - us.codecraft - webmagic-core - ${project.version} - - - us.codecraft - webmagic-plugin - ${project.version} - - - junit - junit - org.seleniumhq.selenium selenium-java diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index 8af7672d1..b8454900a 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -19,7 +19,7 @@ us.codecraft - webmagic-plugin + webmagic-misc ${project.version} From 9a88d906d5cb39553db62d363365032669558ef0 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 12:05:22 +0800 Subject: [PATCH 064/175] readme --- webmagic-plugin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-plugin/README.md b/webmagic-plugin/README.md index e97c2563e..536d59602 100644 --- a/webmagic-plugin/README.md +++ b/webmagic-plugin/README.md @@ -3,4 +3,4 @@ webmagic-plugin webmagic的插件模块。 目前仅实现了freemarker模板渲染,和redis实现分布式爬虫。 -这部分依赖比较杂,以后考虑多分几个包。 \ No newline at end of file +另外有一个使用Selenium来动态渲染页面的模块在开发中。 \ No newline at end of file From c785103ed12a8c02ab59661c1ce2ab9ccff6e1f8 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 14:29:19 +0800 Subject: [PATCH 065/175] invite selenium --- .../downloader/SeleniumDownloader.java | 48 +++++++++++ .../selenium/downloader/WebDriverPool.java | 82 +++++++++++++++++++ .../webmagic/selenium/SeleniumTest.java | 29 +++++++ .../downloader/WebDriverPoolTest.java | 28 +++++++ 4 files changed, 187 insertions(+) create mode 100644 webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java create mode 100644 webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java create mode 100644 webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java create mode 100644 webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java new file mode 100644 index 000000000..8fd1c6a2d --- /dev/null +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -0,0 +1,48 @@ +package us.codecraft.webmagic.selenium.downloader; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.downloader.Downloader; +import us.codecraft.webmagic.selector.Html; +import us.codecraft.webmagic.selector.PlainText; +import us.codecraft.webmagic.utils.UrlUtils; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午1:37
      + */ +public class SeleniumDownloader implements Downloader { + + private WebDriverPool webDriverPool; + + private Logger logger = Logger.getLogger(getClass()); + + public SeleniumDownloader(String chromeDriverPath) { + System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); + } + + @Override + public Page download(Request request, Task task) { + WebDriver webDriver = null; + try { + webDriver = webDriverPool.get(); + } catch (InterruptedException e) { + logger.warn("interrupted",e); + return null; + } + webDriver.get(request.getUrl()); + WebElement webElement = webDriver.findElement(By.xpath("/html")); + String content = webElement.getAttribute("outerHTML"); + Page page = new Page(); + page.setHtml(new Html(UrlUtils.fixAllRelativeHrefs(content, request.getUrl()))); + page.setUrl(new PlainText(request.getUrl())); + page.setRequest(request); + return page; + } +} diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java new file mode 100644 index 000000000..039cef98e --- /dev/null +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java @@ -0,0 +1,82 @@ +package us.codecraft.webmagic.selenium.downloader; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.BlockingDeque; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午1:41
      + */ +class WebDriverPool { + + private final static int DEFAULT_CAPACITY = 5; + + private final int capacity; + + private final static int STAT_RUNNING = 1; + + private final static int STAT_CLODED = 2; + + private AtomicInteger stat = new AtomicInteger(STAT_RUNNING); + + private List webDriverList = Collections.synchronizedList(new ArrayList()); + + public WebDriverPool(int capacity) { + this.capacity = capacity; + } + + public WebDriverPool() { + this(DEFAULT_CAPACITY); + } + + private BlockingDeque innerQueue = new LinkedBlockingDeque(); + + public WebDriver get() throws InterruptedException { + checkRunning(); + WebDriver poll = innerQueue.poll(); + if (poll != null) { + return poll; + } + if (webDriverList.size() < capacity) { + synchronized (webDriverList) { + if (webDriverList.size() < capacity) { + ChromeDriver e = new ChromeDriver(); + innerQueue.add(e); + webDriverList.add(e); + } + } + + } + return innerQueue.take(); + } + + public void returnToPool(WebDriver webDriver) { + checkRunning(); + innerQueue.add(webDriver); + } + + protected void checkRunning() { + if (!stat.compareAndSet(STAT_RUNNING, STAT_RUNNING)) { + throw new IllegalStateException("Already closed!"); + } + } + + public void closeAll() { + boolean b = stat.compareAndSet(STAT_RUNNING, STAT_CLODED); + if (!b) { + throw new IllegalStateException("Already closed!"); + } + for (WebDriver webDriver : webDriverList) { + webDriver.close(); + } + + } +} diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java new file mode 100644 index 000000000..fc0a9ec62 --- /dev/null +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java @@ -0,0 +1,29 @@ +package us.codecraft.webmagic.selenium; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; + +import java.util.List; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午12:27
      + */ +public class SeleniumTest { + + @Test + public void test(){ + System.getProperties().setProperty("webdriver.chrome.driver","/Users/yihua/Downloads/chromedriver"); + WebDriver webDriver = new ChromeDriver(); + webDriver.get("http://huaban.com/"); + List elements = webDriver.findElements(By.xpath("/html")); + for (WebElement element : elements) { + System.out.println(element.getAttribute("outerHTML")); + } + webDriver.close(); + } +} diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java new file mode 100644 index 000000000..d38216f8f --- /dev/null +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java @@ -0,0 +1,28 @@ +package us.codecraft.webmagic.selenium.downloader; + +import org.junit.Test; +import org.openqa.selenium.WebDriver; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午2:12
      + */ +public class WebDriverPoolTest { + + @Test + public void test(){ + String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); + WebDriverPool webDriverPool =new WebDriverPool(5); + for (int i=0;i<5;i++){ + try { + WebDriver webDriver = webDriverPool.get(); + System.out.println(i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + webDriverPool.closeAll(); + } +} From 2f6d17966673e9cb65261dbcc0bae68ebf3d92fe Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 14:41:30 +0800 Subject: [PATCH 066/175] fix a httpclient pool size bug --- .../main/java/us/codecraft/webmagic/Spider.java | 9 ++++++++- .../downloader/HttpClientDownloader.java | 15 +++++++++++++-- .../webmagic/downloader/HttpClientPool.java | 17 ++++++++++++----- .../webmagic/samples/GlobalProcessor.java | 4 ++-- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index f3065422e..a568f93a7 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -39,7 +39,7 @@ */ public class Spider implements Runnable, Task { - private Downloader downloader = new HttpClientDownloader(); + private Downloader downloader; private List pipelines = new ArrayList(); @@ -139,12 +139,18 @@ public Spider downloader(Downloader downloader) { return this; } + protected void checkComponent() { + if (downloader == null) { + this.downloader = new HttpClientDownloader(); + } + } @Override public void run() { if (!stat.compareAndSet(STAT_INIT, STAT_RUNNING)) { throw new IllegalStateException("Spider is already running!"); } + checkComponent(); if (startUrls != null) { for (String startUrl : startUrls) { scheduler.push(new Request(startUrl), this); @@ -247,6 +253,7 @@ public Spider thread(int threadNum) { if (threadNum <= 0) { throw new IllegalArgumentException("threadNum should be more than one!"); } + downloader = new HttpClientDownloader(threadNum); if (threadNum == 1) { return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index 7eb627724..d76341986 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -21,6 +21,7 @@ /** * 封装了HttpClient的下载器。已实现指定次数重试、处理gzip、自定义UA/cookie等功能。
      + * * @author code4crafter@gmail.com
      * Date: 13-4-21 * Time: 下午12:15 @@ -29,11 +30,21 @@ public class HttpClientDownloader implements Downloader { private Logger logger = Logger.getLogger(getClass()); + private int poolSize; + + public HttpClientDownloader(int poolSize) { + this.poolSize = poolSize; + } + + public HttpClientDownloader() { + this(5); + } + @Override public Page download(Request request, Task task) { Site site = task.getSite(); logger.info("downloading page " + request.getUrl()); - HttpClient httpClient = HttpClientPool.getInstance().getClient(site); + HttpClient httpClient = HttpClientPool.getInstance(poolSize).getClient(site); String charset = site.getCharset(); try { HttpGet httpGet = new HttpGet(request.getUrl()); @@ -50,7 +61,7 @@ public Page download(Request request, Task task) { logger.warn("download page " + request.getUrl() + " error", e); return null; } - logger.info("download page " + request.getUrl() + " error, retry the "+tried+" time!"); + logger.info("download page " + request.getUrl() + " error, retry the " + tried + " time!"); retry = true; } } while (retry); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java index 4e57e16f9..854f1e57a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientPool.java @@ -19,14 +19,21 @@ /** * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午12:29 + * Date: 13-4-21 + * Time: 下午12:29 */ public class HttpClientPool { - public static final HttpClientPool INSTANCE = new HttpClientPool(5); + public static volatile HttpClientPool INSTANCE; - public static HttpClientPool getInstance() { + public static HttpClientPool getInstance(int poolSize) { + if (INSTANCE == null) { + synchronized (HttpClientPool.class) { + if (INSTANCE == null) { + INSTANCE = new HttpClientPool(poolSize); + } + } + } return INSTANCE; } @@ -48,7 +55,7 @@ private HttpClient generateClient(Site site) { HttpProtocolParamBean paramsBean = new HttpProtocolParamBean(params); paramsBean.setVersion(HttpVersion.HTTP_1_1); - paramsBean.setContentCharset("UTF-8"); + paramsBean.setContentCharset(site.getCharset()); paramsBean.setUseExpectContinue(false); SchemeRegistry schemeRegistry = new SchemeRegistry(); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java index 0e3f9a327..2bdf342fe 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java @@ -27,8 +27,8 @@ public void process(Page page) { @Override public Site getSite() { - if (site==null){ - site = Site.me().setDomain("www.2345.com") + if (site == null) { + site = Site.me().setDomain("www.2345.com").setSleepTime(0) .addStartUrl("http://www.2345.com/").addStartUrl("http://hao.360.cn/") .addStartUrl("http://www.baidu.com/s?wd=%E7%BD%91%E7%AB%99%E5%AF%BC%E8%88%AA&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=80039098_oem_dg&rsv_n=2&rsv_sug3=6&rsv_sug4=698&rsv_sug=0&rsv_sug1=3") .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); From bc98059220dfe2aa94761bd08d801414e56da7bb Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 15:05:29 +0800 Subject: [PATCH 067/175] complete selenium --- .../downloader/SeleniumDownloader.java | 24 +++++++++++-- .../downloader/SeleniumDownloaderTest.java | 36 +++++++++++++++++++ .../downloader/WebDriverPoolTest.java | 9 ++--- 3 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index 8fd1c6a2d..171ca44fc 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -2,16 +2,20 @@ import org.apache.log4j.Logger; import org.openqa.selenium.By; +import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Task; import us.codecraft.webmagic.downloader.Downloader; import us.codecraft.webmagic.selector.Html; import us.codecraft.webmagic.selector.PlainText; import us.codecraft.webmagic.utils.UrlUtils; +import java.util.Map; + /** * @author yihua.huang@dianping.com
      * @date: 13-7-26
      @@ -25,24 +29,40 @@ public class SeleniumDownloader implements Downloader { public SeleniumDownloader(String chromeDriverPath) { System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); + webDriverPool = new WebDriverPool(); + } + + public SeleniumDownloader(String chromeDriverPath, int poolSize) { + System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); + webDriverPool = new WebDriverPool(poolSize); } @Override public Page download(Request request, Task task) { - WebDriver webDriver = null; + WebDriver webDriver; try { webDriver = webDriverPool.get(); } catch (InterruptedException e) { - logger.warn("interrupted",e); + logger.warn("interrupted", e); return null; } webDriver.get(request.getUrl()); + WebDriver.Options manage = webDriver.manage(); + Site site = task.getSite(); + if (site.getCookies() != null) { + for (Map.Entry cookieEntry : site.getCookies().entrySet()) { + Cookie cookie = new Cookie(cookieEntry.getKey(), cookieEntry.getValue()); + manage.addCookie(cookie); + } + } WebElement webElement = webDriver.findElement(By.xpath("/html")); String content = webElement.getAttribute("outerHTML"); Page page = new Page(); page.setHtml(new Html(UrlUtils.fixAllRelativeHrefs(content, request.getUrl()))); page.setUrl(new PlainText(request.getUrl())); page.setRequest(request); + webDriverPool.returnToPool(webDriver); return page; } + } diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java new file mode 100644 index 000000000..d21068459 --- /dev/null +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java @@ -0,0 +1,36 @@ +package us.codecraft.webmagic.selenium.downloader; + +import org.junit.Ignore; +import org.junit.Test; +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午2:46
      + */ +public class SeleniumDownloaderTest { + + private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + + @Ignore("need chrome driver") + @Test + public void test(){ + SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { + @Override + public String getUUID() { + return "huaban.com"; + } + + @Override + public Site getSite() { + return Site.me(); + } + }); + System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); + } +} diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java index d38216f8f..38e4f86f5 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java @@ -10,12 +10,13 @@ */ public class WebDriverPoolTest { + private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + @Test - public void test(){ - String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + public void test() { System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); - WebDriverPool webDriverPool =new WebDriverPool(5); - for (int i=0;i<5;i++){ + WebDriverPool webDriverPool = new WebDriverPool(5); + for (int i = 0; i < 5; i++) { try { WebDriver webDriver = webDriverPool.get(); System.out.println(i); From be3528532b0967e3bd5e5bada9e691f4db0f61ed Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 15:09:01 +0800 Subject: [PATCH 068/175] add selenium ignore --- .../test/java/us/codecraft/webmagic/selenium/SeleniumTest.java | 2 ++ .../webmagic/selenium/downloader/SeleniumDownloaderTest.java | 1 + .../webmagic/selenium/downloader/WebDriverPoolTest.java | 2 ++ 3 files changed, 5 insertions(+) diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java index fc0a9ec62..e9e1c7b60 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.selenium; +import org.junit.Ignore; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; @@ -15,6 +16,7 @@ */ public class SeleniumTest { + @Ignore("need chrome driver") @Test public void test(){ System.getProperties().setProperty("webdriver.chrome.driver","/Users/yihua/Downloads/chromedriver"); diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java index d21068459..d50c20a32 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java @@ -20,6 +20,7 @@ public class SeleniumDownloaderTest { @Test public void test(){ SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { @Override public String getUUID() { diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java index 38e4f86f5..1efc69b16 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.selenium.downloader; +import org.junit.Ignore; import org.junit.Test; import org.openqa.selenium.WebDriver; @@ -12,6 +13,7 @@ public class WebDriverPoolTest { private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + @Ignore("need chrome driver") @Test public void test() { System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); From 726f00044cb1f58d47ff9ca60ab1b1e6834a6786 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 15:27:47 +0800 Subject: [PATCH 069/175] release resource --- .../java/us/codecraft/webmagic/Spider.java | 17 ++++++++++ .../webmagic/downloader/Destroyable.java | 13 ++++++++ .../downloader/SeleniumDownloader.java | 13 +++++++- .../downloader/SeleniumDownloaderTest.java | 31 ++++++++++--------- 4 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index a568f93a7..cd092a308 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -2,6 +2,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; +import us.codecraft.webmagic.downloader.Destroyable; import us.codecraft.webmagic.downloader.Downloader; import us.codecraft.webmagic.downloader.HttpClientDownloader; import us.codecraft.webmagic.pipeline.ConsolePipeline; @@ -198,6 +199,22 @@ public void run() { executorService.shutdown(); } stat.compareAndSet(STAT_RUNNING, STAT_STOPPED); + //release some resources + destroy(); + } + + private void destroy() { + destroyEach(downloader); + destroyEach(pageProcessor); + for (Pipeline pipeline : pipelines) { + destroyEach(pipeline); + } + } + + private void destroyEach(Object object){ + if (object instanceof Destroyable) { + ((Destroyable)object).destroy(); + } } private void processRequest(Request request) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java new file mode 100644 index 000000000..4f07528d6 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java @@ -0,0 +1,13 @@ +package us.codecraft.webmagic.downloader; + +/** + * 比较占用资源的服务可以实现该接口,Spider会在结束时调用destroy()释放资源。
      + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午3:10
      + */ +public interface Destroyable { + + public void destroy(); + +} diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index 171ca44fc..1ed8b4db4 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -9,6 +9,7 @@ import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.downloader.Destroyable; import us.codecraft.webmagic.downloader.Downloader; import us.codecraft.webmagic.selector.Html; import us.codecraft.webmagic.selector.PlainText; @@ -17,16 +18,22 @@ import java.util.Map; /** + * 使用Selenium调用浏览器进行渲染。目前仅支持chrome。
      + * 需要下载Selenium driver支持。
      * @author yihua.huang@dianping.com
      * @date: 13-7-26
      * Time: 下午1:37
      */ -public class SeleniumDownloader implements Downloader { +public class SeleniumDownloader implements Downloader,Destroyable { private WebDriverPool webDriverPool; private Logger logger = Logger.getLogger(getClass()); + /** + * 新建 + * @param chromeDriverPath + */ public SeleniumDownloader(String chromeDriverPath) { System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); webDriverPool = new WebDriverPool(); @@ -65,4 +72,8 @@ public Page download(Request request, Task task) { return page; } + @Override + public void destroy() { + webDriverPool.closeAll(); + } } diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java index d50c20a32..615ad8674 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java @@ -14,24 +14,27 @@ */ public class SeleniumDownloaderTest { - private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + private String chromeDriverPath = ""; @Ignore("need chrome driver") @Test - public void test(){ + public void test() { SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + long time1 = System.currentTimeMillis(); + for (int i = 0; i < 100; i++) { + Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { + @Override + public String getUUID() { + return "huaban.com"; + } - Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { - @Override - public String getUUID() { - return "huaban.com"; - } - - @Override - public Site getSite() { - return Site.me(); - } - }); - System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); + @Override + public Site getSite() { + return Site.me(); + } + }); + System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); + } + System.out.println(System.currentTimeMillis() - time1); } } From d3d81603aa9c747e49627d4e84efa2de7e0e69be Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 16:32:51 +0800 Subject: [PATCH 070/175] add huaban processor --- .../webmagic/pipeline/ConsolePipeline.java | 3 ++ .../webmagic/pipeline/FilePipeline.java | 3 ++ .../downloader/SeleniumDownloader.java | 1 + .../webmagic/selenium/SeleniumTest.java | 12 ++--- webmagic-samples/pom.xml | 5 +++ .../webmagic/samples/HuabanProcessor.java | 45 +++++++++++++++++++ 6 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 72c3bf3ff..8be5fabb6 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -15,6 +15,9 @@ public class ConsolePipeline implements Pipeline{ @Override public void process(ResultItems resultItems,Task task) { + if (resultItems.isSkip()){ + return; + } System.out.println("get page: "+resultItems.getRequest().getUrl()); for (Map.Entry entry : resultItems.getAll().entrySet()) { System.out.println(entry.getKey()+":\t"+entry.getValue()); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 10d97a83c..cbce8324a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -45,6 +45,9 @@ public void process(ResultItems resultItems, Task task) { if (!file.exists()) { file.mkdirs(); } + if (resultItems.isSkip()){ + return; + } try { PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl())+".html")); printWriter.println("url:\t" + resultItems.getRequest().getUrl()); diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index 1ed8b4db4..b4dd3720b 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -53,6 +53,7 @@ public Page download(Request request, Task task) { logger.warn("interrupted", e); return null; } + logger.info("downloading page " + request.getUrl()); webDriver.get(request.getUrl()); WebDriver.Options manage = webDriver.manage(); Site site = task.getSite(); diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java index e9e1c7b60..6cf50c39b 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java @@ -7,8 +7,6 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; -import java.util.List; - /** * @author yihua.huang@dianping.com
      * @date: 13-7-26
      @@ -18,14 +16,12 @@ public class SeleniumTest { @Ignore("need chrome driver") @Test - public void test(){ - System.getProperties().setProperty("webdriver.chrome.driver","/Users/yihua/Downloads/chromedriver"); + public void testSelenium() { + System.getProperties().setProperty("webdriver.chrome.driver", "/Users/yihua/Downloads/chromedriver"); WebDriver webDriver = new ChromeDriver(); webDriver.get("http://huaban.com/"); - List elements = webDriver.findElements(By.xpath("/html")); - for (WebElement element : elements) { - System.out.println(element.getAttribute("outerHTML")); - } + WebElement webElement = webDriver.findElement(By.xpath("/html")); + System.out.println(webElement.getAttribute("outerHTML")); webDriver.close(); } } diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index b8454900a..8a7e00ce0 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -22,6 +22,11 @@ webmagic-misc ${project.version}
      + + us.codecraft + webmagic-selenium + ${project.version} + junit junit diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java new file mode 100644 index 000000000..23434f33e --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -0,0 +1,45 @@ +package us.codecraft.webmagic.samples; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.pipeline.FilePipeline; +import us.codecraft.webmagic.processor.PageProcessor; +import us.codecraft.webmagic.scheduler.RedisScheduler; +import us.codecraft.webmagic.selenium.downloader.SeleniumDownloader; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-26
      + * Time: 下午4:08
      + */ +public class HuabanProcessor implements PageProcessor { + + private Site site; + + @Override + public void process(Page page) { + page.addTargetRequests(page.getHtml().links().regex("http://huaban\\.com/.*").all()); + if (page.getUrl().toString().contains("pins")) { + page.putField("img", page.getHtml().xpath("//div[@id='pin_img']/img/@src").toString()); + } else { + page.getResultItems().setSkip(true); + } + } + + @Override + public Site getSite() { + if (site == null) { + site = Site.me().setDomain("huaban.com").addStartUrl("http://huaban.com/"); + } + return site; + } + + public static void main(String[] args) { + Spider.create(new HuabanProcessor()) + .scheduler(new RedisScheduler("localhost")) + .pipeline(new FilePipeline("/data/webmagic/test/")) + .downloader(new SeleniumDownloader("/Users/yihua/Downloads/chromedriver")) + .runAsync(); + } +} From b71409a5ba6b057a3463c1989fc22ffb75910310 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 16:34:09 +0800 Subject: [PATCH 071/175] sleep time --- .../java/us/codecraft/webmagic/samples/HuabanProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java index 23434f33e..a542da410 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -30,13 +30,13 @@ public void process(Page page) { @Override public Site getSite() { if (site == null) { - site = Site.me().setDomain("huaban.com").addStartUrl("http://huaban.com/"); + site = Site.me().setDomain("huaban.com").addStartUrl("http://huaban.com/").setSleepTime(1000); } return site; } public static void main(String[] args) { - Spider.create(new HuabanProcessor()) + Spider.create(new HuabanProcessor()).thread(5) .scheduler(new RedisScheduler("localhost")) .pipeline(new FilePipeline("/data/webmagic/test/")) .downloader(new SeleniumDownloader("/Users/yihua/Downloads/chromedriver")) From 0d8bc820d794bf7878bf07f2632eb0a88d8bf090 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 16:55:36 +0800 Subject: [PATCH 072/175] update --- .../java/us/codecraft/webmagic/samples/HuabanProcessor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java index a542da410..d8c5f0573 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -9,6 +9,8 @@ import us.codecraft.webmagic.selenium.downloader.SeleniumDownloader; /** + * 花瓣网抽取器。
      + * 使用Selenium做页面动态渲染。
      * @author yihua.huang@dianping.com
      * @date: 13-7-26
      * Time: 下午4:08
      @@ -30,7 +32,7 @@ public void process(Page page) { @Override public Site getSite() { if (site == null) { - site = Site.me().setDomain("huaban.com").addStartUrl("http://huaban.com/").setSleepTime(1000); + site = Site.me().setDomain("huaban.com").addStartUrl("http://huaban.com/").setSleepTime(0); } return site; } From 0003d350def7faba2dd25ca909b839223b4c606d Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 17:11:07 +0800 Subject: [PATCH 073/175] delete --- .../webmagic/samples/DianpingProcessor.java | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java deleted file mode 100644 index b7e3ee02d..000000000 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/DianpingProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -package us.codecraft.webmagic.samples; - -import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.processor.PageProcessor; - -import java.util.List; - -/** - * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午8:08 - */ -public class DianpingProcessor implements PageProcessor { - - private Site site; - - @Override - public void process(Page page) { - List requests = page.getHtml().links().regex("http://info-search-web121361\\.alpha\\.dp:8080/search/.*").all(); - page.addTargetRequests(requests); - } - - @Override - public Site getSite() { - if (site == null) { - site = Site.me().setDomain("info-search-web361.alpha.dp:8080").addStartUrl("http://info11-search-web361.alpha.dp:8080/search/category/1/0"). - setSleepTime(100). - setUserAgent("I'm a performance tester created by yihua.huang"); - } - return site; - } - - public static void main(String[] args) { - int sleepTime = 0; - if (args.length > 0) { - sleepTime = Integer.parseInt(args[0]); - } - DianpingProcessor dianpingProcessor = new DianpingProcessor(); - dianpingProcessor.getSite().setSleepTime(sleepTime).setRetryTimes(10); - Spider.create(dianpingProcessor).run(); - } -} From d76223eb0912a08417d7316886f7d1c2c597595f Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 19:02:41 +0800 Subject: [PATCH 074/175] fix redisScheduler thread problem --- .../webmagic/scheduler/RedisScheduler.java | 42 +++++++++++++++---- .../webmagic/selenium/SeleniumTest.java | 16 ++++++- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index 481981dba..575beefc7 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -7,13 +7,17 @@ import us.codecraft.webmagic.Task; import us.codecraft.webmagic.schedular.Scheduler; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + /** * 使用redis管理url,构建一个分布式的爬虫。
      + * * @author yihua.huang@dianping.com
      * @date: 13-7-25
      * Time: 上午7:07
      */ -public class RedisScheduler implements Scheduler{ +public class RedisScheduler implements Scheduler { private JedisPool pool; @@ -21,7 +25,11 @@ public class RedisScheduler implements Scheduler{ private static final String SET_PREFIX = "set_"; - public RedisScheduler(String host){ + private ReentrantLock lock = new ReentrantLock(); + + private Condition condition = lock.newCondition(); + + public RedisScheduler(String host) { pool = new JedisPool(new JedisPoolConfig(), host); } @@ -29,10 +37,16 @@ public RedisScheduler(String host){ public synchronized void push(Request request, Task task) { Jedis jedis = pool.getResource(); //使用SortedSet进行url去重 - if (jedis.zrank(SET_PREFIX+task.getUUID(),request.getUrl())==null){ - //使用List保存队列 - jedis.rpush(QUEUE_PREFIX+task.getUUID(),request.getUrl()); - jedis.zadd(SET_PREFIX+task.getUUID(),System.currentTimeMillis(),request.getUrl()); + if (jedis.zrank(SET_PREFIX + task.getUUID(), request.getUrl()) == null) { + try { + lock.lock(); + //使用List保存队列 + jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl()); + jedis.zadd(SET_PREFIX + task.getUUID(), System.currentTimeMillis(), request.getUrl()); + condition.signal(); + } finally { + lock.unlock(); + } } pool.returnResource(jedis); } @@ -40,7 +54,21 @@ public synchronized void push(Request request, Task task) { @Override public synchronized Request poll(Task task) { Jedis jedis = pool.getResource(); - String url = jedis.lpop(QUEUE_PREFIX+task.getUUID()); + String url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); + if (url == null) { + try { + lock.lock(); + while (url == null) { + try { + condition.await(); + url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); + } catch (InterruptedException e) { + } + } + } finally { + lock.unlock(); + } + } pool.returnResource(jedis); return new Request(url); } diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java index 6cf50c39b..a403b91ce 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java @@ -6,6 +6,11 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.remote.DesiredCapabilities; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; /** * @author yihua.huang@dianping.com
      @@ -18,7 +23,16 @@ public class SeleniumTest { @Test public void testSelenium() { System.getProperties().setProperty("webdriver.chrome.driver", "/Users/yihua/Downloads/chromedriver"); - WebDriver webDriver = new ChromeDriver(); + Map contentSettings = new HashMap(); + contentSettings.put("images", 2); + + Map preferences = new HashMap(); + preferences.put("profile.default_content_settings", contentSettings); + + DesiredCapabilities caps = DesiredCapabilities.chrome(); + caps.setCapability("chrome.prefs", preferences); + caps.setCapability("chrome.switches", Arrays.asList("--user-data-dir=/Users/yihua/temp/chrome")); + WebDriver webDriver = new ChromeDriver(caps); webDriver.get("http://huaban.com/"); WebElement webElement = webDriver.findElement(By.xpath("/html")); System.out.println(webElement.getAttribute("outerHTML")); From 2ed275863ae5856d14adc1cdf6811e166656dd62 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 19:12:55 +0800 Subject: [PATCH 075/175] fix redis null pointer exception --- .../webmagic/scheduler/RedisScheduler.java | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index 575beefc7..382642b7d 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -7,9 +7,6 @@ import us.codecraft.webmagic.Task; import us.codecraft.webmagic.schedular.Scheduler; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - /** * 使用redis管理url,构建一个分布式的爬虫。
      * @@ -25,10 +22,6 @@ public class RedisScheduler implements Scheduler { private static final String SET_PREFIX = "set_"; - private ReentrantLock lock = new ReentrantLock(); - - private Condition condition = lock.newCondition(); - public RedisScheduler(String host) { pool = new JedisPool(new JedisPoolConfig(), host); } @@ -38,15 +31,9 @@ public synchronized void push(Request request, Task task) { Jedis jedis = pool.getResource(); //使用SortedSet进行url去重 if (jedis.zrank(SET_PREFIX + task.getUUID(), request.getUrl()) == null) { - try { - lock.lock(); - //使用List保存队列 - jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl()); - jedis.zadd(SET_PREFIX + task.getUUID(), System.currentTimeMillis(), request.getUrl()); - condition.signal(); - } finally { - lock.unlock(); - } + //使用List保存队列 + jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl()); + jedis.zadd(SET_PREFIX + task.getUUID(), System.currentTimeMillis(), request.getUrl()); } pool.returnResource(jedis); } @@ -55,21 +42,10 @@ public synchronized void push(Request request, Task task) { public synchronized Request poll(Task task) { Jedis jedis = pool.getResource(); String url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); - if (url == null) { - try { - lock.lock(); - while (url == null) { - try { - condition.await(); - url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); - } catch (InterruptedException e) { - } - } - } finally { - lock.unlock(); - } - } pool.returnResource(jedis); + if (url==null){ + return null; + } return new Request(url); } } From 58874c4cd3b685773777ba72ab14b8b10f7e5a19 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 26 Jul 2013 21:22:57 +0800 Subject: [PATCH 076/175] add list output support --- .../webmagic/pipeline/ConsolePipeline.java | 9 ++++ .../webmagic/pipeline/FilePipeline.java | 22 ++++++--- .../samples/InfoQMiniBookProcessor.java | 49 +++++++++++++++++++ 3 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/InfoQMiniBookProcessor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 8be5fabb6..97470e04f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -20,6 +20,15 @@ public void process(ResultItems resultItems,Task task) { } System.out.println("get page: "+resultItems.getRequest().getUrl()); for (Map.Entry entry : resultItems.getAll().entrySet()) { + if (entry.getValue() instanceof Iterable) { + Iterable value = (Iterable) entry.getValue(); + System.out.println(entry.getKey() + ":"); + for (Object o : value) { + System.out.println(o); + } + } else { + System.out.println(entry.getKey() + ":\t" + entry.getValue()); + } System.out.println(entry.getKey()+":\t"+entry.getValue()); } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index cbce8324a..01f8d8b82 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -13,9 +13,10 @@ /** * 持久化到文件的接口。 + * * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午6:28 + * Date: 13-4-21 + * Time: 下午6:28 */ public class FilePipeline implements Pipeline { @@ -32,6 +33,7 @@ public FilePipeline() { /** * 新建一个FilePipeline + * * @param path 文件保存路径 */ public FilePipeline(String path) { @@ -45,18 +47,26 @@ public void process(ResultItems resultItems, Task task) { if (!file.exists()) { file.mkdirs(); } - if (resultItems.isSkip()){ + if (resultItems.isSkip()) { return; } try { - PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl())+".html")); + PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()) + ".html")); printWriter.println("url:\t" + resultItems.getRequest().getUrl()); for (Map.Entry entry : resultItems.getAll().entrySet()) { - printWriter.println(entry.getKey()+":\t"+entry.getValue()); + 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); + logger.warn("write file error", e); } } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/InfoQMiniBookProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/InfoQMiniBookProcessor.java new file mode 100644 index 000000000..b43c3c569 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/InfoQMiniBookProcessor.java @@ -0,0 +1,49 @@ +package us.codecraft.webmagic.samples; + +import org.apache.commons.collections.CollectionUtils; +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.pipeline.FilePipeline; +import us.codecraft.webmagic.processor.PageProcessor; +import us.codecraft.webmagic.scheduler.RedisScheduler; + +import java.util.List; + +/** + * @author code4crafter@gmail.com
      + * Date: 13-4-21 + * Time: 下午8:08 + */ +public class InfoQMiniBookProcessor implements PageProcessor { + + private Site site; + + @Override + public void process(Page page) { + page.addTargetRequests(page.getHtml().links().regex("http://www\\.infoq\\.com/cn/minibooks/.*").all()); + List all = page.getHtml().links().regex(".*\\.pdf").all(); + if (CollectionUtils.isNotEmpty(all)) { + page.putField("pdf", all); + } else { + page.getResultItems().setSkip(true); + } + } + + @Override + public Site getSite() { + if (site == null) { + site = Site.me().setDomain("www.infoq.com").addStartUrl("http://www.infoq.com/cn/minibooks").addCookie("RegisteredUserCookie", "sDDDc8dIAgZSq67uJSXhtpQaHEi1XDOH"). + setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); + } + return site; + } + + public static void main(String[] args) { + Spider.create(new InfoQMiniBookProcessor()) + .scheduler(new RedisScheduler("localhost")) + .pipeline(new FilePipeline("/data/temp/webmagic/")) + .thread(5) + .run(); + } +} From 5a7d90db9b264a501a0c320f41c315e442ab7706 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 29 Jul 2013 10:59:23 +0800 Subject: [PATCH 077/175] fix a spider init problem --- webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index cd092a308..2a8b78fb1 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -270,7 +270,9 @@ public Spider thread(int threadNum) { if (threadNum <= 0) { throw new IllegalArgumentException("threadNum should be more than one!"); } - downloader = new HttpClientDownloader(threadNum); + if (downloader==null || downloader instanceof HttpClientDownloader){ + downloader = new HttpClientDownloader(threadNum); + } if (threadNum == 1) { return this; } From 5388a4a4f692055b9d9dcf004e1b723923917b3f Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 29 Jul 2013 18:00:12 +0800 Subject: [PATCH 078/175] add selenium download timeout --- .../downloader/SeleniumDownloader.java | 22 ++++++++++++++++++- .../downloader/SeleniumDownloaderTest.java | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index b4dd3720b..54e3c9c0c 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -20,18 +20,22 @@ /** * 使用Selenium调用浏览器进行渲染。目前仅支持chrome。
      * 需要下载Selenium driver支持。
      + * * @author yihua.huang@dianping.com
      * @date: 13-7-26
      * Time: 下午1:37
      */ -public class SeleniumDownloader implements Downloader,Destroyable { +public class SeleniumDownloader implements Downloader, Destroyable { private WebDriverPool webDriverPool; private Logger logger = Logger.getLogger(getClass()); + private int sleepTime = 0; + /** * 新建 + * * @param chromeDriverPath */ public SeleniumDownloader(String chromeDriverPath) { @@ -44,6 +48,16 @@ public SeleniumDownloader(String chromeDriverPath, int poolSize) { webDriverPool = new WebDriverPool(poolSize); } + /** + * set sleep time to wait until load success + * @param sleepTime + * @return this + */ + public SeleniumDownloader setSleepTime(int sleepTime) { + this.sleepTime = sleepTime; + return this; + } + @Override public Page download(Request request, Task task) { WebDriver webDriver; @@ -55,6 +69,11 @@ public Page download(Request request, Task task) { } logger.info("downloading page " + request.getUrl()); webDriver.get(request.getUrl()); + try { + Thread.sleep(sleepTime); + } catch (InterruptedException e) { + e.printStackTrace(); + } WebDriver.Options manage = webDriver.manage(); Site site = task.getSite(); if (site.getCookies() != null) { @@ -65,6 +84,7 @@ public Page download(Request request, Task task) { } WebElement webElement = webDriver.findElement(By.xpath("/html")); String content = webElement.getAttribute("outerHTML"); + // Page page = new Page(); page.setHtml(new Html(UrlUtils.fixAllRelativeHrefs(content, request.getUrl()))); page.setUrl(new PlainText(request.getUrl())); diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java index 615ad8674..4aa99195e 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java @@ -14,7 +14,7 @@ */ public class SeleniumDownloaderTest { - private String chromeDriverPath = ""; + private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; @Ignore("need chrome driver") @Test @@ -37,4 +37,5 @@ public Site getSite() { } System.out.println(System.currentTimeMillis() - time1); } + } From bd2ced87d7a782d2310e946de8ce8e493898f3a5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 29 Jul 2013 20:01:44 +0800 Subject: [PATCH 079/175] =?UTF-8?q?=E4=B8=BAdownloader=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E4=B8=80=E4=B8=AA=E6=96=B0=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E8=AE=BE=E7=BD=AE=E7=BA=BF=E7=A8=8B=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/us/codecraft/webmagic/Spider.java | 17 +++++++------ .../webmagic/downloader/Downloader.java | 13 ++++++++-- .../webmagic/downloader/FileDownloader.java | 5 ++++ .../downloader/HttpClientDownloader.java | 13 ++++------ .../downloader/SeleniumDownloader.java | 25 +++++++++++++------ 5 files changed, 48 insertions(+), 25 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 2a8b78fb1..a25fd024c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -58,6 +58,8 @@ public class Spider implements Runnable, Task { private ExecutorService executorService; + private int threadNum = 1; + private AtomicInteger stat = new AtomicInteger(STAT_INIT); private final static int STAT_INIT = 0; @@ -144,6 +146,10 @@ protected void checkComponent() { if (downloader == null) { this.downloader = new HttpClientDownloader(); } + if (pipelines.isEmpty()) { + pipelines.add(new ConsolePipeline()); + } + downloader.setThread(threadNum); } @Override @@ -158,9 +164,6 @@ public void run() { } } Request request = scheduler.poll(this); - if (pipelines.isEmpty()) { - pipelines.add(new ConsolePipeline()); - } //singel thread if (executorService == null) { while (request != null) { @@ -211,9 +214,9 @@ private void destroy() { } } - private void destroyEach(Object object){ + private void destroyEach(Object object) { if (object instanceof Destroyable) { - ((Destroyable)object).destroy(); + ((Destroyable) object).destroy(); } } @@ -267,12 +270,10 @@ public void runAsync() { */ public Spider thread(int threadNum) { checkIfNotRunning(); + this.threadNum = threadNum; if (threadNum <= 0) { throw new IllegalArgumentException("threadNum should be more than one!"); } - if (downloader==null || downloader instanceof HttpClientDownloader){ - downloader = new HttpClientDownloader(threadNum); - } if (threadNum == 1) { return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java index c431fc3b4..9a7f59a3a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Downloader.java @@ -6,9 +6,10 @@ /** * Downloader是webmagic下载页面的接口。webmagic默认使用了HttpComponent作为下载器,一般情况,你无需自己实现这个接口。
      + * * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午12:14 + * Date: 13-4-21 + * Time: 下午12:14 */ public interface Downloader { @@ -20,4 +21,12 @@ public interface Downloader { * @return page */ public Page download(Request request, Task task); + + /** + * 设置线程数,多线程程序一般需要Downloader支持
      + * 如果不考虑多线程的可以不实现这个方法
      + * + * @param thread 线程数量 + */ + public void setThread(int thread); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java index d22bf0815..722a2eb71 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java @@ -67,6 +67,11 @@ public Page download(Request request, Task task) { return page; } + @Override + public void setThread(int thread) { + + } + private String getHtml(BufferedReader bufferedReader) throws IOException { String line; StringBuilder htmlBuilder= new StringBuilder(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index d76341986..7956cd1ef 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -32,14 +32,6 @@ public class HttpClientDownloader implements Downloader { private int poolSize; - public HttpClientDownloader(int poolSize) { - this.poolSize = poolSize; - } - - public HttpClientDownloader() { - this(5); - } - @Override public Page download(Request request, Task task) { Site site = task.getSite(); @@ -90,6 +82,11 @@ public Page download(Request request, Task task) { return null; } + @Override + public void setThread(int thread) { + poolSize=thread; + } + private void handleGzip(HttpResponse httpResponse) { Header ceheader = httpResponse.getEntity().getContentEncoding(); if (ceheader != null) { diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index 54e3c9c0c..76ac0508d 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -27,12 +27,14 @@ */ public class SeleniumDownloader implements Downloader, Destroyable { - private WebDriverPool webDriverPool; + private volatile WebDriverPool webDriverPool; private Logger logger = Logger.getLogger(getClass()); private int sleepTime = 0; + private int poolSize = 1; + /** * 新建 * @@ -40,16 +42,11 @@ public class SeleniumDownloader implements Downloader, Destroyable { */ public SeleniumDownloader(String chromeDriverPath) { System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); - webDriverPool = new WebDriverPool(); - } - - public SeleniumDownloader(String chromeDriverPath, int poolSize) { - System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); - webDriverPool = new WebDriverPool(poolSize); } /** * set sleep time to wait until load success + * * @param sleepTime * @return this */ @@ -60,6 +57,7 @@ public SeleniumDownloader setSleepTime(int sleepTime) { @Override public Page download(Request request, Task task) { + checkInit(); WebDriver webDriver; try { webDriver = webDriverPool.get(); @@ -93,6 +91,19 @@ public Page download(Request request, Task task) { return page; } + private void checkInit() { + if (webDriverPool == null) { + synchronized (this){ + webDriverPool = new WebDriverPool(poolSize); + } + } + } + + @Override + public void setThread(int thread) { + this.poolSize = thread; + } + @Override public void destroy() { webDriverPool.closeAll(); From 878b121d4a7fef766bcd230700528a016aa9d97b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 29 Jul 2013 20:05:44 +0800 Subject: [PATCH 080/175] add comments for selenium driver --- .../selenium/downloader/SeleniumDownloader.java | 1 - .../webmagic/selenium/downloader/WebDriverPool.java | 10 ++++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index 76ac0508d..1b689d4d2 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -82,7 +82,6 @@ public Page download(Request request, Task task) { } WebElement webElement = webDriver.findElement(By.xpath("/html")); String content = webElement.getAttribute("outerHTML"); - // Page page = new Page(); page.setHtml(new Html(UrlUtils.fixAllRelativeHrefs(content, request.getUrl()))); page.setUrl(new PlainText(request.getUrl())); diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java index 039cef98e..faed8d63a 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java @@ -27,8 +27,16 @@ class WebDriverPool { private AtomicInteger stat = new AtomicInteger(STAT_RUNNING); + /** + * store webDrivers created + */ private List webDriverList = Collections.synchronizedList(new ArrayList()); + /** + * store webDrivers available + */ + private BlockingDeque innerQueue = new LinkedBlockingDeque(); + public WebDriverPool(int capacity) { this.capacity = capacity; } @@ -37,8 +45,6 @@ public WebDriverPool() { this(DEFAULT_CAPACITY); } - private BlockingDeque innerQueue = new LinkedBlockingDeque(); - public WebDriver get() throws InterruptedException { checkRunning(); WebDriver poll = innerQueue.poll(); From fc008fc9b3f18fce159bc94e3b97054a469ca940 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 30 Jul 2013 09:36:00 +0800 Subject: [PATCH 081/175] dep --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 75bea5287..e6212c73d 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载 ###Get Started webmagic定制的核心是PageProcessor接口。 + +项目使用maven托管,如果没用maven的可以去[http://git.oschina.net/flashsword20/webmagic-bin](http://git.oschina.net/flashsword20/webmagic-bin)库下载依赖包(这个仓库代码没有实时同步更新,不过依赖应该不会有变化)。 例如,我们要实现一个简单的通用爬虫SimplePageProcessor,代码如下: @@ -73,7 +75,6 @@ webmagic定制的核心是PageProcessor接口。 Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); - ### 示例 webmagic-samples目录里有一些定制PageProcessor以抽取不同站点的例子。 From d836aaad95a5fbc66beb5b587600c0879c15b0cb Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 30 Jul 2013 15:24:59 +0800 Subject: [PATCH 082/175] fix encoding --- pom.xml | 1 + .../webmagic/utils/UrlUtilsTest.java | 5 +- .../downloader/SeleniumDownloaderTest.java | 68 ++++++++++++------- 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 086437d11..5974eae80 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,7 @@ 1.6 1.6 + UTF-8 diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java index cd55b2c77..7ac7aa06a 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/utils/UrlUtilsTest.java @@ -25,10 +25,7 @@ public void testFixRelativeUrl() { Assert.assertEquals("http://www.dianping.com/aa", fixrelativeurl); fixrelativeurl = UrlUtils.canonicalizeUrl("..aa", "http://www.dianping.com/sh/ss/com"); Assert.assertEquals("http://www.dianping.com/sh/ss/..aa", fixrelativeurl); -// fixrelativeurl = fixrelativeurl("/aa", "http://www.dianping.com"); -// System.out.println("fix: " + fixrelativeurl); -// fixrelativeurl = fixrelativeurl("/aa", "http://www.dianping.com/"); -// System.out.println("fix: " + fixrelativeurl); + fixrelativeurl = UrlUtils.canonicalizeUrl("../../aa", "http://www.dianping.com/sh/ss/com"); } @Test diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java index 4aa99195e..968308377 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java @@ -10,32 +10,52 @@ /** * @author yihua.huang@dianping.com
      * @date: 13-7-26
      - * Time: 下午2:46
      + * Time: 下午2:46
      */ public class SeleniumDownloaderTest { - private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; - - @Ignore("need chrome driver") - @Test - public void test() { - SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); - long time1 = System.currentTimeMillis(); - for (int i = 0; i < 100; i++) { - Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { - @Override - public String getUUID() { - return "huaban.com"; - } - - @Override - public Site getSite() { - return Site.me(); - } - }); - System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); - } - System.out.println(System.currentTimeMillis() - time1); - } + private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + + @Ignore("need chrome driver") + @Test + public void test() { + SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + long time1 = System.currentTimeMillis(); + for (int i = 0; i < 100; i++) { + Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { + @Override + public String getUUID() { + return "huaban.com"; + } + + @Override + public Site getSite() { + return Site.me(); + } + }); + System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); + } + System.out.println(System.currentTimeMillis() - time1); + } + + @Ignore + @Test + public void testBaiduWenku() { + SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + seleniumDownloader.setSleepTime(10000); + long time1 = System.currentTimeMillis(); + Page page = seleniumDownloader.download(new Request("http://wenku.baidu.com/view/462933ff04a1b0717fd5ddc2.html"), new Task() { + @Override + public String getUUID() { + return "huaban.com"; + } + + @Override + public Site getSite() { + return Site.me(); + } + }); + System.out.println(page.getHtml().$("div.inner").replace("<[^<>]+>","").replace("&nsbp;","").all()); + } } From 12bec8c91aaf6162e0ce1a2eb0789da645c493bc Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 30 Jul 2013 21:39:43 +0800 Subject: [PATCH 083/175] fix a thread problem --- .../us/codecraft/webmagic/downloader/HttpClientDownloader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java index 7956cd1ef..0e0977ae1 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientDownloader.java @@ -30,7 +30,7 @@ public class HttpClientDownloader implements Downloader { private Logger logger = Logger.getLogger(getClass()); - private int poolSize; + private int poolSize = 1; @Override public Page download(Request request, Task task) { From a13d504e43b1acbaf02d2a4b306e839d022c5314 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 1 Aug 2013 22:40:57 +0800 Subject: [PATCH 084/175] add annotation --- .../webmagic/annotation/Fetcher.java | 21 ++++ .../webmagic/annotation/FieldFetcher.java | 30 +++++ .../annotation/ObjectPageProcessor.java | 65 +++++++++++ .../webmagic/annotation/PageModelFetcher.java | 104 ++++++++++++++++++ .../webmagic/annotation/TargetUrl.java | 17 +++ .../codecraft/webmagic/selector/Selector.java | 2 +- .../codecraft/webmagic/annotation/Blog.java | 24 ++++ .../webmagic/annotation/TestFetcher.java | 20 ++++ 8 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java create mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java create mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java new file mode 100644 index 000000000..86f78db21 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java @@ -0,0 +1,21 @@ +package us.codecraft.webmagic.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface Fetcher { + + String value(); + + public enum Type {XPath, Regex, Css}; + + Type type() default Type.XPath; +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java new file mode 100644 index 000000000..ee9962b8f --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java @@ -0,0 +1,30 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.selector.Selector; + +import java.lang.reflect.Field; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午9:48
      + */ +class FieldFetcher { + + private final Field field; + + private final Selector selector; + + FieldFetcher(Field field, Selector selector) { + this.field = field; + this.selector = selector; + } + + Field getField() { + return field; + } + + Selector getSelector() { + return selector; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java new file mode 100644 index 000000000..98c969e14 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java @@ -0,0 +1,65 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.processor.PageProcessor; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午8:46
      + */ +public class ObjectPageProcessor implements PageProcessor { + + private List pageModelFetcherList; + + private Site site; + + private Set targetUrlPatterns; + + public static ObjectPageProcessor create(Site site, Class... clazzs) { + List pageModelFetcherList = new ArrayList(); + for (Class clazz : clazzs) { + PageModelFetcher pageModelFetcher = PageModelFetcher.create(clazz); + pageModelFetcherList.add(pageModelFetcher); + } + ObjectPageProcessor objectPageProcessor = new ObjectPageProcessor(site, pageModelFetcherList); + return objectPageProcessor; + } + + private ObjectPageProcessor(Site site, List pageModelFetcherList) { + this.site = site; + this.pageModelFetcherList = pageModelFetcherList; + targetUrlPatterns = new HashSet(); + for (PageModelFetcher pageModelFetcher : pageModelFetcherList) { + targetUrlPatterns.addAll(pageModelFetcher.getTargetUrlPatterns()); + } + } + + @Override + public void process(Page page) { + for (PageModelFetcher pageModelFetcher : pageModelFetcherList) { + Object process = pageModelFetcher.process(page); + page.putField(pageModelFetcher.getClazz().getCanonicalName(), process); + } + for (String link : page.getHtml().links().all()) { + for (Pattern targetUrlPattern : targetUrlPatterns) { + if (targetUrlPattern.matcher(link).matches()){ + page.addTargetRequest(new Request(link)); + } + } + } + } + + @Override + public Site getSite() { + return site; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java new file mode 100644 index 000000000..097f1af38 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java @@ -0,0 +1,104 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.selector.CssSelector; +import us.codecraft.webmagic.selector.RegexSelector; +import us.codecraft.webmagic.selector.Selector; +import us.codecraft.webmagic.selector.XpathSelector; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午9:33
      + */ +class PageModelFetcher { + + private List targetUrlPatterns; + + private Class clazz; + + private List fieldFetchers; + + public static PageModelFetcher create(Class clazz) { + PageModelFetcher pageModelFetcher = new PageModelFetcher(); + pageModelFetcher.init(clazz); + return pageModelFetcher; + } + + private void init(Class clazz) { + this.clazz = clazz; + initTargetUrlPatterns(); + fieldFetchers = new ArrayList(); + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + Fetcher fetcher = field.getAnnotation(Fetcher.class); + String value = fetcher.value(); + Selector selector; + switch (fetcher.type()) { + case Css: + selector = new CssSelector(value); + break; + case Regex: + selector = new RegexSelector(value); + break; + case XPath: + selector = new XpathSelector(value); + break; + default: + selector = new XpathSelector(value); + } + fieldFetchers.add(new FieldFetcher(field, selector)); + } + } + + private void initTargetUrlPatterns() { + targetUrlPatterns = new ArrayList(); + Annotation annotation = clazz.getAnnotation(TargetUrl.class); + if (annotation == null) { + targetUrlPatterns.add(Pattern.compile(".*")); + } else { + String[] value = ((TargetUrl) annotation).value(); + for (String s : value) { + targetUrlPatterns.add(Pattern.compile(s.replace(".","\\.").replace("*","[^\"'#]*"))); + } + } + } + + public Object process(Page page) { + boolean matched = false; + for (Pattern targetPattern : targetUrlPatterns) { + if (targetPattern.matcher(page.getUrl().toString()).matches()) { + matched = true; + } + } + if (!matched) { + return null; + } + Object o = null; + try { + o = clazz.newInstance(); + for (FieldFetcher fieldFetcher : fieldFetchers) { + fieldFetcher.getField().set(o, fieldFetcher.getSelector().select(page.getHtml().toString())); + } + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return o; + } + + Class getClazz() { + return clazz; + } + + List getTargetUrlPatterns() { + return targetUrlPatterns; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java new file mode 100644 index 000000000..f4f58ed48 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java @@ -0,0 +1,17 @@ +package us.codecraft.webmagic.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface TargetUrl { + + String[] value(); +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java index 845c0b6c5..4af2b449a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selector.java @@ -8,7 +8,7 @@ * Date: 13-4-20 * Time: 下午8:02 */ -interface Selector { +public interface Selector { public String select(String text); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java new file mode 100644 index 000000000..6c6e88c81 --- /dev/null +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java @@ -0,0 +1,24 @@ +package us.codecraft.webmagic.annotation; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午10:18
      + */ +@TargetUrl("http://djjchobits.iteye.com/blog/\\d+") +public class Blog { + + @Fetcher("//title") + private String title; + + @Fetcher(value = "div#main",type = Fetcher.Type.Css) + private String content; + + @Override + public String toString() { + return "Blog{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } +} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java new file mode 100644 index 000000000..5318703d9 --- /dev/null +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java @@ -0,0 +1,20 @@ +package us.codecraft.webmagic.annotation; + +import org.junit.Test; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午8:42
      + */ +public class TestFetcher { + + @Test + public void test() { + Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://djjchobits.iteye.com/blog/569000"), Blog.class)).run(); + + } + +} From fef004941866930ff7224a1c3df8fa931a863271 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 1 Aug 2013 22:53:44 +0800 Subject: [PATCH 085/175] processor --- .../main/java/us/codecraft/webmagic/selector/CssSelector.java | 2 +- .../src/test/java/us/codecraft/webmagic/annotation/Blog.java | 4 ++-- .../java/us/codecraft/webmagic/annotation/TestFetcher.java | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java index 10dfb6230..90a9d1d7d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java @@ -27,7 +27,7 @@ public CssSelector(String selectorText) { public String select(String text) { Document doc = Jsoup.parse(text); Elements elements = doc.select(selectorText); - if (CollectionUtils.isNotEmpty(elements)) { + if (CollectionUtils.isEmpty(elements)) { return null; } return elements.get(0).outerHtml(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java index 6c6e88c81..391ce100f 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java @@ -5,13 +5,13 @@ * @date: 13-8-1
      * Time: 下午10:18
      */ -@TargetUrl("http://djjchobits.iteye.com/blog/\\d+") +@TargetUrl("http://my.oschina.net/flashsword/blog/*") public class Blog { @Fetcher("//title") private String title; - @Fetcher(value = "div#main",type = Fetcher.Type.Css) + @Fetcher(value = "div.BlogContent",type = Fetcher.Type.Css) private String content; @Override diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java index 5318703d9..e97b5cf98 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.annotation; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; @@ -11,9 +12,10 @@ */ public class TestFetcher { + @Ignore("takes long") @Test public void test() { - Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://djjchobits.iteye.com/blog/569000"), Blog.class)).run(); + Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), Blog.class)).run(); } From aaf6011103303178609ab94e8f1af1d551ac43dc Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 1 Aug 2013 22:55:19 +0800 Subject: [PATCH 086/175] fix a css selector bug=.=! --- .../main/java/us/codecraft/webmagic/selector/CssSelector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java index 10dfb6230..90a9d1d7d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/CssSelector.java @@ -27,7 +27,7 @@ public CssSelector(String selectorText) { public String select(String text) { Document doc = Jsoup.parse(text); Elements elements = doc.select(selectorText); - if (CollectionUtils.isNotEmpty(elements)) { + if (CollectionUtils.isEmpty(elements)) { return null; } return elements.get(0).outerHtml(); From ed14199ca2da26e5f34ad195a8b85a8aa1e34c09 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 06:33:48 +0800 Subject: [PATCH 087/175] rename --- .../{Fetcher.java => ExtractBy.java} | 2 +- ...{FieldFetcher.java => FieldExtractor.java} | 4 +-- .../annotation/ObjectPageProcessor.java | 24 ++++++++--------- ...elFetcher.java => PageModelExtractor.java} | 26 +++++++++---------- .../codecraft/webmagic/annotation/Blog.java | 4 +-- 5 files changed, 30 insertions(+), 30 deletions(-) rename webmagic-core/src/main/java/us/codecraft/webmagic/annotation/{Fetcher.java => ExtractBy.java} (93%) rename webmagic-core/src/main/java/us/codecraft/webmagic/annotation/{FieldFetcher.java => FieldExtractor.java} (86%) rename webmagic-core/src/main/java/us/codecraft/webmagic/annotation/{PageModelFetcher.java => PageModelExtractor.java} (77%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java similarity index 93% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java index 86f78db21..7c749b3d0 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/Fetcher.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java @@ -11,7 +11,7 @@ */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) -public @interface Fetcher { +public @interface ExtractBy { String value(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java similarity index 86% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java index ee9962b8f..243ae9fcc 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldFetcher.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java @@ -9,13 +9,13 @@ * @date: 13-8-1
      * Time: 下午9:48
      */ -class FieldFetcher { +class FieldExtractor { private final Field field; private final Selector selector; - FieldFetcher(Field field, Selector selector) { + FieldExtractor(Field field, Selector selector) { this.field = field; this.selector = selector; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java index 98c969e14..4b54963ff 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java @@ -18,36 +18,36 @@ */ public class ObjectPageProcessor implements PageProcessor { - private List pageModelFetcherList; + private List pageModelExtractorList; private Site site; private Set targetUrlPatterns; public static ObjectPageProcessor create(Site site, Class... clazzs) { - List pageModelFetcherList = new ArrayList(); + List pageModelExtractorList = new ArrayList(); for (Class clazz : clazzs) { - PageModelFetcher pageModelFetcher = PageModelFetcher.create(clazz); - pageModelFetcherList.add(pageModelFetcher); + PageModelExtractor pageModelExtractor = PageModelExtractor.create(clazz); + pageModelExtractorList.add(pageModelExtractor); } - ObjectPageProcessor objectPageProcessor = new ObjectPageProcessor(site, pageModelFetcherList); + ObjectPageProcessor objectPageProcessor = new ObjectPageProcessor(site, pageModelExtractorList); return objectPageProcessor; } - private ObjectPageProcessor(Site site, List pageModelFetcherList) { + private ObjectPageProcessor(Site site, List pageModelExtractorList) { this.site = site; - this.pageModelFetcherList = pageModelFetcherList; + this.pageModelExtractorList = pageModelExtractorList; targetUrlPatterns = new HashSet(); - for (PageModelFetcher pageModelFetcher : pageModelFetcherList) { - targetUrlPatterns.addAll(pageModelFetcher.getTargetUrlPatterns()); + for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { + targetUrlPatterns.addAll(pageModelExtractor.getTargetUrlPatterns()); } } @Override public void process(Page page) { - for (PageModelFetcher pageModelFetcher : pageModelFetcherList) { - Object process = pageModelFetcher.process(page); - page.putField(pageModelFetcher.getClazz().getCanonicalName(), process); + for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { + Object process = pageModelExtractor.process(page); + page.putField(pageModelExtractor.getClazz().getCanonicalName(), process); } for (String link : page.getHtml().links().all()) { for (Pattern targetUrlPattern : targetUrlPatterns) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java similarity index 77% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index 097f1af38..671dd56ca 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelFetcher.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -17,30 +17,30 @@ * @date: 13-8-1
      * Time: 下午9:33
      */ -class PageModelFetcher { +class PageModelExtractor { private List targetUrlPatterns; private Class clazz; - private List fieldFetchers; + private List fieldExtractors; - public static PageModelFetcher create(Class clazz) { - PageModelFetcher pageModelFetcher = new PageModelFetcher(); - pageModelFetcher.init(clazz); - return pageModelFetcher; + public static PageModelExtractor create(Class clazz) { + PageModelExtractor pageModelExtractor = new PageModelExtractor(); + pageModelExtractor.init(clazz); + return pageModelExtractor; } private void init(Class clazz) { this.clazz = clazz; initTargetUrlPatterns(); - fieldFetchers = new ArrayList(); + fieldExtractors = new ArrayList(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); - Fetcher fetcher = field.getAnnotation(Fetcher.class); - String value = fetcher.value(); + ExtractBy extractBy = field.getAnnotation(ExtractBy.class); + String value = extractBy.value(); Selector selector; - switch (fetcher.type()) { + switch (extractBy.type()) { case Css: selector = new CssSelector(value); break; @@ -53,7 +53,7 @@ private void init(Class clazz) { default: selector = new XpathSelector(value); } - fieldFetchers.add(new FieldFetcher(field, selector)); + fieldExtractors.add(new FieldExtractor(field, selector)); } } @@ -83,8 +83,8 @@ public Object process(Page page) { Object o = null; try { o = clazz.newInstance(); - for (FieldFetcher fieldFetcher : fieldFetchers) { - fieldFetcher.getField().set(o, fieldFetcher.getSelector().select(page.getHtml().toString())); + for (FieldExtractor fieldExtractor : fieldExtractors) { + fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getHtml().toString())); } } catch (InstantiationException e) { e.printStackTrace(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java index 391ce100f..7139694d1 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java @@ -8,10 +8,10 @@ @TargetUrl("http://my.oschina.net/flashsword/blog/*") public class Blog { - @Fetcher("//title") + @ExtractBy("//title") private String title; - @Fetcher(value = "div.BlogContent",type = Fetcher.Type.Css) + @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) private String content; @Override From 19bc18e3795604168ed38d00b53585fc16f14892 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 06:59:25 +0800 Subject: [PATCH 088/175] add extract by url --- .../webmagic/annotation/ExtractByUrl.java | 18 +++++++ .../webmagic/annotation/FieldExtractor.java | 17 +++++- .../annotation/ObjectPageProcessor.java | 4 ++ .../annotation/PageModelExtractor.java | 52 +++++++++++++------ .../{Blog.java => OschinaBlog.java} | 4 +- .../webmagic/annotation/TestFetcher.java | 2 +- .../webmagic/selector/XpathSelectorTest.java | 2 +- 7 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java rename webmagic-core/src/test/java/us/codecraft/webmagic/annotation/{Blog.java => OschinaBlog.java} (89%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java new file mode 100644 index 000000000..3ecb45191 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java @@ -0,0 +1,18 @@ +package us.codecraft.webmagic.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ExtractByUrl { + + String value() default ""; + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java index 243ae9fcc..1827d7a57 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java @@ -15,9 +15,20 @@ class FieldExtractor { private final Selector selector; - FieldExtractor(Field field, Selector selector) { + private final Source source; + + static enum Source {Html, Url} + + public FieldExtractor(Field field, Selector selector) { + this.field = field; + this.selector = selector; + this.source = Source.Html; + } + + public FieldExtractor(Field field, Selector selector, Source source) { this.field = field; this.selector = selector; + this.source = source; } Field getField() { @@ -27,4 +38,8 @@ Field getField() { Selector getSelector() { return selector; } + + Source getSource() { + return source; + } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java index 4b54963ff..ae3131e86 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java @@ -47,6 +47,7 @@ private ObjectPageProcessor(Site site, List pageModelExtract public void process(Page page) { for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { Object process = pageModelExtractor.process(page); + postProcessPageModel(pageModelExtractor.getClazz(), process); page.putField(pageModelExtractor.getClazz().getCanonicalName(), process); } for (String link : page.getHtml().links().all()) { @@ -58,6 +59,9 @@ public void process(Page page) { } } + protected void postProcessPageModel(Class clazz, Object object){ + } + @Override public Site getSite() { return site; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index 671dd56ca..14b869d82 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -38,22 +38,32 @@ private void init(Class clazz) { for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); ExtractBy extractBy = field.getAnnotation(ExtractBy.class); - String value = extractBy.value(); - Selector selector; - switch (extractBy.type()) { - case Css: - selector = new CssSelector(value); - break; - case Regex: - selector = new RegexSelector(value); - break; - case XPath: - selector = new XpathSelector(value); - break; - default: - selector = new XpathSelector(value); + if (extractBy != null) { + String value = extractBy.value(); + Selector selector; + switch (extractBy.type()) { + case Css: + selector = new CssSelector(value); + break; + case Regex: + selector = new RegexSelector(value); + break; + case XPath: + selector = new XpathSelector(value); + break; + default: + selector = new XpathSelector(value); + } + fieldExtractors.add(new FieldExtractor(field, selector)); + } + ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); + if (extractByUrl != null) { + String regexPattern = extractByUrl.value(); + if (regexPattern.trim().equals("")) { + regexPattern = ".*"; + } + fieldExtractors.add(new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url)); } - fieldExtractors.add(new FieldExtractor(field, selector)); } } @@ -65,7 +75,7 @@ private void initTargetUrlPatterns() { } else { String[] value = ((TargetUrl) annotation).value(); for (String s : value) { - targetUrlPatterns.add(Pattern.compile(s.replace(".","\\.").replace("*","[^\"'#]*"))); + targetUrlPatterns.add(Pattern.compile(s.replace(".", "\\.").replace("*", "[^\"'#]*"))); } } } @@ -84,7 +94,15 @@ public Object process(Page page) { try { o = clazz.newInstance(); for (FieldExtractor fieldExtractor : fieldExtractors) { - fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getHtml().toString())); + switch (fieldExtractor.getSource()) { + case Html: + fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getHtml().toString())); + break; + case Url: + fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getUrl().toString())); + break; + } + } } catch (InstantiationException e) { e.printStackTrace(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java similarity index 89% rename from webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java rename to webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java index 7139694d1..0435843a0 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/Blog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java @@ -6,7 +6,7 @@ * Time: 下午10:18
      */ @TargetUrl("http://my.oschina.net/flashsword/blog/*") -public class Blog { +public class OschinaBlog { @ExtractBy("//title") private String title; @@ -16,7 +16,7 @@ public class Blog { @Override public String toString() { - return "Blog{" + + return "OschinaBlog{" + "title='" + title + '\'' + ", content='" + content + '\'' + '}'; diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java index e97b5cf98..37a3305d3 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java @@ -15,7 +15,7 @@ public class TestFetcher { @Ignore("takes long") @Test public void test() { - Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), Blog.class)).run(); + Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class)).run(); } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 30d8a817b..6f1c21ed1 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1168,7 +1168,7 @@ public void test() { + " var location = window.location;\n" + " source_url = location.protocol + \"//\" + location.host + location.pathname + location.search;\n" + " pre.writeAttribute('codeable_id', post_id);\n" - + " pre.writeAttribute('codeable_type', \"Blog\");\n" + + " pre.writeAttribute('codeable_type', \"OschinaBlog\");\n" + " pre.writeAttribute('source_url', source_url);\n" + " pre.writeAttribute('pre_index', index);\n" + " pre.writeAttribute('title', 'jsoup 解析页面商品信息');\n" From 4fcf7650c4b3168788aefa48d041c44312afdc1c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 07:32:37 +0800 Subject: [PATCH 089/175] add setter support --- .../webmagic/annotation/FieldExtractor.java | 11 +++++ .../annotation/PageModelExtractor.java | 46 +++++++++++++++++-- 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java index 1827d7a57..d241c8d00 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java @@ -3,6 +3,7 @@ import us.codecraft.webmagic.selector.Selector; import java.lang.reflect.Field; +import java.lang.reflect.Method; /** * @author yihua.huang@dianping.com
      @@ -17,6 +18,8 @@ class FieldExtractor { private final Source source; + private Method setterMethod; + static enum Source {Html, Url} public FieldExtractor(Field field, Selector selector) { @@ -42,4 +45,12 @@ Selector getSelector() { Source getSource() { return source; } + + void setSetterMethod(Method setterMethod) { + this.setterMethod = setterMethod; + } + + Method getSetterMethod() { + return setterMethod; + } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index 14b869d82..7d0d4f2c7 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.annotation; +import org.apache.commons.lang3.StringUtils; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.selector.CssSelector; import us.codecraft.webmagic.selector.RegexSelector; @@ -8,6 +9,8 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; @@ -54,7 +57,12 @@ private void init(Class clazz) { default: selector = new XpathSelector(value); } - fieldExtractors.add(new FieldExtractor(field, selector)); + FieldExtractor fieldExtractor = new FieldExtractor(field, selector); + Method setterMethod = getSetterMethod(clazz, field); + if (setterMethod != null) { + fieldExtractor.setSetterMethod(setterMethod); + } + fieldExtractors.add(fieldExtractor); } ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); if (extractByUrl != null) { @@ -62,11 +70,27 @@ private void init(Class clazz) { if (regexPattern.trim().equals("")) { regexPattern = ".*"; } - fieldExtractors.add(new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url)); + FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url); + Method setterMethod = getSetterMethod(clazz, field); + if (setterMethod != null) { + fieldExtractor.setSetterMethod(setterMethod); + } + fieldExtractors.add(fieldExtractor); } } } + public static Method getSetterMethod(Class clazz, Field field) { + String name = "set" + StringUtils.capitalize(field.getName()); + try { + Method declaredMethod = clazz.getDeclaredMethod(name, field.getType()); + declaredMethod.setAccessible(true); + return declaredMethod; + } catch (NoSuchMethodException e) { + return null; + } + } + private void initTargetUrlPatterns() { targetUrlPatterns = new ArrayList(); Annotation annotation = clazz.getAnnotation(TargetUrl.class); @@ -94,24 +118,36 @@ public Object process(Page page) { try { o = clazz.newInstance(); for (FieldExtractor fieldExtractor : fieldExtractors) { + String value; switch (fieldExtractor.getSource()) { case Html: - fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getHtml().toString())); + value = fieldExtractor.getSelector().select(page.getHtml().toString()); break; case Url: - fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getUrl().toString())); + value = fieldExtractor.getSelector().select(page.getUrl().toString()); break; + default: + value = fieldExtractor.getSelector().select(page.getHtml().toString()); } - + setField(o,fieldExtractor,value); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); } return o; } + private void setField(Object o, FieldExtractor fieldExtractor, String value) throws IllegalAccessException, InvocationTargetException { + if (fieldExtractor.getSetterMethod()!=null){ + fieldExtractor.getSetterMethod().invoke(o,value); + } + fieldExtractor.getField().set(o, value); + } + Class getClazz() { return clazz; } From b25bf877991fc41be6dd27f91494309cd28880cb Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 08:09:37 +0800 Subject: [PATCH 090/175] invite notnull --- .../java/us/codecraft/webmagic/Spider.java | 5 +++ .../webmagic/annotation/ExtractBy.java | 2 ++ .../webmagic/annotation/ExtractByUrl.java | 4 ++- .../webmagic/annotation/FieldExtractor.java | 15 ++++---- .../webmagic/annotation/HelpUrl.java | 17 ++++++++++ .../annotation/ObjectPageProcessor.java | 4 +++ .../annotation/PageModelExtractor.java | 27 ++++++++++++--- .../annotation/samples/IteyeBlog.java | 34 +++++++++++++++++++ 8 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index a25fd024c..2717b665c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -2,6 +2,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; +import us.codecraft.webmagic.annotation.ObjectPageProcessor; import us.codecraft.webmagic.downloader.Destroyable; import us.codecraft.webmagic.downloader.Downloader; import us.codecraft.webmagic.downloader.HttpClientDownloader; @@ -89,6 +90,10 @@ public static Spider create(PageProcessor pageProcessor) { return new Spider(pageProcessor); } + public static Spider create(Site site,Class... pageModels) { + return new Spider(ObjectPageProcessor.create(site,pageModels)); + } + /** * 重新设置startUrls,会覆盖Site本身的startUrls。 * diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java index 7c749b3d0..4c791fd65 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java @@ -18,4 +18,6 @@ public enum Type {XPath, Regex, Css}; Type type() default Type.XPath; + + boolean notNull() default true; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java index 3ecb45191..57747f5ef 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java @@ -11,8 +11,10 @@ */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) -public @interface ExtractByUrl { +public @interface ExtractByUrl{ String value() default ""; + boolean notNull() default true; + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java index d241c8d00..f415cb857 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java @@ -20,18 +20,15 @@ class FieldExtractor { private Method setterMethod; - static enum Source {Html, Url} + private final boolean notNull; - public FieldExtractor(Field field, Selector selector) { - this.field = field; - this.selector = selector; - this.source = Source.Html; - } + static enum Source {Html, Url} - public FieldExtractor(Field field, Selector selector, Source source) { + public FieldExtractor(Field field, Selector selector, Source source, boolean notNull) { this.field = field; this.selector = selector; this.source = source; + this.notNull = notNull; } Field getField() { @@ -53,4 +50,8 @@ void setSetterMethod(Method setterMethod) { Method getSetterMethod() { return setterMethod; } + + boolean isNotNull() { + return notNull; + } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java new file mode 100644 index 000000000..302081776 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java @@ -0,0 +1,17 @@ +package us.codecraft.webmagic.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface HelpUrl { + + String[] value(); +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java index ae3131e86..ad8297ed3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java @@ -40,6 +40,7 @@ private ObjectPageProcessor(Site site, List pageModelExtract targetUrlPatterns = new HashSet(); for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { targetUrlPatterns.addAll(pageModelExtractor.getTargetUrlPatterns()); + targetUrlPatterns.addAll(pageModelExtractor.getHelpUrlPatterns()); } } @@ -47,6 +48,9 @@ private ObjectPageProcessor(Site site, List pageModelExtract public void process(Page page) { for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { Object process = pageModelExtractor.process(page); + if (process==null){ + page.getResultItems().setSkip(true); + } postProcessPageModel(pageModelExtractor.getClazz(), process); page.putField(pageModelExtractor.getClazz().getCanonicalName(), process); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index 7d0d4f2c7..41f635c3c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -24,6 +24,8 @@ class PageModelExtractor { private List targetUrlPatterns; + private List helpUrlPatterns; + private Class clazz; private List fieldExtractors; @@ -57,7 +59,7 @@ private void init(Class clazz) { default: selector = new XpathSelector(value); } - FieldExtractor fieldExtractor = new FieldExtractor(field, selector); + FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); @@ -70,7 +72,7 @@ private void init(Class clazz) { if (regexPattern.trim().equals("")) { regexPattern = ".*"; } - FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url); + FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); @@ -102,6 +104,14 @@ private void initTargetUrlPatterns() { targetUrlPatterns.add(Pattern.compile(s.replace(".", "\\.").replace("*", "[^\"'#]*"))); } } + helpUrlPatterns = new ArrayList(); + annotation = clazz.getAnnotation(HelpUrl.class); + if (annotation != null) { + String[] value = ((HelpUrl) annotation).value(); + for (String s : value) { + helpUrlPatterns.add(Pattern.compile(s.replace(".", "\\.").replace("*", "[^\"'#]*"))); + } + } } public Object process(Page page) { @@ -129,7 +139,10 @@ public Object process(Page page) { default: value = fieldExtractor.getSelector().select(page.getHtml().toString()); } - setField(o,fieldExtractor,value); + if (value==null&&fieldExtractor.isNotNull()){ + page.getResultItems().setSkip(true); + } + setField(o, fieldExtractor, value); } } catch (InstantiationException e) { e.printStackTrace(); @@ -142,8 +155,8 @@ public Object process(Page page) { } private void setField(Object o, FieldExtractor fieldExtractor, String value) throws IllegalAccessException, InvocationTargetException { - if (fieldExtractor.getSetterMethod()!=null){ - fieldExtractor.getSetterMethod().invoke(o,value); + if (fieldExtractor.getSetterMethod() != null) { + fieldExtractor.getSetterMethod().invoke(o, value); } fieldExtractor.getField().set(o, value); } @@ -155,4 +168,8 @@ Class getClazz() { List getTargetUrlPatterns() { return targetUrlPatterns; } + + List getHelpUrlPatterns() { + return helpUrlPatterns; + } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java new file mode 100644 index 000000000..8fbf08915 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java @@ -0,0 +1,34 @@ +package us.codecraft.webmagic.annotation.samples; + +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.annotation.ExtractBy; +import us.codecraft.webmagic.annotation.TargetUrl; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-2
      + * Time: 上午7:52
      + */ +@TargetUrl("http://dengminhui.iteye.com/blog/*") +public class IteyeBlog { + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div#blog_content",type = ExtractBy.Type.Css) + private String content; + + @Override + public String toString() { + return "IteyeBlog{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } + + public static void main(String[] args) { + Spider.create(Site.me().addStartUrl("http://dengminhui.iteye.com/blog"),IteyeBlog.class).run(); + } + +} From 0a3a88624186c02c94cbd82d04b51a663045e0a6 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 08:13:40 +0800 Subject: [PATCH 091/175] add some samples --- .../webmagic/annotation/samples/Blog.java | 13 ++++++ .../annotation/samples/IteyeBlog.java | 9 +++- .../annotation/samples/OschinaBlog.java | 41 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java new file mode 100644 index 000000000..c0890e1f2 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java @@ -0,0 +1,13 @@ +package us.codecraft.webmagic.annotation.samples; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-2
      + * Time: 上午8:10
      + */ +public interface Blog { + + public String getTitle(); + + public String getContent(); +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java index 8fbf08915..09a1d5b24 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java @@ -11,7 +11,7 @@ * Time: 上午7:52
      */ @TargetUrl("http://dengminhui.iteye.com/blog/*") -public class IteyeBlog { +public class IteyeBlog implements Blog{ @ExtractBy("//title") private String title; @@ -31,4 +31,11 @@ public static void main(String[] args) { Spider.create(Site.me().addStartUrl("http://dengminhui.iteye.com/blog"),IteyeBlog.class).run(); } + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java new file mode 100644 index 000000000..817c1aa14 --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java @@ -0,0 +1,41 @@ +package us.codecraft.webmagic.annotation.samples; + +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.annotation.ExtractBy; +import us.codecraft.webmagic.annotation.TargetUrl; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-2
      + * Time: 上午7:52
      + */ +@TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") +public class OschinaBlog implements Blog{ + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) + private String content; + + @Override + public String toString() { + return "OschinaBlog{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } + + public static void main(String[] args) { + Spider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"),OschinaBlog.class).run(); + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } +} From 297ee77600593980ce575162d24f50391a45ac4f Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 08:20:55 +0800 Subject: [PATCH 092/175] add failfast --- .../main/java/us/codecraft/webmagic/annotation/ExtractBy.java | 2 ++ .../us/codecraft/webmagic/annotation/PageModelExtractor.java | 3 +++ .../us/codecraft/webmagic/annotation/samples/IteyeBlog.java | 4 ++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java index 4c791fd65..2d084171f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java @@ -13,6 +13,8 @@ @Target({ElementType.FIELD}) public @interface ExtractBy { + + //TODO: add list support String value(); public enum Type {XPath, Regex, Css}; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index 41f635c3c..e610e1074 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -42,6 +42,9 @@ private void init(Class clazz) { fieldExtractors = new ArrayList(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); + if (!field.getType().isAssignableFrom(String.class)){ + throw new IllegalStateException("Field "+field.getName()+" must be string"); + } ExtractBy extractBy = field.getAnnotation(ExtractBy.class); if (extractBy != null) { String value = extractBy.value(); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java index 09a1d5b24..48e4129db 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java @@ -14,7 +14,7 @@ public class IteyeBlog implements Blog{ @ExtractBy("//title") - private String title; + private int title; @ExtractBy(value = "div#blog_content",type = ExtractBy.Type.Css) private String content; @@ -32,7 +32,7 @@ public static void main(String[] args) { } public String getTitle() { - return title; + return null; } public String getContent() { From 1d79d46389892796f4e55d6ff92ea26680f9fcb4 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 08:22:28 +0800 Subject: [PATCH 093/175] fix --- .../us/codecraft/webmagic/annotation/samples/IteyeBlog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java index 48e4129db..a92705450 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java @@ -14,7 +14,7 @@ public class IteyeBlog implements Blog{ @ExtractBy("//title") - private int title; + private String title; @ExtractBy(value = "div#blog_content",type = ExtractBy.Type.Css) private String content; From d7af061be451c4ba5eb6b2d761f87215273a7f18 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 08:22:59 +0800 Subject: [PATCH 094/175] fix --- .../us/codecraft/webmagic/annotation/samples/IteyeBlog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java index a92705450..09a1d5b24 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java @@ -32,7 +32,7 @@ public static void main(String[] args) { } public String getTitle() { - return null; + return title; } public String getContent() { From 6b96a7dde44bc2b9c7f87a48d89456ca3b3e55a2 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 13:51:42 +0800 Subject: [PATCH 095/175] update --- .../webmagic/annotation/ObjectPipeline.java | 21 +++++++++++++++++++ .../webmagic/annotation/OschinaBlog.java | 7 ------- .../webmagic/annotation/TestFetcher.java | 8 ++++++- 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java new file mode 100644 index 000000000..dd2739542 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java @@ -0,0 +1,21 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.ResultItems; +import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.pipeline.Pipeline; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-2
      + * Time: 上午10:47
      + */ +public class ObjectPipeline implements Pipeline { + @Override + public void process(ResultItems resultItems, Task task) { + + } + + public T read() { + return null; + } +} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java index 0435843a0..9b83c01e8 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java @@ -14,11 +14,4 @@ public class OschinaBlog { @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) private String content; - @Override - public String toString() { - return "OschinaBlog{" + - "title='" + title + '\'' + - ", content='" + content + '\'' + - '}'; - } } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java index 37a3305d3..5d70a541a 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java @@ -15,7 +15,13 @@ public class TestFetcher { @Ignore("takes long") @Test public void test() { - Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class)).run(); + ObjectPipeline objectPipeline = new ObjectPipeline(); + Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class)) + .pipeline(objectPipeline).runAsync(); + OschinaBlog oschinaBlog = null; + while ((oschinaBlog = objectPipeline.read()) != null) { + System.out.println(oschinaBlog); + } } From 45d89a217726bad0ec5cd52ecdf2a8a1d351a36f Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 23:39:34 +0800 Subject: [PATCH 096/175] test saxon and invite XPath2.0 support --- pom.xml | 7 ++- webmagic-core/pom.xml | 5 ++ .../webmagic/selector/SaxonTest.java | 45 +++++++++++++ .../webmagic/selector/XpathSelectorTest.java | 63 +++++++++++++++++++ 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java diff --git a/pom.xml b/pom.xml index 5974eae80..fa369f4a8 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,11 @@ httpclient 4.2.4
      + + net.sf.saxon + Saxon-HE + 9.5.1-1 + log4j log4j @@ -45,7 +50,7 @@ net.sourceforge.htmlcleaner htmlcleaner - 2.4 + 2.5 org.apache.commons diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index 60c37c025..a5fbd7558 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -27,6 +27,11 @@ commons-lang3 + + net.sf.saxon + Saxon-HE + + log4j log4j diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java new file mode 100644 index 000000000..509be4409 --- /dev/null +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java @@ -0,0 +1,45 @@ +package us.codecraft.webmagic.selector; + +import net.sf.saxon.xpath.XPathFactoryImpl; +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathFactoryConfigurationException; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-2
      + * Time: 下午5:48
      + */ +public class SaxonTest { + + @Test + public void test() throws XPathFactoryConfigurationException { +// System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); +// XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); + String xml = "
      #BBB##CCC##DDD#"; + try { + HtmlCleaner htmlCleaner = new HtmlCleaner(); + TagNode tagNode = htmlCleaner.clean(""); + Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); + + javax.xml.xpath.XPathFactory factory = XPathFactoryImpl.newInstance(); + XPath xpath = factory.newXPath(); + XPathExpression expr = xpath.compile("//a[matches(.,'#...#')]"); + + Object result = expr.evaluate(document, XPathConstants.NODESET); + NodeList nodes = (NodeList) result; + System.out.println(nodes); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 6f1c21ed1..c2cc7ecaa 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1,7 +1,24 @@ package us.codecraft.webmagic.selector; +import net.sf.saxon.Configuration; +import net.sf.saxon.lib.NamespaceConstant; +import net.sf.saxon.om.NamespaceResolver; +import net.sf.saxon.pull.NamespaceContextImpl; +import net.sf.saxon.xpath.JAXPXPathStaticContext; +import net.sf.saxon.xpath.XPathEvaluator; +import net.sf.saxon.xpath.XPathFactoryImpl; +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; import org.junit.Assert; import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.*; +import java.util.Collections; +import java.util.Iterator; /** * @author code4crafter@gmail.com
      Date: 13-4-21 Time: 上午10:06 @@ -1354,4 +1371,50 @@ public void testOschina() { Assert.assertNotNull(html1.$("a[href]").xpath("//@href").all()); } + @Test + public void testXPath2() { + String text = "

      眉山:扎实推进农业农村工作 促农持续增收
      \n" + + "2013-07-31 23:29:45   来源:眉山网      责任编辑:张斯炜

      "; + XpathSelector xpathSelector = new XpathSelector("//h1/text()"); + System.out.println(xpathSelector.select(text)); + } + + //http://sourceforge.net/mailarchive/forum.php?thread_name=4EA92A8A.6080202%40saxonica.com&forum_name=saxon-help + @Test + public void testSaxon() throws XPathFactoryConfigurationException { + System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); + System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.FN, "net.sf.saxon.xpath.XPathFactoryImpl"); + XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); + String text = "

      眉山:扎实推进农业农村工作 促农持续增收
      \n" + + "2013-07-31 23:29:45   来源:眉山网      责任编辑:张斯炜

      "; + try { + HtmlCleaner htmlCleaner = new HtmlCleaner(); + TagNode tagNode = htmlCleaner.clean(text); + Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); + javax.xml.xpath.XPathFactory factory = XPathFactoryImpl.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); + Configuration config = Configuration.newConfiguration(); + XPathEvaluator xPathEvaluator = new XPathEvaluator(config); + JAXPXPathStaticContext context = new JAXPXPathStaticContext(config); + context.setNamespaceContext(new NamespaceContextImpl(new NamespaceResolver() { + + + @Override + public String getURIForPrefix(String s, boolean b) { + return NamespaceConstant.FN; + } + + @Override + public Iterator iteratePrefixes() { + return Collections.singletonList("fn").iterator(); + } + })); + xPathEvaluator.setStaticContext(context); + XPathExpression expr = xPathEvaluator.compile("fn:substring-before(//h1,'\n')"); + Object result = expr.evaluate(document, XPathConstants.STRING); + System.out.println(result); + } catch (Exception e) { + e.printStackTrace(); + } + } + } From 63bff938510f2130fdaea3fbacbbd45ce658aa04 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 2 Aug 2013 23:45:13 +0800 Subject: [PATCH 097/175] simplify api --- .../codecraft/webmagic/selector/XpathSelectorTest.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index c2cc7ecaa..6544e9ea9 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1384,18 +1384,14 @@ public void testXPath2() { public void testSaxon() throws XPathFactoryConfigurationException { System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.FN, "net.sf.saxon.xpath.XPathFactoryImpl"); - XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); String text = "

      眉山:扎实推进农业农村工作 促农持续增收
      \n" + "2013-07-31 23:29:45   来源:眉山网      责任编辑:张斯炜

      "; try { HtmlCleaner htmlCleaner = new HtmlCleaner(); TagNode tagNode = htmlCleaner.clean(text); Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); - javax.xml.xpath.XPathFactory factory = XPathFactoryImpl.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); - Configuration config = Configuration.newConfiguration(); - XPathEvaluator xPathEvaluator = new XPathEvaluator(config); - JAXPXPathStaticContext context = new JAXPXPathStaticContext(config); - context.setNamespaceContext(new NamespaceContextImpl(new NamespaceResolver() { + XPathEvaluator xPathEvaluator = new XPathEvaluator(); + xPathEvaluator.setNamespaceContext(new NamespaceContextImpl(new NamespaceResolver() { @Override @@ -1408,7 +1404,6 @@ public Iterator iteratePrefixes() { return Collections.singletonList("fn").iterator(); } })); - xPathEvaluator.setStaticContext(context); XPathExpression expr = xPathEvaluator.compile("fn:substring-before(//h1,'\n')"); Object result = expr.evaluate(document, XPathConstants.STRING); System.out.println(result); From 48252b0359f276ac99fc92a6b659a6377c677bf9 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 07:28:46 +0800 Subject: [PATCH 098/175] xpath2.0 --- .../webmagic/selector/Xpath2Selector.java | 167 ++++++++++++++++++ .../webmagic/selector/XpathSelectorTest.java | 41 ++++- 2 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java new file mode 100644 index 000000000..99112cae4 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java @@ -0,0 +1,167 @@ +package us.codecraft.webmagic.selector; + +import net.sf.saxon.lib.NamespaceConstant; +import net.sf.saxon.xpath.XPathEvaluator; +import org.apache.log4j.Logger; +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.htmlcleaner.TagNode; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +import javax.xml.namespace.NamespaceContext; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 支持xpath2.0的选择器。包装了HtmlCleaner和Saxon HE。
      + * + * @author code4crafter@gmail.com
      + * Date: 13-4-21 + * Time: 上午9:39 + */ +public class Xpath2Selector implements Selector { + + private String xpathStr; + + private XPathExpression xPathExpression; + + private Logger logger = Logger.getLogger(getClass()); + + public Xpath2Selector(String xpathStr) { + this.xpathStr = xpathStr; + try { + init(); + } catch (XPathExpressionException e) { + throw new IllegalArgumentException("XPath error!", e); + } + } + + enum XPath2NamespaceContext implements NamespaceContext { + + INSTANCE; + + private final Map prefix2NamespaceMap = new ConcurrentHashMap(); + + private final Map> namespace2PrefixMap = new ConcurrentHashMap>(); + + private void put(String prefix, String namespaceURI) { + prefix2NamespaceMap.put(prefix, namespaceURI); + List prefixes = namespace2PrefixMap.get(namespaceURI); + if (prefixes == null) { + prefixes = new ArrayList(); + namespace2PrefixMap.put(namespaceURI, prefixes); + } + prefixes.add(prefix); + } + + private XPath2NamespaceContext() { + put("fn", NamespaceConstant.FN); + put("xslt",NamespaceConstant.XSLT); + } + + @Override + public String getNamespaceURI(String prefix) { + return prefix2NamespaceMap.get(prefix); + } + + @Override + public String getPrefix(String namespaceURI) { + List prefixes = namespace2PrefixMap.get(namespaceURI); + if (prefixes == null || prefixes.size() < 1) { + return null; + } + return prefixes.get(0); + } + + @Override + public Iterator getPrefixes(String namespaceURI) { + List prefixes = namespace2PrefixMap.get(namespaceURI); + if (prefixes == null || prefixes.size() < 1) { + return null; + } + return prefixes.iterator(); + } + } + + private void init() throws XPathExpressionException { + XPathEvaluator xPathEvaluator = new XPathEvaluator(); + xPathEvaluator.setNamespaceContext(XPath2NamespaceContext.INSTANCE); + xPathExpression = xPathEvaluator.compile(xpathStr); + } + + @Override + public String select(String text) { + try { + HtmlCleaner htmlCleaner = new HtmlCleaner(); + TagNode tagNode = htmlCleaner.clean(text); + Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); + Object result; + try { + result = xPathExpression.evaluate(document, XPathConstants.NODESET); + } catch (XPathExpressionException e) { + result = xPathExpression.evaluate(document, XPathConstants.STRING); + } + if (result instanceof NodeList) { + StreamResult xmlOutput = new StreamResult(new StringWriter()); + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + NodeList nodeList = (NodeList) result; + if (nodeList.getLength() == 0) { + return null; + } + transformer.transform(new DOMSource(nodeList.item(0)), xmlOutput); + return xmlOutput.getWriter().toString(); + } + return result.toString(); + } catch (Exception e) { + logger.error("select text error! " + xpathStr, e); + } + return null; + } + + @Override + public List selectList(String text) { + List results = new ArrayList(); + try { + HtmlCleaner htmlCleaner = new HtmlCleaner(); + TagNode tagNode = htmlCleaner.clean(text); + Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); + Object result; + try { + result = xPathExpression.evaluate(document, XPathConstants.NODESET); + } catch (XPathExpressionException e) { + result = xPathExpression.evaluate(document, XPathConstants.STRING); + } + if (result instanceof NodeList) { + NodeList nodeList = (NodeList) result; + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + StreamResult xmlOutput = new StreamResult(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + for (int i = 0; i < nodeList.getLength(); i++) { + xmlOutput.setWriter(new StringWriter()); + transformer.transform(new DOMSource(nodeList.item(i)), xmlOutput); + results.add(xmlOutput.getWriter().toString()); + } + } else { + results.add(result.toString()); + } + } catch (Exception e) { + logger.error("select text error! " + xpathStr, e); + } + return results; + } +} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 6544e9ea9..2b8e15de9 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -12,6 +12,7 @@ import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.NodeList; @@ -1381,9 +1382,7 @@ public void testXPath2() { //http://sourceforge.net/mailarchive/forum.php?thread_name=4EA92A8A.6080202%40saxonica.com&forum_name=saxon-help @Test - public void testSaxon() throws XPathFactoryConfigurationException { - System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); - System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.FN, "net.sf.saxon.xpath.XPathFactoryImpl"); + public void testSaxon() { String text = "

      眉山:扎实推进农业农村工作 促农持续增收
      \n" + "2013-07-31 23:29:45   来源:眉山网      责任编辑:张斯炜

      "; try { @@ -1406,10 +1405,44 @@ public Iterator iteratePrefixes() { })); XPathExpression expr = xPathEvaluator.compile("fn:substring-before(//h1,'\n')"); Object result = expr.evaluate(document, XPathConstants.STRING); - System.out.println(result); + Assert.assertNotNull(result); } catch (Exception e) { e.printStackTrace(); } + Xpath2Selector xpath2Selector = new Xpath2Selector("fn:substring-before(//h1,'\n')"); + String select = xpath2Selector.select(text); + Assert.assertNotNull(select); + Assert.assertNotNull(xpath2Selector.selectList(text)); + + } + + @Test + public void testXpath2Selector() { + Xpath2Selector xpath2Selector = new Xpath2Selector("//a"); + String select = xpath2Selector.select(html); + Assert.assertNotNull(select); + } + + @Ignore("take long time") + @Test + public void performanceTest() { + Xpath2Selector xpath2Selector = new Xpath2Selector("//a"); + long time =System.currentTimeMillis(); + for (int i = 0; i < 1000; i++) { + xpath2Selector.selectList(html); + } + System.out.println(System.currentTimeMillis()-time); + XpathSelector xpathSelector = new XpathSelector("//a"); + time =System.currentTimeMillis(); + for (int i = 0; i < 1000; i++) { + xpathSelector.selectList(html); + } + System.out.println(System.currentTimeMillis()-time); + time =System.currentTimeMillis(); + for (int i = 0; i < 1000; i++) { + xpath2Selector.selectList(html); + } + System.out.println(System.currentTimeMillis()-time); } } From 91c6b620d0e38cb1f39a9b29e8279a2e06bd3284 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 14:01:18 +0800 Subject: [PATCH 099/175] update email --- .../us/codecraft/webmagic/ResultItems.java | 2 +- .../java/us/codecraft/webmagic/Spider.java | 4 --- .../webmagic/annotation/AfterExtractor.java | 15 ++++++++++ .../webmagic/annotation/ExtractBy.java | 2 +- .../webmagic/annotation/ExtractByUrl.java | 2 +- .../webmagic/annotation/FieldExtractor.java | 2 +- .../webmagic/annotation/HelpUrl.java | 2 +- .../webmagic/annotation/OOSpider.java | 29 +++++++++++++++++++ .../annotation/ObjectPageProcessor.java | 2 +- .../webmagic/annotation/ObjectPipeline.java | 28 ++++++++++++++---- .../annotation/PageModelExtractor.java | 14 ++++++++- .../annotation/PageModelPipeline.java | 14 +++++++++ .../webmagic/annotation/TargetUrl.java | 3 +- .../webmagic/downloader/Destroyable.java | 2 +- .../webmagic/annotation/TestFetcher.java | 8 ++--- .../annotation/samples/IteyeBlog.java | 4 +-- .../annotation/samples/OschinaBlog.java | 4 +-- 17 files changed, 109 insertions(+), 28 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java b/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java index 0c1d94c5b..c91a2701a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java @@ -5,7 +5,7 @@ /** * 保存抽取结果的类,由PageProcessor处理得到,传递给{@link us.codecraft.webmagic.pipeline.Pipeline}进行持久化。
      - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-25
      * Time: 下午12:20
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 2717b665c..facfd9526 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -90,10 +90,6 @@ public static Spider create(PageProcessor pageProcessor) { return new Spider(pageProcessor); } - public static Spider create(Site site,Class... pageModels) { - return new Spider(ObjectPageProcessor.create(site,pageModels)); - } - /** * 重新设置startUrls,会覆盖Site本身的startUrls。 * diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java new file mode 100644 index 000000000..89d03e98a --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java @@ -0,0 +1,15 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.Page; + +/** + * 实现这个接口即可在抽取后进行后处理。
      + * + * @author code4crafter@gmail.com
      + * @date: 13-8-3
      + * Time: 上午9:42
      + */ +public interface AfterExtractor { + + public void afterProcess(Page page, T t); +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java index 2d084171f..115a2193b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java @@ -5,7 +5,7 @@ import java.lang.annotation.Target; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java index 57747f5ef..c40c9ca29 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java @@ -5,7 +5,7 @@ import java.lang.annotation.Target; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java index f415cb857..4cd09ef6f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java @@ -6,7 +6,7 @@ import java.lang.reflect.Method; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午9:48
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java index 302081776..e5727f084 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java @@ -5,7 +5,7 @@ import java.lang.annotation.Target; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java new file mode 100644 index 000000000..c6ae2f31f --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java @@ -0,0 +1,29 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.processor.PageProcessor; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-8-3
      + * Time: 上午9:51
      + */ +public class OOSpider extends Spider{ + + /** + * 使用已定义的抽取规则新建一个Spider。 + * + * @param pageProcessor 已定义的抽取规则 + */ + public OOSpider(PageProcessor pageProcessor) { + super(pageProcessor); + } + + public static OOSpider create(Site site,Class... pageModels) { + OOSpider ooSpider = new OOSpider(ObjectPageProcessor.create(site, pageModels)); + ooSpider.pipeline(new ObjectPipeline()); + return ooSpider; + } + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java index ad8297ed3..063dc818e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:46
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java index dd2739542..0b3ec4de5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java @@ -4,18 +4,36 @@ import us.codecraft.webmagic.Task; import us.codecraft.webmagic.pipeline.Pipeline; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 上午10:47
      */ public class ObjectPipeline implements Pipeline { - @Override - public void process(ResultItems resultItems, Task task) { + private Map pageModelPipelines = new ConcurrentHashMap(); + + public ObjectPipeline() { } - public T read() { - return null; + public ObjectPipeline put(Class clazz, PageModelPipeline pageModelPipeline) { + pageModelPipelines.put(clazz, pageModelPipeline); + return this; + } + + @Override + public void process(ResultItems resultItems, Task task) { + if (resultItems.isSkip()) { + return; + } + for (Map.Entry classPageModelPipelineEntry : pageModelPipelines.entrySet()) { + Object o = resultItems.get(classPageModelPipelineEntry.getKey().getCanonicalName()); + if (o != null) { + classPageModelPipelineEntry.getValue().process(o, task); + } + } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index e610e1074..8ed3b6b87 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -16,7 +16,7 @@ import java.util.regex.Pattern; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午9:33
      */ @@ -30,6 +30,8 @@ class PageModelExtractor { private List fieldExtractors; + private AfterExtractor afterExtractor; + public static PageModelExtractor create(Class clazz) { PageModelExtractor pageModelExtractor = new PageModelExtractor(); pageModelExtractor.init(clazz); @@ -40,6 +42,13 @@ private void init(Class clazz) { this.clazz = clazz; initTargetUrlPatterns(); fieldExtractors = new ArrayList(); + if (clazz.isAssignableFrom(AfterExtractor.class)){ + try { + afterExtractor=(AfterExtractor)clazz.newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + } for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); if (!field.getType().isAssignableFrom(String.class)){ @@ -147,6 +156,9 @@ public Object process(Page page) { } setField(o, fieldExtractor, value); } + if (afterExtractor!=null){ + afterExtractor.afterProcess(page,o); + } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java new file mode 100644 index 000000000..afef926e7 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java @@ -0,0 +1,14 @@ +package us.codecraft.webmagic.annotation; + +import us.codecraft.webmagic.Task; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-8-3
      + * Time: 上午9:34
      + */ +public interface PageModelPipeline { + + public void process(T t, Task task); + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java index f4f58ed48..530306425 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java @@ -5,7 +5,7 @@ import java.lang.annotation.Target; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      */ @@ -14,4 +14,5 @@ public @interface TargetUrl { String[] value(); + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java index 4f07528d6..2b040fa03 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java @@ -2,7 +2,7 @@ /** * 比较占用资源的服务可以实现该接口,Spider会在结束时调用destroy()释放资源。
      - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午3:10
      */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java index 5d70a541a..b29d0533a 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java @@ -3,7 +3,6 @@ import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Spider; /** * @author yihua.huang@dianping.com
      @@ -16,12 +15,9 @@ public class TestFetcher { @Test public void test() { ObjectPipeline objectPipeline = new ObjectPipeline(); - Spider.create(ObjectPageProcessor.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class)) - .pipeline(objectPipeline).runAsync(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) + .pipeline(objectPipeline); OschinaBlog oschinaBlog = null; - while ((oschinaBlog = objectPipeline.read()) != null) { - System.out.println(oschinaBlog); - } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java index 09a1d5b24..002a42cec 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java @@ -1,8 +1,8 @@ package us.codecraft.webmagic.annotation.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.annotation.ExtractBy; +import us.codecraft.webmagic.annotation.OOSpider; import us.codecraft.webmagic.annotation.TargetUrl; /** @@ -28,7 +28,7 @@ public String toString() { } public static void main(String[] args) { - Spider.create(Site.me().addStartUrl("http://dengminhui.iteye.com/blog"),IteyeBlog.class).run(); + OOSpider.create(Site.me().addStartUrl("http://dengminhui.iteye.com/blog"), IteyeBlog.class).run(); } public String getTitle() { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java index 817c1aa14..a5c44b0cc 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java @@ -1,8 +1,8 @@ package us.codecraft.webmagic.annotation.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.annotation.ExtractBy; +import us.codecraft.webmagic.annotation.OOSpider; import us.codecraft.webmagic.annotation.TargetUrl; /** @@ -28,7 +28,7 @@ public String toString() { } public static void main(String[] args) { - Spider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"),OschinaBlog.class).run(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).run(); } public String getTitle() { From b61d85b6a0eba0707bd500c5930245924e3259d8 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 15:55:54 +0800 Subject: [PATCH 100/175] complete objectpipeline --- .../annotation/ConsolePageModelPipeline.java | 16 +++++++ .../webmagic/annotation/OOSpider.java | 47 +++++++++++++++---- .../annotation/ObjectPageProcessor.java | 27 ++++++----- .../annotation/PageModelExtractor.java | 6 +-- .../webmagic/annotation/TestFetcher.java | 7 +-- 5 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java new file mode 100644 index 000000000..9991b7f73 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java @@ -0,0 +1,16 @@ +package us.codecraft.webmagic.annotation; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import us.codecraft.webmagic.Task; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-3
      + * Time: 下午3:41
      + */ +public class ConsolePageModelPipeline implements PageModelPipeline { + @Override + public void process(Object o, Task task) { + System.out.println(ToStringBuilder.reflectionToString(o)); + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java index c6ae2f31f..e50074554 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java @@ -2,28 +2,57 @@ import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.processor.PageProcessor; +import us.codecraft.webmagic.pipeline.Pipeline; /** * @author code4crafter@gmail.com
      * @date: 13-8-3
      * Time: 上午9:51
      */ -public class OOSpider extends Spider{ +public class OOSpider extends Spider { /** - * 使用已定义的抽取规则新建一个Spider。 + * OOSpider只能由ObjectPageProcessor创建。 * * @param pageProcessor 已定义的抽取规则 */ - public OOSpider(PageProcessor pageProcessor) { - super(pageProcessor); + + private ObjectPageProcessor objectPageProcessor; + + private ObjectPipeline objectPipeline; + + protected OOSpider(ObjectPageProcessor objectPageProcessor) { + super(objectPageProcessor); + this.objectPageProcessor = objectPageProcessor; + } + + public OOSpider(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) { + this(ObjectPageProcessor.create(site, pageModels)); + this.objectPipeline = new ObjectPipeline(); + super.pipeline(objectPipeline); + for (Class pageModel : pageModels) { + this.objectPipeline.put(pageModel, pageModelPipeline); + } + } + + public static OOSpider create(Site site, Class... pageModels) { + return new OOSpider(site, new ConsolePageModelPipeline(), pageModels); + } + + public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) { + return new OOSpider(site, pageModelPipeline, pageModels); + } + + public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageModels) { + for (Class pageModel : pageModels) { + objectPageProcessor.addPageModel(pageModel); + objectPipeline.put(pageModel, pageModelPipeline); + } + return this; } - public static OOSpider create(Site site,Class... pageModels) { - OOSpider ooSpider = new OOSpider(ObjectPageProcessor.create(site, pageModels)); - ooSpider.pipeline(new ObjectPipeline()); - return ooSpider; + public Spider pipeline(Pipeline pipeline) { + throw new UnsupportedOperationException("Sorry, OOSpider can only use ObjectPipeline"); } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java index 063dc818e..f37586886 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java @@ -18,30 +18,31 @@ */ public class ObjectPageProcessor implements PageProcessor { - private List pageModelExtractorList; + private List pageModelExtractorList = new ArrayList(); private Site site; - private Set targetUrlPatterns; + private Set targetUrlPatterns = new HashSet(); public static ObjectPageProcessor create(Site site, Class... clazzs) { - List pageModelExtractorList = new ArrayList(); + ObjectPageProcessor objectPageProcessor = new ObjectPageProcessor(site); for (Class clazz : clazzs) { - PageModelExtractor pageModelExtractor = PageModelExtractor.create(clazz); - pageModelExtractorList.add(pageModelExtractor); + objectPageProcessor.addPageModel(clazz); } - ObjectPageProcessor objectPageProcessor = new ObjectPageProcessor(site, pageModelExtractorList); return objectPageProcessor; } - private ObjectPageProcessor(Site site, List pageModelExtractorList) { + + public ObjectPageProcessor addPageModel(Class clazz){ + PageModelExtractor pageModelExtractor = PageModelExtractor.create(clazz); + targetUrlPatterns.addAll(pageModelExtractor.getTargetUrlPatterns()); + targetUrlPatterns.addAll(pageModelExtractor.getHelpUrlPatterns()); + pageModelExtractorList.add(pageModelExtractor); + return this; + } + + private ObjectPageProcessor(Site site) { this.site = site; - this.pageModelExtractorList = pageModelExtractorList; - targetUrlPatterns = new HashSet(); - for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { - targetUrlPatterns.addAll(pageModelExtractor.getTargetUrlPatterns()); - targetUrlPatterns.addAll(pageModelExtractor.getHelpUrlPatterns()); - } } @Override diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java index 8ed3b6b87..f91252fa9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java @@ -22,9 +22,9 @@ */ class PageModelExtractor { - private List targetUrlPatterns; + private List targetUrlPatterns = new ArrayList(); - private List helpUrlPatterns; + private List helpUrlPatterns = new ArrayList(); private Class clazz; @@ -106,7 +106,6 @@ public static Method getSetterMethod(Class clazz, Field field) { } private void initTargetUrlPatterns() { - targetUrlPatterns = new ArrayList(); Annotation annotation = clazz.getAnnotation(TargetUrl.class); if (annotation == null) { targetUrlPatterns.add(Pattern.compile(".*")); @@ -116,7 +115,6 @@ private void initTargetUrlPatterns() { targetUrlPatterns.add(Pattern.compile(s.replace(".", "\\.").replace("*", "[^\"'#]*"))); } } - helpUrlPatterns = new ArrayList(); annotation = clazz.getAnnotation(HelpUrl.class); if (annotation != null) { String[] value = ((HelpUrl) annotation).value(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java index b29d0533a..002643140 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java @@ -1,6 +1,5 @@ package us.codecraft.webmagic.annotation; -import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Site; @@ -11,13 +10,11 @@ */ public class TestFetcher { - @Ignore("takes long") +// @Ignore("takes long") @Test public void test() { - ObjectPipeline objectPipeline = new ObjectPipeline(); OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) - .pipeline(objectPipeline); - OschinaBlog oschinaBlog = null; + .run(); } From 7b4c8a7f20ea6e6ad05add6ac55548a2eb5e11f8 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 16:29:50 +0800 Subject: [PATCH 101/175] rename package --- .../src/main/java/us/codecraft/webmagic/Spider.java | 1 - .../webmagic/{annotation => oo}/AfterExtractor.java | 2 +- .../{annotation => oo}/ConsolePageModelPipeline.java | 2 +- .../codecraft/webmagic/{annotation => oo}/ExtractBy.java | 2 +- .../webmagic/{annotation => oo}/ExtractByUrl.java | 2 +- .../webmagic/{annotation => oo}/FieldExtractor.java | 2 +- .../us/codecraft/webmagic/{annotation => oo}/HelpUrl.java | 2 +- .../codecraft/webmagic/{annotation => oo}/OOSpider.java | 3 +-- .../webmagic/{annotation => oo}/ObjectPageProcessor.java | 2 +- .../webmagic/{annotation => oo}/ObjectPipeline.java | 2 +- .../webmagic/{annotation => oo}/PageModelExtractor.java | 2 +- .../webmagic/{annotation => oo}/PageModelPipeline.java | 2 +- .../codecraft/webmagic/{annotation => oo}/TargetUrl.java | 2 +- .../webmagic/{annotation => oo}/OschinaBlog.java | 2 +- .../webmagic/{annotation => oo}/TestFetcher.java | 2 +- .../webmagic/{annotation => oo}/samples/Blog.java | 2 +- .../webmagic/{annotation => oo}/samples/IteyeBlog.java | 8 ++++---- .../webmagic/{annotation => oo}/samples/OschinaBlog.java | 8 ++++---- 18 files changed, 23 insertions(+), 25 deletions(-) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/AfterExtractor.java (87%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/ConsolePageModelPipeline.java (90%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/ExtractBy.java (92%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/ExtractByUrl.java (90%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/FieldExtractor.java (96%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/HelpUrl.java (89%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/OOSpider.java (97%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/ObjectPageProcessor.java (98%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/ObjectPipeline.java (96%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/PageModelExtractor.java (99%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/PageModelPipeline.java (83%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{annotation => oo}/TargetUrl.java (89%) rename webmagic-core/src/test/java/us/codecraft/webmagic/{annotation => oo}/OschinaBlog.java (88%) rename webmagic-core/src/test/java/us/codecraft/webmagic/{annotation => oo}/TestFetcher.java (90%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{annotation => oo}/samples/Blog.java (78%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{annotation => oo}/samples/IteyeBlog.java (80%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{annotation => oo}/samples/OschinaBlog.java (81%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index facfd9526..a25fd024c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -2,7 +2,6 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; -import us.codecraft.webmagic.annotation.ObjectPageProcessor; import us.codecraft.webmagic.downloader.Destroyable; import us.codecraft.webmagic.downloader.Downloader; import us.codecraft.webmagic.downloader.HttpClientDownloader; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java similarity index 87% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java index 89d03e98a..cb9788baa 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/AfterExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import us.codecraft.webmagic.Page; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java similarity index 90% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java index 9991b7f73..16b1ef2ab 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ConsolePageModelPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import org.apache.commons.lang3.builder.ToStringBuilder; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java similarity index 92% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java index 115a2193b..00ff7fb75 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java similarity index 90% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java index c40c9ca29..715112cad 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ExtractByUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java similarity index 96% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java index 4cd09ef6f..26c1ec6ec 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import us.codecraft.webmagic.selector.Selector; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java similarity index 89% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java index e5727f084..1746048fa 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/HelpUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java similarity index 97% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java index e50074554..d41ee9f83 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; @@ -16,7 +16,6 @@ public class OOSpider extends Spider { * * @param pageProcessor 已定义的抽取规则 */ - private ObjectPageProcessor objectPageProcessor; private ObjectPipeline objectPipeline; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java similarity index 98% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java index f37586886..dda96b563 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Request; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java similarity index 96% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java index 0b3ec4de5..a5f02edc9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/ObjectPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java similarity index 99% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java index f91252fa9..dc1ef82f5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import org.apache.commons.lang3.StringUtils; import us.codecraft.webmagic.Page; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelPipeline.java similarity index 83% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelPipeline.java index afef926e7..7406cde2d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/PageModelPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelPipeline.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java similarity index 89% rename from webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java index 530306425..7bbb9620b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/annotation/TargetUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java similarity index 88% rename from webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java rename to webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index 9b83c01e8..937eba177 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; /** * @author yihua.huang@dianping.com
      diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java similarity index 90% rename from webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java rename to webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java index 002643140..e8e3799a0 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/annotation/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation; +package us.codecraft.webmagic.oo; import org.junit.Test; import us.codecraft.webmagic.Site; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java similarity index 78% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java index c0890e1f2..565c7111a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/Blog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.annotation.samples; +package us.codecraft.webmagic.oo.samples; /** * @author yihua.huang@dianping.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java similarity index 80% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java index 002a42cec..e289c87cf 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java @@ -1,9 +1,9 @@ -package us.codecraft.webmagic.annotation.samples; +package us.codecraft.webmagic.oo.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.annotation.ExtractBy; -import us.codecraft.webmagic.annotation.OOSpider; -import us.codecraft.webmagic.annotation.TargetUrl; +import us.codecraft.webmagic.oo.ExtractBy; +import us.codecraft.webmagic.oo.OOSpider; +import us.codecraft.webmagic.oo.TargetUrl; /** * @author yihua.huang@dianping.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java similarity index 81% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java index a5c44b0cc..4a52a1412 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/annotation/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java @@ -1,9 +1,9 @@ -package us.codecraft.webmagic.annotation.samples; +package us.codecraft.webmagic.oo.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.annotation.ExtractBy; -import us.codecraft.webmagic.annotation.OOSpider; -import us.codecraft.webmagic.annotation.TargetUrl; +import us.codecraft.webmagic.oo.ExtractBy; +import us.codecraft.webmagic.oo.OOSpider; +import us.codecraft.webmagic.oo.TargetUrl; /** * @author yihua.huang@dianping.com
      From 7cc8bd81557e7a88c92807aae81235ff5cba0f50 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 16:35:12 +0800 Subject: [PATCH 102/175] skip test --- .../src/main/java/us/codecraft/webmagic/oo/package.html | 5 +++++ .../src/test/java/us/codecraft/webmagic/oo/TestFetcher.java | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/oo/package.html diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/package.html new file mode 100644 index 000000000..b5f80b15c --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/package.html @@ -0,0 +1,5 @@ + + +webmagic对抓取器编写的面向对象方式的封装。基于POJO(称为PageModel)及注解即可实现一个PageProcessor。 + + diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java index e8e3799a0..56f5a9ae3 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.oo; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Site; @@ -10,7 +11,7 @@ */ public class TestFetcher { -// @Ignore("takes long") + @Ignore("takes long") @Test public void test() { OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) From f2823de925af5b862242ab5c0072ad30b2671979 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 17:01:25 +0800 Subject: [PATCH 103/175] add list support --- .../us/codecraft/webmagic/oo/ExtractBy.java | 11 +-- .../codecraft/webmagic/oo/ExtractByUrl.java | 2 + .../us/codecraft/webmagic/oo/Extractor.java | 40 +++++++++ .../codecraft/webmagic/oo/FieldExtractor.java | 16 +--- .../us/codecraft/webmagic/oo/OOSpider.java | 5 -- .../webmagic/oo/PageModelExtractor.java | 83 ++++++++++++------- .../us/codecraft/webmagic/oo/OschinaBlog.java | 7 +- .../us/codecraft/webmagic/oo/TestFetcher.java | 3 +- 8 files changed, 112 insertions(+), 55 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java index 00ff7fb75..71bdc937e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java @@ -10,16 +10,17 @@ * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD}) +@Target({ElementType.FIELD,ElementType.TYPE}) public @interface ExtractBy { - - //TODO: add list support String value(); - public enum Type {XPath, Regex, Css}; + public enum Type {XPath2, XPath, Regex, Css} - Type type() default Type.XPath; + Type type() default Type.XPath2; boolean notNull() default true; + + boolean multi() default false; + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java index 715112cad..e86f08f14 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java @@ -17,4 +17,6 @@ boolean notNull() default true; + boolean multi() default false; + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java new file mode 100644 index 000000000..f0607cfd7 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java @@ -0,0 +1,40 @@ +package us.codecraft.webmagic.oo; + +import us.codecraft.webmagic.selector.Selector; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-8-1
      + * Time: 下午9:48
      + */ +class Extractor { + + protected final Selector selector; + + protected final Source source; + + protected final boolean notNull; + + protected final boolean multi; + + static enum Source {Html, Url} + + public Extractor(Selector selector, Source source, boolean notNull, boolean multi) { + this.selector = selector; + this.source = source; + this.notNull = notNull; + this.multi = multi; + } + + Selector getSelector() { + return selector; + } + + Source getSource() { + return source; + } + + boolean isNotNull() { + return notNull; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java index 26c1ec6ec..2a6bcf72b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java @@ -10,25 +10,15 @@ * @date: 13-8-1
      * Time: 下午9:48
      */ -class FieldExtractor { +class FieldExtractor extends Extractor{ private final Field field; - private final Selector selector; - - private final Source source; - private Method setterMethod; - private final boolean notNull; - - static enum Source {Html, Url} - - public FieldExtractor(Field field, Selector selector, Source source, boolean notNull) { + public FieldExtractor(Field field, Selector selector, Source source, boolean notNull,boolean multi) { + super(selector, source, notNull,multi); this.field = field; - this.selector = selector; - this.source = source; - this.notNull = notNull; } Field getField() { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java index d41ee9f83..5f523ed37 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java @@ -2,7 +2,6 @@ import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.pipeline.Pipeline; /** * @author code4crafter@gmail.com
      @@ -50,8 +49,4 @@ public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageM return this; } - public Spider pipeline(Pipeline pipeline) { - throw new UnsupportedOperationException("Sorry, OOSpider can only use ObjectPipeline"); - } - } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java index dc1ef82f5..e743e06ae 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java @@ -2,10 +2,7 @@ import org.apache.commons.lang3.StringUtils; import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.selector.CssSelector; -import us.codecraft.webmagic.selector.RegexSelector; -import us.codecraft.webmagic.selector.Selector; -import us.codecraft.webmagic.selector.XpathSelector; +import us.codecraft.webmagic.selector.*; import java.lang.annotation.Annotation; import java.lang.reflect.Field; @@ -42,20 +39,22 @@ private void init(Class clazz) { this.clazz = clazz; initTargetUrlPatterns(); fieldExtractors = new ArrayList(); - if (clazz.isAssignableFrom(AfterExtractor.class)){ + if (clazz.isAssignableFrom(AfterExtractor.class)) { try { - afterExtractor=(AfterExtractor)clazz.newInstance(); + afterExtractor = (AfterExtractor) clazz.newInstance(); } catch (Exception e) { throw new IllegalArgumentException(e); } } for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); - if (!field.getType().isAssignableFrom(String.class)){ - throw new IllegalStateException("Field "+field.getName()+" must be string"); - } ExtractBy extractBy = field.getAnnotation(ExtractBy.class); if (extractBy != null) { + if (!extractBy.multi() && !field.getType().isAssignableFrom(String.class)) { + throw new IllegalStateException("Field " + field.getName() + " must be string"); + } else if (extractBy.multi() && !field.getType().isAssignableFrom(List.class)) { + throw new IllegalStateException("Field " + field.getName() + " must be list"); + } String value = extractBy.value(); Selector selector; switch (extractBy.type()) { @@ -68,10 +67,13 @@ private void init(Class clazz) { case XPath: selector = new XpathSelector(value); break; + case XPath2: + selector = new Xpath2Selector(value); + break; default: - selector = new XpathSelector(value); + selector = new Xpath2Selector(value); } - FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull()); + FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull(), extractBy.multi()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); @@ -80,11 +82,16 @@ private void init(Class clazz) { } ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); if (extractByUrl != null) { + if (!extractByUrl.multi() && !field.getType().isAssignableFrom(String.class)) { + throw new IllegalStateException("Field " + field.getName() + " must be string"); + } else if (extractByUrl.multi() && !field.getType().isAssignableFrom(List.class)) { + throw new IllegalStateException("Field " + field.getName() + " must be list"); + } String regexPattern = extractByUrl.value(); if (regexPattern.trim().equals("")) { regexPattern = ".*"; } - FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull()); + FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull(), extractByUrl.multi()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); @@ -138,24 +145,42 @@ public Object process(Page page) { try { o = clazz.newInstance(); for (FieldExtractor fieldExtractor : fieldExtractors) { - String value; - switch (fieldExtractor.getSource()) { - case Html: - value = fieldExtractor.getSelector().select(page.getHtml().toString()); - break; - case Url: - value = fieldExtractor.getSelector().select(page.getUrl().toString()); - break; - default: - value = fieldExtractor.getSelector().select(page.getHtml().toString()); - } - if (value==null&&fieldExtractor.isNotNull()){ - page.getResultItems().setSkip(true); + if (fieldExtractor.multi) { + List value; + switch (fieldExtractor.getSource()) { + case Html: + value = fieldExtractor.getSelector().selectList(page.getHtml().toString()); + break; + case Url: + value = fieldExtractor.getSelector().selectList(page.getUrl().toString()); + break; + default: + value = fieldExtractor.getSelector().selectList(page.getHtml().toString()); + } + if ((value == null || value.size() == 0) && fieldExtractor.isNotNull()) { + page.getResultItems().setSkip(true); + } + setField(o, fieldExtractor, value); + } else { + String value; + switch (fieldExtractor.getSource()) { + case Html: + value = fieldExtractor.getSelector().select(page.getHtml().toString()); + break; + case Url: + value = fieldExtractor.getSelector().select(page.getUrl().toString()); + break; + default: + value = fieldExtractor.getSelector().select(page.getHtml().toString()); + } + if (value == null && fieldExtractor.isNotNull()) { + page.getResultItems().setSkip(true); + } + setField(o, fieldExtractor, value); } - setField(o, fieldExtractor, value); } - if (afterExtractor!=null){ - afterExtractor.afterProcess(page,o); + if (afterExtractor != null) { + afterExtractor.afterProcess(page, o); } } catch (InstantiationException e) { e.printStackTrace(); @@ -167,7 +192,7 @@ public Object process(Page page) { return o; } - private void setField(Object o, FieldExtractor fieldExtractor, String value) throws IllegalAccessException, InvocationTargetException { + private void setField(Object o, FieldExtractor fieldExtractor, Object value) throws IllegalAccessException, InvocationTargetException { if (fieldExtractor.getSetterMethod() != null) { fieldExtractor.getSetterMethod().invoke(o, value); } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index 937eba177..b8c7e4a8b 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -1,5 +1,7 @@ package us.codecraft.webmagic.oo; +import java.util.List; + /** * @author yihua.huang@dianping.com
      * @date: 13-8-1
      @@ -11,7 +13,10 @@ public class OschinaBlog { @ExtractBy("//title") private String title; - @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) + @ExtractBy(value = "div.BlogContent", type = ExtractBy.Type.Css) private String content; + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List tags; + } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java index 56f5a9ae3..e8e3799a0 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java @@ -1,6 +1,5 @@ package us.codecraft.webmagic.oo; -import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Site; @@ -11,7 +10,7 @@ */ public class TestFetcher { - @Ignore("takes long") +// @Ignore("takes long") @Test public void test() { OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) From 7e69087a7f4abfe3a49e8d96de7422605d5c34bb Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 17:17:59 +0800 Subject: [PATCH 104/175] fix Class.assinable bug --- .../us/codecraft/webmagic/oo/PageModelExtractor.java | 10 +++++----- .../java/us/codecraft/webmagic/oo/OschinaBlog.java | 7 ++++++- .../java/us/codecraft/webmagic/oo/TestFetcher.java | 9 ++++++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java index e743e06ae..83a4d310a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java @@ -39,7 +39,7 @@ private void init(Class clazz) { this.clazz = clazz; initTargetUrlPatterns(); fieldExtractors = new ArrayList(); - if (clazz.isAssignableFrom(AfterExtractor.class)) { + if (AfterExtractor.class.isAssignableFrom(clazz)) { try { afterExtractor = (AfterExtractor) clazz.newInstance(); } catch (Exception e) { @@ -50,9 +50,9 @@ private void init(Class clazz) { field.setAccessible(true); ExtractBy extractBy = field.getAnnotation(ExtractBy.class); if (extractBy != null) { - if (!extractBy.multi() && !field.getType().isAssignableFrom(String.class)) { + if (!extractBy.multi() && !String.class.isAssignableFrom(field.getType())) { throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractBy.multi() && !field.getType().isAssignableFrom(List.class)) { + } else if (extractBy.multi() && !List.class.isAssignableFrom(field.getType())) { throw new IllegalStateException("Field " + field.getName() + " must be list"); } String value = extractBy.value(); @@ -82,9 +82,9 @@ private void init(Class clazz) { } ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); if (extractByUrl != null) { - if (!extractByUrl.multi() && !field.getType().isAssignableFrom(String.class)) { + if (!extractByUrl.multi() && !String.class.isAssignableFrom(field.getType())) { throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractByUrl.multi() && !field.getType().isAssignableFrom(List.class)) { + } else if (extractByUrl.multi() && !List.class.isAssignableFrom(field.getType())) { throw new IllegalStateException("Field " + field.getName() + " must be list"); } String regexPattern = extractByUrl.value(); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index b8c7e4a8b..c82ef2315 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -1,5 +1,7 @@ package us.codecraft.webmagic.oo; +import us.codecraft.webmagic.Page; + import java.util.List; /** @@ -8,7 +10,7 @@ * Time: 下午10:18
      */ @TargetUrl("http://my.oschina.net/flashsword/blog/*") -public class OschinaBlog { +public class OschinaBlog implements AfterExtractor{ @ExtractBy("//title") private String title; @@ -19,4 +21,7 @@ public class OschinaBlog { @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) private List tags; + @Override + public void afterProcess(Page page, OschinaBlog oschinaBlog) { + } } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java index e8e3799a0..f4525f0e7 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java @@ -1,8 +1,12 @@ package us.codecraft.webmagic.oo; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Site; +import java.util.ArrayList; +import java.util.List; + /** * @author yihua.huang@dianping.com
      * @date: 13-8-1
      @@ -10,12 +14,15 @@ */ public class TestFetcher { -// @Ignore("takes long") + @Ignore("takes long") @Test public void test() { + System.out.println(List.class.isAssignableFrom(ArrayList.class)); OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) .run(); } + + } From c404f82b7f8491895c74a25f756863bca48ec673 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 17:38:36 +0800 Subject: [PATCH 105/175] add and or selector --- .../us/codecraft/webmagic/oo/HelpUrl.java | 2 + .../us/codecraft/webmagic/oo/TargetUrl.java | 2 + .../webmagic/selector/AndSelector.java | 53 +++++++++++++++++++ .../webmagic/selector/OrSelector.java | 41 ++++++++++++++ .../us/codecraft/webmagic/oo/OschinaBlog.java | 3 +- .../us/codecraft/webmagic/oo/TestFetcher.java | 4 -- 6 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java index 1746048fa..a8ed99503 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java @@ -14,4 +14,6 @@ public @interface HelpUrl { String[] value(); + + String sourceRegion() default ""; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java index 7bbb9620b..77b5a822e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java @@ -15,4 +15,6 @@ String[] value(); + String sourceRegion() default ""; + } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java new file mode 100644 index 000000000..98481efee --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java @@ -0,0 +1,53 @@ +package us.codecraft.webmagic.selector; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-3
      + * Time: 下午5:29
      + */ +public class AndSelector implements Selector { + + private List selectors = new ArrayList(); + + public AndSelector(Selector... selectors) { + for (Selector selector : selectors) { + this.selectors.add(selector); + } + } + + @Override + public String select(String text) { + for (Selector selector : selectors) { + if (text == null) { + return null; + } + text = selector.select(text); + } + return text; + } + + @Override + public List selectList(String text) { + List results = new ArrayList(); + boolean first = true; + for (Selector selector : selectors) { + if (first) { + results = selector.selectList(text); + first = false; + } else { + List resultsTemp = new ArrayList(); + for (String result : results) { + resultsTemp.addAll(selector.selectList(result)); + } + results = resultsTemp; + if (results == null || results.size() == 0) { + return results; + } + } + } + return results; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java new file mode 100644 index 000000000..2cdd870f7 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java @@ -0,0 +1,41 @@ +package us.codecraft.webmagic.selector; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-3
      + * Time: 下午5:29
      + */ +public class OrSelector implements Selector { + + private List selectors = new ArrayList(); + + public OrSelector(Selector... selectors) { + for (Selector selector : selectors) { + this.selectors.add(selector); + } + } + + @Override + public String select(String text) { + for (Selector selector : selectors) { + text = selector.select(text); + if (text!=null){ + return text; + } + } + return null; + } + + @Override + public List selectList(String text) { + List results = new ArrayList(); + for (Selector selector : selectors) { + List strings = selector.selectList(text); + results.addAll(strings); + } + return results; + } +} diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index c82ef2315..85d4817e2 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -10,7 +10,7 @@ * Time: 下午10:18
      */ @TargetUrl("http://my.oschina.net/flashsword/blog/*") -public class OschinaBlog implements AfterExtractor{ +public class OschinaBlog implements AfterExtractor { @ExtractBy("//title") private String title; @@ -23,5 +23,6 @@ public class OschinaBlog implements AfterExtractor{ @Override public void afterProcess(Page page, OschinaBlog oschinaBlog) { + content = null; } } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java index f4525f0e7..289cd4fd4 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java @@ -4,9 +4,6 @@ import org.junit.Test; import us.codecraft.webmagic.Site; -import java.util.ArrayList; -import java.util.List; - /** * @author yihua.huang@dianping.com
      * @date: 13-8-1
      @@ -17,7 +14,6 @@ public class TestFetcher { @Ignore("takes long") @Test public void test() { - System.out.println(List.class.isAssignableFrom(ArrayList.class)); OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) .run(); From 83616ad0b4dd257d1d74bd38174a97d0dd4fcef5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 18:01:17 +0800 Subject: [PATCH 106/175] update afterextract api --- .../codecraft/webmagic/oo/AfterExtractor.java | 4 +- .../webmagic/oo/ObjectPageProcessor.java | 28 +++++++++---- .../webmagic/oo/PageModelExtractor.java | 41 ++++++++++++------- .../us/codecraft/webmagic/oo/OschinaBlog.java | 6 +-- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java index cb9788baa..79feaaf39 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java @@ -9,7 +9,7 @@ * @date: 13-8-3
      * Time: 上午9:42
      */ -public interface AfterExtractor { +public interface AfterExtractor { - public void afterProcess(Page page, T t); + public void afterProcess(Page page); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java index dda96b563..c280acd5f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java @@ -4,11 +4,13 @@ import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.processor.PageProcessor; +import us.codecraft.webmagic.selector.Selector; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -33,7 +35,7 @@ public static ObjectPageProcessor create(Site site, Class... clazzs) { } - public ObjectPageProcessor addPageModel(Class clazz){ + public ObjectPageProcessor addPageModel(Class clazz) { PageModelExtractor pageModelExtractor = PageModelExtractor.create(clazz); targetUrlPatterns.addAll(pageModelExtractor.getTargetUrlPatterns()); targetUrlPatterns.addAll(pageModelExtractor.getHelpUrlPatterns()); @@ -49,22 +51,34 @@ private ObjectPageProcessor(Site site) { public void process(Page page) { for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { Object process = pageModelExtractor.process(page); - if (process==null){ + if (process == null) { page.getResultItems().setSkip(true); } postProcessPageModel(pageModelExtractor.getClazz(), process); page.putField(pageModelExtractor.getClazz().getCanonicalName(), process); + extractLinks(page, pageModelExtractor.getHelpUrlRegionSelector(), pageModelExtractor.getHelpUrlPatterns()); + extractLinks(page, pageModelExtractor.getTargetUrlRegionSelector(), pageModelExtractor.getTargetUrlPatterns()); } - for (String link : page.getHtml().links().all()) { - for (Pattern targetUrlPattern : targetUrlPatterns) { - if (targetUrlPattern.matcher(link).matches()){ - page.addTargetRequest(new Request(link)); + } + + private void extractLinks(Page page, Selector urlRegionSelector, List urlPatterns) { + List links; + if (urlRegionSelector == null) { + links = page.getHtml().links().all(); + } else { + links = urlRegionSelector.selectList(page.getHtml().toString()); + } + for (String link : links) { + for (Pattern targetUrlPattern : urlPatterns) { + Matcher matcher = targetUrlPattern.matcher(link); + if (matcher.find()) { + page.addTargetRequest(new Request(matcher.group(1))); } } } } - protected void postProcessPageModel(Class clazz, Object object){ + protected void postProcessPageModel(Class clazz, Object object) { } @Override diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java index 83a4d310a..8a0d81b4b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java @@ -21,14 +21,16 @@ class PageModelExtractor { private List targetUrlPatterns = new ArrayList(); + private Selector targetUrlRegionSelector; + private List helpUrlPatterns = new ArrayList(); + private Selector helpUrlRegionSelector; + private Class clazz; private List fieldExtractors; - private AfterExtractor afterExtractor; - public static PageModelExtractor create(Class clazz) { PageModelExtractor pageModelExtractor = new PageModelExtractor(); pageModelExtractor.init(clazz); @@ -39,13 +41,6 @@ private void init(Class clazz) { this.clazz = clazz; initTargetUrlPatterns(); fieldExtractors = new ArrayList(); - if (AfterExtractor.class.isAssignableFrom(clazz)) { - try { - afterExtractor = (AfterExtractor) clazz.newInstance(); - } catch (Exception e) { - throw new IllegalArgumentException(e); - } - } for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); ExtractBy extractBy = field.getAnnotation(ExtractBy.class); @@ -117,16 +112,24 @@ private void initTargetUrlPatterns() { if (annotation == null) { targetUrlPatterns.add(Pattern.compile(".*")); } else { - String[] value = ((TargetUrl) annotation).value(); + TargetUrl targetUrl = (TargetUrl) annotation; + String[] value = targetUrl.value(); for (String s : value) { - targetUrlPatterns.add(Pattern.compile(s.replace(".", "\\.").replace("*", "[^\"'#]*"))); + targetUrlPatterns.add(Pattern.compile("("+s.replace(".", "\\.").replace("*", "[^\"'#]*")+")")); + } + if (!targetUrl.sourceRegion().equals("")){ + targetUrlRegionSelector = new Xpath2Selector(targetUrl.sourceRegion()); } } annotation = clazz.getAnnotation(HelpUrl.class); if (annotation != null) { - String[] value = ((HelpUrl) annotation).value(); + HelpUrl helpUrl = (HelpUrl) annotation; + String[] value = helpUrl.value(); for (String s : value) { - helpUrlPatterns.add(Pattern.compile(s.replace(".", "\\.").replace("*", "[^\"'#]*"))); + helpUrlPatterns.add(Pattern.compile("("+s.replace(".", "\\.").replace("*", "[^\"'#]*")+")")); + } + if (!helpUrl.sourceRegion().equals("")){ + helpUrlRegionSelector = new Xpath2Selector(helpUrl.sourceRegion()); } } } @@ -179,8 +182,8 @@ public Object process(Page page) { setField(o, fieldExtractor, value); } } - if (afterExtractor != null) { - afterExtractor.afterProcess(page, o); + if (AfterExtractor.class.isAssignableFrom(clazz)) { + ((AfterExtractor)o).afterProcess(page); } } catch (InstantiationException e) { e.printStackTrace(); @@ -210,4 +213,12 @@ List getTargetUrlPatterns() { List getHelpUrlPatterns() { return helpUrlPatterns; } + + Selector getTargetUrlRegionSelector() { + return targetUrlRegionSelector; + } + + Selector getHelpUrlRegionSelector() { + return helpUrlRegionSelector; + } } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index 85d4817e2..0f64aef89 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -9,8 +9,8 @@ * @date: 13-8-1
      * Time: 下午10:18
      */ -@TargetUrl("http://my.oschina.net/flashsword/blog/*") -public class OschinaBlog implements AfterExtractor { +@TargetUrl(value="http://my.oschina.net/flashsword/blog/*",sourceRegion = "//div[@class='BlogLinks']") +public class OschinaBlog implements AfterExtractor { @ExtractBy("//title") private String title; @@ -22,7 +22,7 @@ public class OschinaBlog implements AfterExtractor { private List tags; @Override - public void afterProcess(Page page, OschinaBlog oschinaBlog) { + public void afterProcess(Page page) { content = null; } } From 4844ff29e3f1871773b9798ce29747682b6b9845 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 18:36:03 +0800 Subject: [PATCH 107/175] fix an attribute bug --- .../webmagic/selector/Xpath2Selector.java | 29 +++++++++++++------ .../us/codecraft/webmagic/oo/OschinaBlog.java | 14 +++++++-- .../webmagic/selector/XpathSelectorTest.java | 2 +- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java index 99112cae4..98b1efe4b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java @@ -8,6 +8,7 @@ import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode; import org.w3c.dom.Document; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.namespace.NamespaceContext; @@ -70,7 +71,7 @@ private void put(String prefix, String namespaceURI) { private XPath2NamespaceContext() { put("fn", NamespaceConstant.FN); - put("xslt",NamespaceConstant.XSLT); + put("xslt", NamespaceConstant.XSLT); } @Override @@ -116,15 +117,20 @@ public String select(String text) { result = xPathExpression.evaluate(document, XPathConstants.STRING); } if (result instanceof NodeList) { - StreamResult xmlOutput = new StreamResult(new StringWriter()); - Transformer transformer = TransformerFactory.newInstance().newTransformer(); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); NodeList nodeList = (NodeList) result; if (nodeList.getLength() == 0) { return null; } - transformer.transform(new DOMSource(nodeList.item(0)), xmlOutput); - return xmlOutput.getWriter().toString(); + Node item = nodeList.item(0); + if (item.getNodeType() == Node.ATTRIBUTE_NODE || item.getNodeType() == Node.TEXT_NODE) { + return item.getTextContent(); + } else { + StreamResult xmlOutput = new StreamResult(new StringWriter()); + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + transformer.transform(new DOMSource(item), xmlOutput); + return xmlOutput.getWriter().toString(); + } } return result.toString(); } catch (Exception e) { @@ -152,9 +158,14 @@ public List selectList(String text) { StreamResult xmlOutput = new StreamResult(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); for (int i = 0; i < nodeList.getLength(); i++) { - xmlOutput.setWriter(new StringWriter()); - transformer.transform(new DOMSource(nodeList.item(i)), xmlOutput); - results.add(xmlOutput.getWriter().toString()); + Node item = nodeList.item(i); + if (item.getNodeType() == Node.ATTRIBUTE_NODE || item.getNodeType() == Node.TEXT_NODE) { + results.add(item.getTextContent()); + } else { + xmlOutput.setWriter(new StringWriter()); + transformer.transform(new DOMSource(item), xmlOutput); + results.add(xmlOutput.getWriter().toString()); + } } } else { results.add(result.toString()); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index 0f64aef89..98543b097 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -1,6 +1,7 @@ package us.codecraft.webmagic.oo; import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; import java.util.List; @@ -9,7 +10,7 @@ * @date: 13-8-1
      * Time: 下午10:18
      */ -@TargetUrl(value="http://my.oschina.net/flashsword/blog/*",sourceRegion = "//div[@class='BlogLinks']") +@TargetUrl(value="http://my.oschina.net/flashsword/blog/*",sourceRegion = "//div[@class='BlogLinks']//a/@href") public class OschinaBlog implements AfterExtractor { @ExtractBy("//title") @@ -23,6 +24,13 @@ public class OschinaBlog implements AfterExtractor { @Override public void afterProcess(Page page) { - content = null; + System.out.println("title:\t"+title); + System.out.println("content:\t"+content); + System.out.println("tags:\t" + tags); } -} + + public static void main(String[] args) { + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) + .run(); + } +} \ No newline at end of file diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 2b8e15de9..2f663c990 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1418,7 +1418,7 @@ public Iterator iteratePrefixes() { @Test public void testXpath2Selector() { - Xpath2Selector xpath2Selector = new Xpath2Selector("//a"); + Xpath2Selector xpath2Selector = new Xpath2Selector("//a/@href"); String select = xpath2Selector.select(html); Assert.assertNotNull(select); } From 5d539d74ba397396a9be79dad9493fc42e8f7f1c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sat, 3 Aug 2013 20:42:29 +0800 Subject: [PATCH 108/175] add multi entity extract --- .../webmagic/oo/ObjectPageProcessor.java | 2 +- .../codecraft/webmagic/oo/ObjectPipeline.java | 13 ++++- .../webmagic/oo/PageModelExtractor.java | 55 ++++++++++++++----- .../webmagic/oo/samples/OschinaAnswer.java | 31 +++++++++++ 4 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java index c280acd5f..a02e44660 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java @@ -51,7 +51,7 @@ private ObjectPageProcessor(Site site) { public void process(Page page) { for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { Object process = pageModelExtractor.process(page); - if (process == null) { + if (process == null || (process instanceof List && ((List) process).size() == 0)) { page.getResultItems().setSkip(true); } postProcessPageModel(pageModelExtractor.getClazz(), process); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java index a5f02edc9..54ae2ef36 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java @@ -4,6 +4,8 @@ import us.codecraft.webmagic.Task; import us.codecraft.webmagic.pipeline.Pipeline; +import java.lang.annotation.Annotation; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -32,7 +34,16 @@ public void process(ResultItems resultItems, Task task) { for (Map.Entry classPageModelPipelineEntry : pageModelPipelines.entrySet()) { Object o = resultItems.get(classPageModelPipelineEntry.getKey().getCanonicalName()); if (o != null) { - classPageModelPipelineEntry.getValue().process(o, task); + Annotation annotation = classPageModelPipelineEntry.getKey().getAnnotation(ExtractBy.class); + ExtractBy extractBy = (ExtractBy) annotation; + if (extractBy.multi()) { + List list = (List) o; + for (Object o1 : list) { + classPageModelPipelineEntry.getValue().process(o1, task); + } + } else { + classPageModelPipelineEntry.getValue().process(o, task); + } } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java index 8a0d81b4b..d3d53350b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java @@ -31,6 +31,8 @@ class PageModelExtractor { private List fieldExtractors; + private Extractor extractor; + public static PageModelExtractor create(Class clazz) { PageModelExtractor pageModelExtractor = new PageModelExtractor(); pageModelExtractor.init(clazz); @@ -39,7 +41,7 @@ public static PageModelExtractor create(Class clazz) { private void init(Class clazz) { this.clazz = clazz; - initTargetUrlPatterns(); + initClassExtractors(); fieldExtractors = new ArrayList(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); @@ -107,7 +109,7 @@ public static Method getSetterMethod(Class clazz, Field field) { } } - private void initTargetUrlPatterns() { + private void initClassExtractors() { Annotation annotation = clazz.getAnnotation(TargetUrl.class); if (annotation == null) { targetUrlPatterns.add(Pattern.compile(".*")); @@ -115,9 +117,9 @@ private void initTargetUrlPatterns() { TargetUrl targetUrl = (TargetUrl) annotation; String[] value = targetUrl.value(); for (String s : value) { - targetUrlPatterns.add(Pattern.compile("("+s.replace(".", "\\.").replace("*", "[^\"'#]*")+")")); + targetUrlPatterns.add(Pattern.compile("(" + s.replace(".", "\\.").replace("*", "[^\"'#]*") + ")")); } - if (!targetUrl.sourceRegion().equals("")){ + if (!targetUrl.sourceRegion().equals("")) { targetUrlRegionSelector = new Xpath2Selector(targetUrl.sourceRegion()); } } @@ -126,12 +128,17 @@ private void initTargetUrlPatterns() { HelpUrl helpUrl = (HelpUrl) annotation; String[] value = helpUrl.value(); for (String s : value) { - helpUrlPatterns.add(Pattern.compile("("+s.replace(".", "\\.").replace("*", "[^\"'#]*")+")")); + helpUrlPatterns.add(Pattern.compile("(" + s.replace(".", "\\.").replace("*", "[^\"'#]*") + ")")); } - if (!helpUrl.sourceRegion().equals("")){ + if (!helpUrl.sourceRegion().equals("")) { helpUrlRegionSelector = new Xpath2Selector(helpUrl.sourceRegion()); } } + annotation = clazz.getAnnotation(ExtractBy.class); + if (annotation != null) { + ExtractBy extractBy = (ExtractBy) annotation; + extractor = new Extractor(new Xpath2Selector(extractBy.value()), Extractor.Source.Html, extractBy.notNull(), extractBy.multi()); + } } public Object process(Page page) { @@ -144,6 +151,28 @@ public Object process(Page page) { if (!matched) { return null; } + if (extractor == null) { + return processSingle(page,page.getHtml().toString()); + } else { + if (extractor.multi){ + List os = new ArrayList(); + List list = extractor.getSelector().selectList(page.getHtml().toString()); + for (String s : list) { + Object o = processSingle(page, s); + if (o!=null){ + os.add(o); + } + } + return os; + }else { + String select = extractor.getSelector().select(page.getHtml().toString()); + Object o = processSingle(page, select); + return o; + } + } + } + + private Object processSingle(Page page,String html) { Object o = null; try { o = clazz.newInstance(); @@ -152,38 +181,38 @@ public Object process(Page page) { List value; switch (fieldExtractor.getSource()) { case Html: - value = fieldExtractor.getSelector().selectList(page.getHtml().toString()); + value = fieldExtractor.getSelector().selectList(html); break; case Url: value = fieldExtractor.getSelector().selectList(page.getUrl().toString()); break; default: - value = fieldExtractor.getSelector().selectList(page.getHtml().toString()); + value = fieldExtractor.getSelector().selectList(html); } if ((value == null || value.size() == 0) && fieldExtractor.isNotNull()) { - page.getResultItems().setSkip(true); + return null; } setField(o, fieldExtractor, value); } else { String value; switch (fieldExtractor.getSource()) { case Html: - value = fieldExtractor.getSelector().select(page.getHtml().toString()); + value = fieldExtractor.getSelector().select(html); break; case Url: value = fieldExtractor.getSelector().select(page.getUrl().toString()); break; default: - value = fieldExtractor.getSelector().select(page.getHtml().toString()); + value = fieldExtractor.getSelector().select(html); } if (value == null && fieldExtractor.isNotNull()) { - page.getResultItems().setSkip(true); + return null; } setField(o, fieldExtractor, value); } } if (AfterExtractor.class.isAssignableFrom(clazz)) { - ((AfterExtractor)o).afterProcess(page); + ((AfterExtractor) o).afterProcess(page); } } catch (InstantiationException e) { e.printStackTrace(); diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java new file mode 100644 index 000000000..fd04b1dae --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java @@ -0,0 +1,31 @@ +package us.codecraft.webmagic.oo.samples; + +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.oo.*; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-3
      + * Time: 下午8:25
      + */ +@TargetUrl("http://www.oschina.net/question/\\d+_\\d+*") +@HelpUrl("http://www.oschina.net/question/*") +@ExtractBy(value = "//ul[@class='list']/li[@class='Answer']", multi = true) +public class OschinaAnswer implements AfterExtractor{ + + @ExtractBy("//img/@title") + private String user; + + @ExtractBy(value="//div[@class='detail']",notNull = false) + private String content; + + public static void main(String[] args) { + OOSpider.create(Site.me().addStartUrl("http://www.oschina.net/question/567527_120597"), OschinaAnswer.class).run(); + } + + @Override + public void afterProcess(Page page) { + + } +} From 21370984090b34a175e36dff27ae52945a07dfc0 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 03:04:30 +0800 Subject: [PATCH 109/175] update author --- .../us/codecraft/webmagic/oo/ConsolePageModelPipeline.java | 2 +- .../main/java/us/codecraft/webmagic/selector/AndSelector.java | 2 +- .../main/java/us/codecraft/webmagic/selector/OrSelector.java | 2 +- .../src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java | 2 +- .../src/test/java/us/codecraft/webmagic/oo/TestFetcher.java | 2 +- .../test/java/us/codecraft/webmagic/selector/SaxonTest.java | 2 +- .../java/us/codecraft/webmagic/scheduler/RedisScheduler.java | 2 +- .../us/codecraft/webmagic/scheduler/RedisSchedulerTest.java | 2 +- .../webmagic/selenium/downloader/SeleniumDownloader.java | 2 +- .../codecraft/webmagic/selenium/downloader/WebDriverPool.java | 2 +- .../java/us/codecraft/webmagic/selenium/SeleniumTest.java | 2 +- .../webmagic/selenium/downloader/SeleniumDownloaderTest.java | 2 +- .../webmagic/selenium/downloader/WebDriverPoolTest.java | 2 +- .../src/main/java/us/codecraft/webmagic/oo/samples/Blog.java | 2 +- .../main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java | 2 +- .../java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java | 4 ++-- .../java/us/codecraft/webmagic/oo/samples/OschinaBlog.java | 2 +- .../java/us/codecraft/webmagic/samples/GlobalProcessor.java | 2 +- .../java/us/codecraft/webmagic/samples/GuoxueProcessor.java | 2 +- .../java/us/codecraft/webmagic/samples/HuabanProcessor.java | 2 +- .../us/codecraft/webmagic/samples/IteyeBlogProcessor.java | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java index 16b1ef2ab..e17f210dd 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java @@ -4,7 +4,7 @@ import us.codecraft.webmagic.Task; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-3
      * Time: 下午3:41
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java index 98481efee..e6bbbb80c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java @@ -4,7 +4,7 @@ import java.util.List; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-3
      * Time: 下午5:29
      */ diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java index 2cdd870f7..dca1b343e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java @@ -4,7 +4,7 @@ import java.util.List; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-3
      * Time: 下午5:29
      */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java index 98543b097..728f1433c 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java @@ -6,7 +6,7 @@ import java.util.List; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午10:18
      */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java index 289cd4fd4..b7f2d29c6 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.Site; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:42
      */ diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java index 509be4409..05a890631 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java @@ -15,7 +15,7 @@ import javax.xml.xpath.XPathFactoryConfigurationException; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 下午5:48
      */ diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index 382642b7d..094295c80 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -10,7 +10,7 @@ /** * 使用redis管理url,构建一个分布式的爬虫。
      * - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-25
      * Time: 上午7:07
      */ diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java index 6db21a8f9..3d596710b 100644 --- a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java +++ b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java @@ -8,7 +8,7 @@ import us.codecraft.webmagic.Task; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-25
      * Time: 上午7:51
      */ diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java index 1b689d4d2..002dcc9ea 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java @@ -21,7 +21,7 @@ * 使用Selenium调用浏览器进行渲染。目前仅支持chrome。
      * 需要下载Selenium driver支持。
      * - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午1:37
      */ diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java index faed8d63a..fdd978df6 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java +++ b/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午1:41
      */ diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java index a403b91ce..a6de8471f 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java @@ -13,7 +13,7 @@ import java.util.Map; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午12:27
      */ diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java index 968308377..23711fa93 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java @@ -8,7 +8,7 @@ import us.codecraft.webmagic.Task; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午2:46
      */ diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java index 1efc69b16..cbf386068 100644 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java +++ b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java @@ -5,7 +5,7 @@ import org.openqa.selenium.WebDriver; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午2:12
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java index 565c7111a..e3e536429 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.oo.samples; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 上午8:10
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java index e289c87cf..39597af68 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.oo.TargetUrl; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 上午7:52
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java index fd04b1dae..0a59b7dff 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.oo.*; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-3
      * Time: 下午8:25
      */ @@ -17,7 +17,7 @@ public class OschinaAnswer implements AfterExtractor{ @ExtractBy("//img/@title") private String user; - @ExtractBy(value="//div[@class='detail']",notNull = false) + @ExtractBy("//div[@class='detail']") private String content; public static void main(String[] args) { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java index 4a52a1412..5224c8530 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.oo.TargetUrl; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 上午7:52
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java index 2bdf342fe..0448683b1 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java @@ -10,7 +10,7 @@ import java.util.List; /** - * Author yihua.huang@dianping.com + * Author code4crafter@gmail.com * Date: 13-6-24 * Time: 下午2:12 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java index 54d995e59..db00c79c3 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-14
      * Time: 上午8:33
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java index d8c5f0573..eef2b2fa1 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -11,7 +11,7 @@ /** * 花瓣网抽取器。
      * 使用Selenium做页面动态渲染。
      - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 下午4:08
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java index 76f9cc30e..da846e8c8 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java @@ -7,7 +7,7 @@ import us.codecraft.webmagic.processor.PageProcessor; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-26
      * Time: 上午7:31
      */ From 94e5dbbcc7fbcbe6451ddb53a204590ff382c221 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 07:53:28 +0800 Subject: [PATCH 110/175] update package --- .../main/java/us/codecraft/webmagic/Page.java | 19 +++++++++++++++++-- .../{oo => model}/AfterExtractor.java | 2 +- .../ConsolePageModelPipeline.java | 2 +- .../webmagic/{oo => model}/ExtractBy.java | 2 +- .../webmagic/{oo => model}/ExtractByUrl.java | 2 +- .../webmagic/{oo => model}/Extractor.java | 2 +- .../{oo => model}/FieldExtractor.java | 2 +- .../webmagic/{oo => model}/HelpUrl.java | 2 +- .../webmagic/{oo => model}/OOSpider.java | 2 +- .../{oo => model}/ObjectPageProcessor.java | 2 +- .../{oo => model}/ObjectPipeline.java | 2 +- .../{oo => model}/PageModelExtractor.java | 2 +- .../{oo => model}/PageModelPipeline.java | 2 +- .../webmagic/{oo => model}/TargetUrl.java | 2 +- .../webmagic/{oo => model}/package.html | 0 .../webmagic/{oo => model}/OschinaBlog.java | 5 +++-- .../webmagic/{oo => model}/TestFetcher.java | 2 +- .../webmagic/{oo => model}/samples/Blog.java | 2 +- .../{oo => model}/samples/IteyeBlog.java | 8 ++++---- .../{oo => model}/samples/OschinaAnswer.java | 4 ++-- .../{oo => model}/samples/OschinaBlog.java | 8 ++++---- 21 files changed, 45 insertions(+), 29 deletions(-) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/AfterExtractor.java (88%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/ConsolePageModelPipeline.java (91%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/ExtractBy.java (93%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/ExtractByUrl.java (92%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/Extractor.java (95%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/FieldExtractor.java (96%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/HelpUrl.java (91%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/OOSpider.java (97%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/ObjectPageProcessor.java (98%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/ObjectPipeline.java (97%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/PageModelExtractor.java (99%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/PageModelPipeline.java (85%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/TargetUrl.java (91%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{oo => model}/package.html (100%) rename webmagic-core/src/test/java/us/codecraft/webmagic/{oo => model}/OschinaBlog.java (86%) rename webmagic-core/src/test/java/us/codecraft/webmagic/{oo => model}/TestFetcher.java (91%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{oo => model}/samples/Blog.java (80%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{oo => model}/samples/IteyeBlog.java (82%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{oo => model}/samples/OschinaAnswer.java (90%) rename webmagic-samples/src/main/java/us/codecraft/webmagic/{oo => model}/samples/OschinaBlog.java (82%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java index 40f17f0aa..eb2c13214 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Page.java @@ -9,7 +9,7 @@ /** *
      - *Page保存了上一次抓取的结果,并可定义待抓取的链接内容。
      + * Page保存了上一次抓取的结果,并可定义待抓取的链接内容。
        *
        *     主要方法:
        *     {@link #getUrl()} 获取页面的Url
      @@ -19,6 +19,7 @@
        *     {@link #addTargetRequests(java.util.List)} {@link #addTargetRequest(String)} 添加待抓取的链接
        *
        * 
      + * * @author code4crafter@gmail.com
      */ public class Page { @@ -36,9 +37,16 @@ public class Page { public Page() { } + public Page setSkip(boolean skip) { + resultItems.setSkip(skip); + return this; + + } + /** * 保存抽取的结果 - * @param key 结果的key + * + * @param key 结果的key * @param field 结果的value */ public void putField(String key, Object field) { @@ -47,6 +55,7 @@ public void putField(String key, Object field) { /** * 获取页面的html内容 + * * @return html 页面的html内容 */ public Selectable getHtml() { @@ -63,6 +72,7 @@ public List getTargetRequests() { /** * 添加待抓取的链接 + * * @param requests 待抓取的链接 */ public void addTargetRequests(List requests) { @@ -79,6 +89,7 @@ public void addTargetRequests(List requests) { /** * 添加待抓取的链接 + * * @param requestString 待抓取的链接 */ public void addTargetRequest(String requestString) { @@ -93,6 +104,7 @@ public void addTargetRequest(String requestString) { /** * 添加待抓取的页面,在需要传递附加信息时使用 + * * @param request 待抓取的页面 */ public void addTargetRequest(Request request) { @@ -103,6 +115,7 @@ public void addTargetRequest(Request request) { /** * 获取页面的Url + * * @return url 当前页面的url,可用于抽取 */ public Selectable getUrl() { @@ -111,6 +124,7 @@ public Selectable getUrl() { /** * 设置url + * * @param url */ public void setUrl(Selectable url) { @@ -119,6 +133,7 @@ public void setUrl(Selectable url) { /** * 获取抓取请求 + * * @return request 抓取请求 */ public Request getRequest() { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java similarity index 88% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java index 79feaaf39..01170811c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/AfterExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.Page; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java similarity index 91% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java index e17f210dd..e5485a194 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ConsolePageModelPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import org.apache.commons.lang3.builder.ToStringBuilder; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java similarity index 93% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java index 71bdc937e..4c37c9b9a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java similarity index 92% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java index e86f08f14..9f7767658 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ExtractByUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java similarity index 95% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java index f0607cfd7..c8feef41e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/Extractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.selector.Selector; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java similarity index 96% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java index 2a6bcf72b..17a55c83e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/FieldExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.selector.Selector; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java similarity index 91% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java index a8ed99503..9dee05b2f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/HelpUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java similarity index 97% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java index 5f523ed37..e008bfe02 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPageProcessor.java similarity index 98% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPageProcessor.java index a02e44660..5a707bc1d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPageProcessor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Request; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java similarity index 97% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java index 54ae2ef36..f59038468 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/ObjectPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java similarity index 99% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index d3d53350b..6ba2c5ee6 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import org.apache.commons.lang3.StringUtils; import us.codecraft.webmagic.Page; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java similarity index 85% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java index 7406cde2d..bd3aa95ae 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/PageModelPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java similarity index 91% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java index 77b5a822e..96ca86485 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/TargetUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/oo/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/oo/package.html rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java similarity index 86% rename from webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java rename to webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java index 728f1433c..1bb219f3b 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; @@ -10,7 +10,7 @@ * @date: 13-8-1
      * Time: 下午10:18
      */ -@TargetUrl(value="http://my.oschina.net/flashsword/blog/*",sourceRegion = "//div[@class='BlogLinks']//a/@href") +@TargetUrl("http://my.oschina.net/flashsword/blog/*") public class OschinaBlog implements AfterExtractor { @ExtractBy("//title") @@ -27,6 +27,7 @@ public void afterProcess(Page page) { System.out.println("title:\t"+title); System.out.println("content:\t"+content); System.out.println("tags:\t" + tags); + page.setSkip(true); } public static void main(String[] args) { diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java b/webmagic-core/src/test/java/us/codecraft/webmagic/model/TestFetcher.java similarity index 91% rename from webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java rename to webmagic-core/src/test/java/us/codecraft/webmagic/model/TestFetcher.java index b7f2d29c6..009d53aca 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/oo/TestFetcher.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/model/TestFetcher.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo; +package us.codecraft.webmagic.model; import org.junit.Ignore; import org.junit.Test; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java similarity index 80% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java index e3e536429..484861b9a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/Blog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.oo.samples; +package us.codecraft.webmagic.model.samples; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java similarity index 82% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java index 39597af68..4d01902c6 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java @@ -1,9 +1,9 @@ -package us.codecraft.webmagic.oo.samples; +package us.codecraft.webmagic.model.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.oo.ExtractBy; -import us.codecraft.webmagic.oo.OOSpider; -import us.codecraft.webmagic.oo.TargetUrl; +import us.codecraft.webmagic.model.ExtractBy; +import us.codecraft.webmagic.model.OOSpider; +import us.codecraft.webmagic.model.TargetUrl; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java similarity index 90% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java index 0a59b7dff..df2387397 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaAnswer.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java @@ -1,8 +1,8 @@ -package us.codecraft.webmagic.oo.samples; +package us.codecraft.webmagic.model.samples; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.oo.*; +import us.codecraft.webmagic.model.*; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java similarity index 82% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java index 5224c8530..9f11d0e0a 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/oo/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java @@ -1,9 +1,9 @@ -package us.codecraft.webmagic.oo.samples; +package us.codecraft.webmagic.model.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.oo.ExtractBy; -import us.codecraft.webmagic.oo.OOSpider; -import us.codecraft.webmagic.oo.TargetUrl; +import us.codecraft.webmagic.model.ExtractBy; +import us.codecraft.webmagic.model.OOSpider; +import us.codecraft.webmagic.model.TargetUrl; /** * @author code4crafter@gmail.com
      From 2584a09b531842e0dc00fc60e125ea5b04462eb2 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 09:53:01 +0800 Subject: [PATCH 111/175] update pipeline --- .../main/java/us/codecraft/webmagic/model/OOSpider.java | 8 +++++--- .../java/us/codecraft/webmagic/model/ObjectPipeline.java | 7 +++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java index e008bfe02..900c9b4e5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java @@ -28,13 +28,15 @@ public OOSpider(Site site, PageModelPipeline pageModelPipeline, Class... pageMod this(ObjectPageProcessor.create(site, pageModels)); this.objectPipeline = new ObjectPipeline(); super.pipeline(objectPipeline); - for (Class pageModel : pageModels) { - this.objectPipeline.put(pageModel, pageModelPipeline); + if (pageModelPipeline!=null){ + for (Class pageModel : pageModels) { + this.objectPipeline.put(pageModel, pageModelPipeline); + } } } public static OOSpider create(Site site, Class... pageModels) { - return new OOSpider(site, new ConsolePageModelPipeline(), pageModels); + return new OOSpider(site, null, pageModels); } public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java index f59038468..41296f531 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java @@ -35,14 +35,13 @@ public void process(ResultItems resultItems, Task task) { Object o = resultItems.get(classPageModelPipelineEntry.getKey().getCanonicalName()); if (o != null) { Annotation annotation = classPageModelPipelineEntry.getKey().getAnnotation(ExtractBy.class); - ExtractBy extractBy = (ExtractBy) annotation; - if (extractBy.multi()) { + if (annotation == null || !((ExtractBy) annotation).multi()) { + classPageModelPipelineEntry.getValue().process(o, task); + } else { List list = (List) o; for (Object o1 : list) { classPageModelPipelineEntry.getValue().process(o1, task); } - } else { - classPageModelPipelineEntry.getValue().process(o, task); } } } From a8b2459a5d6d4cd639d5d5a0b22663dfcc24293e Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 09:55:50 +0800 Subject: [PATCH 112/175] rename --- ...Processor.java => ModelPageProcessor.java} | 14 ++++++------ ...ObjectPipeline.java => ModelPipeline.java} | 6 ++--- .../us/codecraft/webmagic/model/OOSpider.java | 22 +++++++++---------- .../us/codecraft/webmagic/model/package.html | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) rename webmagic-core/src/main/java/us/codecraft/webmagic/model/{ObjectPageProcessor.java => ModelPageProcessor.java} (86%) rename webmagic-core/src/main/java/us/codecraft/webmagic/model/{ObjectPipeline.java => ModelPipeline.java} (90%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java similarity index 86% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPageProcessor.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java index 5a707bc1d..1fd8c10de 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java @@ -18,7 +18,7 @@ * @date: 13-8-1
      * Time: 下午8:46
      */ -public class ObjectPageProcessor implements PageProcessor { +public class ModelPageProcessor implements PageProcessor { private List pageModelExtractorList = new ArrayList(); @@ -26,16 +26,16 @@ public class ObjectPageProcessor implements PageProcessor { private Set targetUrlPatterns = new HashSet(); - public static ObjectPageProcessor create(Site site, Class... clazzs) { - ObjectPageProcessor objectPageProcessor = new ObjectPageProcessor(site); + public static ModelPageProcessor create(Site site, Class... clazzs) { + ModelPageProcessor modelPageProcessor = new ModelPageProcessor(site); for (Class clazz : clazzs) { - objectPageProcessor.addPageModel(clazz); + modelPageProcessor.addPageModel(clazz); } - return objectPageProcessor; + return modelPageProcessor; } - public ObjectPageProcessor addPageModel(Class clazz) { + public ModelPageProcessor addPageModel(Class clazz) { PageModelExtractor pageModelExtractor = PageModelExtractor.create(clazz); targetUrlPatterns.addAll(pageModelExtractor.getTargetUrlPatterns()); targetUrlPatterns.addAll(pageModelExtractor.getHelpUrlPatterns()); @@ -43,7 +43,7 @@ public ObjectPageProcessor addPageModel(Class clazz) { return this; } - private ObjectPageProcessor(Site site) { + private ModelPageProcessor(Site site) { this.site = site; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java similarity index 90% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java index 41296f531..439a62914 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ObjectPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java @@ -14,14 +14,14 @@ * @date: 13-8-2
      * Time: 上午10:47
      */ -public class ObjectPipeline implements Pipeline { +public class ModelPipeline implements Pipeline { private Map pageModelPipelines = new ConcurrentHashMap(); - public ObjectPipeline() { + public ModelPipeline() { } - public ObjectPipeline put(Class clazz, PageModelPipeline pageModelPipeline) { + public ModelPipeline put(Class clazz, PageModelPipeline pageModelPipeline) { pageModelPipelines.put(clazz, pageModelPipeline); return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java index 900c9b4e5..a76144a48 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java @@ -15,22 +15,22 @@ public class OOSpider extends Spider { * * @param pageProcessor 已定义的抽取规则 */ - private ObjectPageProcessor objectPageProcessor; + private ModelPageProcessor modelPageProcessor; - private ObjectPipeline objectPipeline; + private ModelPipeline modelPipeline; - protected OOSpider(ObjectPageProcessor objectPageProcessor) { - super(objectPageProcessor); - this.objectPageProcessor = objectPageProcessor; + protected OOSpider(ModelPageProcessor modelPageProcessor) { + super(modelPageProcessor); + this.modelPageProcessor = modelPageProcessor; } public OOSpider(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) { - this(ObjectPageProcessor.create(site, pageModels)); - this.objectPipeline = new ObjectPipeline(); - super.pipeline(objectPipeline); + this(ModelPageProcessor.create(site, pageModels)); + this.modelPipeline = new ModelPipeline(); + super.pipeline(modelPipeline); if (pageModelPipeline!=null){ for (Class pageModel : pageModels) { - this.objectPipeline.put(pageModel, pageModelPipeline); + this.modelPipeline.put(pageModel, pageModelPipeline); } } } @@ -45,8 +45,8 @@ public static OOSpider create(Site site, PageModelPipeline pageModelPipeline, Cl public OOSpider addPageModel(PageModelPipeline pageModelPipeline, Class... pageModels) { for (Class pageModel : pageModels) { - objectPageProcessor.addPageModel(pageModel); - objectPipeline.put(pageModel, pageModelPipeline); + modelPageProcessor.addPageModel(pageModel); + modelPipeline.put(pageModel, pageModelPipeline); } return this; } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html index b5f80b15c..d62cc0027 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html @@ -1,5 +1,5 @@ -webmagic对抓取器编写的面向对象方式的封装。基于POJO(称为PageModel)及注解即可实现一个PageProcessor。 +webmagic对抓取器编写的面向模型(称为PageModel)的封装。基于POJO及注解即可实现一个PageProcessor。 From 3e562e1e7856feeb58cb9ce16136220d94f2bad0 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 10:05:03 +0800 Subject: [PATCH 113/175] update name --- .../codecraft/webmagic/model/ModelPageProcessor.java | 3 ++- .../us/codecraft/webmagic/model/ModelPipeline.java | 3 ++- .../java/us/codecraft/webmagic/model/OOSpider.java | 12 +++++++----- .../codecraft/webmagic/model/PageModelExtractor.java | 1 + 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java index 1fd8c10de..12e85d070 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java @@ -14,11 +14,12 @@ import java.util.regex.Pattern; /** + * 基于PageProcessor的扩展点。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:46
      */ -public class ModelPageProcessor implements PageProcessor { +class ModelPageProcessor implements PageProcessor { private List pageModelExtractorList = new ArrayList(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java index 439a62914..f9b0015aa 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java @@ -10,11 +10,12 @@ import java.util.concurrent.ConcurrentHashMap; /** + * 基于Pipeline的扩展点。
      * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 上午10:47
      */ -public class ModelPipeline implements Pipeline { +class ModelPipeline implements Pipeline { private Map pageModelPipelines = new ConcurrentHashMap(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java index a76144a48..8a3739d1c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java @@ -4,17 +4,13 @@ import us.codecraft.webmagic.Spider; /** + * 基于Model的Spider,封装后的入口类。
      * @author code4crafter@gmail.com
      * @date: 13-8-3
      * Time: 上午9:51
      */ public class OOSpider extends Spider { - /** - * OOSpider只能由ObjectPageProcessor创建。 - * - * @param pageProcessor 已定义的抽取规则 - */ private ModelPageProcessor modelPageProcessor; private ModelPipeline modelPipeline; @@ -24,6 +20,12 @@ protected OOSpider(ModelPageProcessor modelPageProcessor) { this.modelPageProcessor = modelPageProcessor; } + /** + * 创建一个爬虫。
      + * @param site + * @param pageModelPipeline + * @param pageModels + */ public OOSpider(Site site, PageModelPipeline pageModelPipeline, Class... pageModels) { this(ModelPageProcessor.create(site, pageModels)); this.modelPipeline = new ModelPipeline(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index 6ba2c5ee6..cf0eeacc9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -13,6 +13,7 @@ import java.util.regex.Pattern; /** + * Model主要逻辑类。将一个带注解的POJO转换为一个PageModelExtractor。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午9:33
      From 72cde5b8076955cdc8613a8f123893d930d7baaf Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 15:12:06 +0800 Subject: [PATCH 114/175] add annotation ExtractByRaw --- .../webmagic/model/ExtractByRaw.java | 27 ++++ .../codecraft/webmagic/model/Extractor.java | 2 +- .../webmagic/model/PageModelExtractor.java | 148 ++++++++++++------ .../codecraft/webmagic/model/OschinaBlog.java | 3 + .../webmagic/model/OschinaBlogComment.java | 13 ++ 5 files changed, 143 insertions(+), 50 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java create mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java new file mode 100644 index 000000000..5dca8e145 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java @@ -0,0 +1,27 @@ +package us.codecraft.webmagic.model; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * 对于在Class级别就使用过ExtractBy的类,在字段中想抽取全部内容可使用此方法。
      + * @author code4crafter@gmail.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD,ElementType.TYPE}) +public @interface ExtractByRaw { + + String value(); + + public enum Type {XPath2, XPath, Regex, Css} + + Type type() default Type.XPath2; + + boolean notNull() default true; + + boolean multi() default false; + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java index c8feef41e..498aba996 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java @@ -17,7 +17,7 @@ class Extractor { protected final boolean multi; - static enum Source {Html, Url} + static enum Source {Html, Url, RawHtml} public Extractor(Selector selector, Source source, boolean notNull, boolean multi) { this.selector = selector; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index cf0eeacc9..9694c4e2d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -46,56 +46,100 @@ private void init(Class clazz) { fieldExtractors = new ArrayList(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); - ExtractBy extractBy = field.getAnnotation(ExtractBy.class); - if (extractBy != null) { - if (!extractBy.multi() && !String.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractBy.multi() && !List.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be list"); - } - String value = extractBy.value(); - Selector selector; - switch (extractBy.type()) { - case Css: - selector = new CssSelector(value); - break; - case Regex: - selector = new RegexSelector(value); - break; - case XPath: - selector = new XpathSelector(value); - break; - case XPath2: - selector = new Xpath2Selector(value); - break; - default: - selector = new Xpath2Selector(value); - } - FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull(), extractBy.multi()); - Method setterMethod = getSetterMethod(clazz, field); - if (setterMethod != null) { - fieldExtractor.setSetterMethod(setterMethod); - } - fieldExtractors.add(fieldExtractor); - } - ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); - if (extractByUrl != null) { - if (!extractByUrl.multi() && !String.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractByUrl.multi() && !List.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be list"); - } - String regexPattern = extractByUrl.value(); - if (regexPattern.trim().equals("")) { - regexPattern = ".*"; - } - FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull(), extractByUrl.multi()); - Method setterMethod = getSetterMethod(clazz, field); - if (setterMethod != null) { - fieldExtractor.setSetterMethod(setterMethod); - } - fieldExtractors.add(fieldExtractor); + getAnnotationExtractBy(clazz, field); + getAnnotationExtractByRaw(clazz,field); + getAnnotationExtractByUrl(clazz, field); + } + } + + private void getAnnotationExtractByUrl(Class clazz, Field field) { + ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); + if (extractByUrl != null) { + if (!extractByUrl.multi() && !String.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be string"); + } else if (extractByUrl.multi() && !List.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be list"); + } + String regexPattern = extractByUrl.value(); + if (regexPattern.trim().equals("")) { + regexPattern = ".*"; } + FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull(), extractByUrl.multi()); + Method setterMethod = getSetterMethod(clazz, field); + if (setterMethod != null) { + fieldExtractor.setSetterMethod(setterMethod); + } + fieldExtractors.add(fieldExtractor); + } + } + + private void getAnnotationExtractBy(Class clazz, Field field) { + ExtractBy extractBy = field.getAnnotation(ExtractBy.class); + if (extractBy != null) { + if (!extractBy.multi() && !String.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be string"); + } else if (extractBy.multi() && !List.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be list"); + } + String value = extractBy.value(); + Selector selector; + switch (extractBy.type()) { + case Css: + selector = new CssSelector(value); + break; + case Regex: + selector = new RegexSelector(value); + break; + case XPath: + selector = new XpathSelector(value); + break; + case XPath2: + selector = new Xpath2Selector(value); + break; + default: + selector = new Xpath2Selector(value); + } + FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull(), extractBy.multi()); + Method setterMethod = getSetterMethod(clazz, field); + if (setterMethod != null) { + fieldExtractor.setSetterMethod(setterMethod); + } + fieldExtractors.add(fieldExtractor); + } + } + + private void getAnnotationExtractByRaw(Class clazz, Field field) { + ExtractByRaw extractByRaw = field.getAnnotation(ExtractByRaw.class); + if (extractByRaw != null) { + if (!extractByRaw.multi() && !String.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be string"); + } else if (extractByRaw.multi() && !List.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be list"); + } + String value = extractByRaw.value(); + Selector selector; + switch (extractByRaw.type()) { + case Css: + selector = new CssSelector(value); + break; + case Regex: + selector = new RegexSelector(value); + break; + case XPath: + selector = new XpathSelector(value); + break; + case XPath2: + selector = new Xpath2Selector(value); + break; + default: + selector = new Xpath2Selector(value); + } + FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.RawHtml, extractByRaw.notNull(), extractByRaw.multi()); + Method setterMethod = getSetterMethod(clazz, field); + if (setterMethod != null) { + fieldExtractor.setSetterMethod(setterMethod); + } + fieldExtractors.add(fieldExtractor); } } @@ -181,6 +225,9 @@ private Object processSingle(Page page,String html) { if (fieldExtractor.multi) { List value; switch (fieldExtractor.getSource()) { + case RawHtml: + value = fieldExtractor.getSelector().selectList(page.getHtml().toString()); + break; case Html: value = fieldExtractor.getSelector().selectList(html); break; @@ -197,6 +244,9 @@ private Object processSingle(Page page,String html) { } else { String value; switch (fieldExtractor.getSource()) { + case RawHtml: + value = fieldExtractor.getSelector().select(page.getHtml().toString()); + break; case Html: value = fieldExtractor.getSelector().select(html); break; diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java index 1bb219f3b..2552104c8 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java @@ -22,6 +22,9 @@ public class OschinaBlog implements AfterExtractor { @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) private List tags; + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List comments; + @Override public void afterProcess(Page page) { System.out.println("title:\t"+title); diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java new file mode 100644 index 000000000..a1e5843a2 --- /dev/null +++ b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java @@ -0,0 +1,13 @@ +package us.codecraft.webmagic.model; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-8-1
      + * Time: 下午10:18
      + */ +@TargetUrl("http://my.oschina.net/flashsword/blog/*") +public class OschinaBlogComment { + + + +} \ No newline at end of file From d02080eb4bc930da3cb87e42273237f12a315277 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Sun, 4 Aug 2013 21:22:15 +0800 Subject: [PATCH 115/175] add paged support --- .../java/us/codecraft/webmagic/Spider.java | 5 + .../webmagic/pipeline/ConsolePipeline.java | 1 - .../webmagic/utils/DoubleKeyMap.java | 111 ++++++++++++++++++ .../webmagic/utils/MultiKeyMapBase.java | 42 +++++++ .../webmagic/model/OschinaBlogComment.java | 13 -- .../us/codecraft/webmagic/PagedModel.java | 20 ++++ .../webmagic/pipeline/PagedPipeline.java | 78 ++++++++++++ .../webmagic/model/samples/News163.java | 81 +++++++++++++ 8 files changed, 337 insertions(+), 14 deletions(-) create mode 100755 webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java create mode 100755 webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java delete mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java create mode 100644 webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java create mode 100644 webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index a25fd024c..414315c25 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -283,6 +283,11 @@ public Spider thread(int threadNum) { return this; } + public Spider clearPipeline(){ + pipelines=new ArrayList(); + return this; + } + @Override public String getUUID() { if (uuid != null) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 97470e04f..8f294745a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -29,7 +29,6 @@ public void process(ResultItems resultItems,Task task) { } else { System.out.println(entry.getKey() + ":\t" + entry.getValue()); } - System.out.println(entry.getKey()+":\t"+entry.getValue()); } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java new file mode 100755 index 000000000..500573aac --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java @@ -0,0 +1,111 @@ +package us.codecraft.webmagic.utils; + +import java.util.Map; + +/** + * @author yihua.huang@dianping.com + * @date Dec 14, 2012 + */ +public class DoubleKeyMap extends MultiKeyMapBase { + private Map> map; + + public DoubleKeyMap() { + init(); + } + + public DoubleKeyMap(Map> map) { + this(map,DEFAULT_CLAZZ); + } + + public DoubleKeyMap(Class protoMapClass) { + super(protoMapClass); + init(); + } + + private void init() { + if (map == null) { + map = this.>newMap(); + } + } + + /** + * init map with protoMapClass + * + * @param protoMapClass + */ + @SuppressWarnings("rawtypes") + public DoubleKeyMap(Map> map, Class protoMapClass) { + super(protoMapClass); + this.map = map; + init(); + } + + /** + * @param key + * @return + */ + public Map get(K1 key) { + return map.get(key); + } + + /** + * @param key1 + * @param key2 + * @return + */ + public V get(K1 key1, K2 key2) { + if (get(key1) == null) { + return null; + } + return get(key1).get(key2); + } + + + /** + * @param key1 + * @param submap + * @return + */ + public V put(K1 key1, Map submap) { + return put(key1, submap); + } + + /** + * @param key1 + * @param key2 + * @param value + * @return + */ + public V put(K1 key1, K2 key2, V value) { + if (map.get(key1) == null) { + map.put(key1, this.newMap()); + } + return get(key1).put(key2, value); + } + + /** + * @param key1 + * @param key2 + * @return + */ + public V remove(K1 key1, K2 key2) { + if (get(key1) == null) { + return null; + } + V remove = get(key1).remove(key2); + // 如果上一级map为空,把它也回收掉 + if (get(key1).size() == 0) { + remove(key1); + } + return remove; + } + + /** + * @param key1 + * @return + */ + public Map remove(K1 key1) { + Map remove = map.remove(key1); + return remove; + } +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java new file mode 100755 index 000000000..e0b5c64ac --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java @@ -0,0 +1,42 @@ +package us.codecraft.webmagic.utils; + +/** + * @author yihua.huang@dianping.com + * @date Dec 14, 2012 + */ + +import java.util.HashMap; +import java.util.Map; + +/** + * multikey map, some basic objects * + * + * @author yihua.huang + */ +public abstract class MultiKeyMapBase { + + protected static final Class DEFAULT_CLAZZ = HashMap.class; + @SuppressWarnings("rawtypes") + private Class protoMapClass = DEFAULT_CLAZZ; + + public MultiKeyMapBase() { + } + + @SuppressWarnings("rawtypes") + public MultiKeyMapBase(Class protoMapClass) { + this.protoMapClass = protoMapClass; + } + + @SuppressWarnings("unchecked") + protected Map newMap() { + try { + return (Map) protoMapClass.newInstance(); + } catch (InstantiationException e) { + throw new IllegalArgumentException("wrong proto type map " + + protoMapClass); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException("wrong proto type map " + + protoMapClass); + } + } +} \ No newline at end of file diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java b/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java deleted file mode 100644 index a1e5843a2..000000000 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlogComment.java +++ /dev/null @@ -1,13 +0,0 @@ -package us.codecraft.webmagic.model; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-8-1
      - * Time: 下午10:18
      - */ -@TargetUrl("http://my.oschina.net/flashsword/blog/*") -public class OschinaBlogComment { - - - -} \ No newline at end of file diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java new file mode 100644 index 000000000..f18426a78 --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java @@ -0,0 +1,20 @@ +package us.codecraft.webmagic; + +import java.util.Collection; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-4
      + * Time: 下午5:18
      + */ +public interface PagedModel { + + public String getPageKey(); + + public Collection getOtherPages(); + + public String getPage(); + + public PagedModel combine(PagedModel pagedModel); + +} diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java new file mode 100644 index 000000000..cc71e5c67 --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java @@ -0,0 +1,78 @@ +package us.codecraft.webmagic.pipeline; + +import us.codecraft.webmagic.PagedModel; +import us.codecraft.webmagic.ResultItems; +import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.utils.DoubleKeyMap; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-4
      + * Time: 下午5:15
      + */ +public class PagedPipeline implements Pipeline { + + private DoubleKeyMap pageMap = new DoubleKeyMap(ConcurrentHashMap.class); + + private DoubleKeyMap objectMap = new DoubleKeyMap(ConcurrentHashMap.class); + + @Override + public void process(ResultItems resultItems, Task task) { + Map resultItemsAll = resultItems.getAll(); + Iterator> iterator = resultItemsAll.entrySet().iterator(); + while (iterator.hasNext()) { + handleObject(iterator); + } + } + + private void handleObject(Iterator> iterator) { + Map.Entry objectEntry = iterator.next(); + Object o = objectEntry.getValue(); + if (o instanceof PagedModel) { + PagedModel pagedModel = (PagedModel) o; + for (String otherPage : pagedModel.getOtherPages()) { + Boolean aBoolean = pageMap.get(pagedModel.getPageKey(), otherPage); + if (aBoolean == null) { + pageMap.put(pagedModel.getPageKey(), otherPage, Boolean.FALSE); + } + } + //check if all pages are processed + Map booleanMap = pageMap.get(pagedModel.getPageKey()); + objectMap.put(pagedModel.getPageKey(), pagedModel.getPage(), pagedModel); + if (booleanMap == null) { + return; + } + for (Map.Entry stringBooleanEntry : booleanMap.entrySet()) { + if (!stringBooleanEntry.getValue()) { + iterator.remove(); + return; + } + } + List> entryList = new ArrayList>(); + entryList.addAll(objectMap.get(pagedModel.getPageKey()).entrySet()); + if (entryList.size() != 0) { + Collections.sort(entryList, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + try { + int i1 = Integer.parseInt(o1.getKey()); + int i2 = Integer.parseInt(o2.getKey()); + return i1 - i2; + } catch (NumberFormatException e) { + return o1.getKey().compareTo(o2.getKey()); + } + } + }); + PagedModel value = entryList.get(0).getValue(); + for (int i=1;i + * @date: 13-8-4
      + * Time: 下午8:17
      + */ +@TargetUrl("http://news.163.com/\\d+/\\d+/\\d+/\\w+*.html") +public class News163 implements PagedModel, AfterExtractor { + + @ExtractByUrl("http://news\\.163\\.com/\\d+/\\d+/\\d+/(\\w+)*\\.html") + private String pageKey; + + @ExtractByUrl(value = "http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html", notNull = false) + private String page; + + private List otherPage; + + @ExtractBy("//h1[@id=\"h1title\"]/text()") + private String title; + + @ExtractBy("//div[@id=\"epContentLeft\"]") + private String content; + + @Override + public String getPageKey() { + return pageKey; + } + + @Override + public Collection getOtherPages() { + return otherPage; + } + + @Override + public String getPage() { + if (page == null) { + return "0"; + } + return page; + } + + @Override + public PagedModel combine(PagedModel pagedModel) { + News163 news163 = new News163(); + News163 pagedModel1 = (News163) pagedModel; + news163.content = this.content + pagedModel1.content; + return news163; + } + + @Override + public String toString() { + return "News163{" + + "content='" + content + '\'' + + ", title='" + title + '\'' + + ", otherPage=" + otherPage + + '}'; + } + + public static void main(String[] args) { + OOSpider.create(Site.me().addStartUrl("http://news.163.com/13/0802/05/958I1E330001124J_2.html"), News163.class) + .clearPipeline().pipeline(new PagedPipeline()).pipeline(new ConsolePipeline()).run(); + } + + @Override + public void afterProcess(Page page) { + Selectable xpath = page.getHtml().xpath("//div[@class=\"ep-pages\"]//a/@href"); + otherPage = xpath.regex("http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html").all(); + } +} From cf9cadf44210fb033d07ba04b37bfe6e3ffe5d81 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 13:53:13 +0800 Subject: [PATCH 116/175] add core --- .../src/main/java/us/codecraft/webmagic/model/ExtractBy.java | 1 + .../src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java | 1 + .../src/main/java/us/codecraft/webmagic/model/HelpUrl.java | 1 + .../src/main/java/us/codecraft/webmagic/model/TargetUrl.java | 1 + .../src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java | 2 +- .../main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java | 2 +- .../main/java/us/codecraft/webmagic/model/samples/News163.java | 2 +- 7 files changed, 7 insertions(+), 3 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java index 4c37c9b9a..661fd6731 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java @@ -5,6 +5,7 @@ import java.lang.annotation.Target; /** + * 定义类或者字段的抽取规则。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java index 9f7767658..f443c0ee5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java @@ -5,6 +5,7 @@ import java.lang.annotation.Target; /** + * 定义类或者字段的抽取规则(从url中抽取,只支持正则表达式)。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java index 9dee05b2f..808d58aa8 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java @@ -5,6 +5,7 @@ import java.lang.annotation.Target; /** + * 定义辅助爬取的url。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java index 96ca86485..3622f55c1 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java @@ -5,6 +5,7 @@ import java.lang.annotation.Target; /** + * 定义某个类抽取的范围和来源,sourceRegion可以用xpath语法限定抽取区域。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java index 500573aac..a8345280b 100755 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java @@ -3,7 +3,7 @@ import java.util.Map; /** - * @author yihua.huang@dianping.com + * @author code4crafter@gmail.com * @date Dec 14, 2012 */ public class DoubleKeyMap extends MultiKeyMapBase { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java index e0b5c64ac..256097a7c 100755 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java @@ -1,7 +1,7 @@ package us.codecraft.webmagic.utils; /** - * @author yihua.huang@dianping.com + * @author code4crafter@gmail.com * @date Dec 14, 2012 */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index bf2693071..07b1e8e8c 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -46,7 +46,7 @@ public Collection getOtherPages() { @Override public String getPage() { if (page == null) { - return "0"; + return "1"; } return page; } From 0aadb3360a026162cf54e7cfb10f162815777de1 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 18:08:28 +0800 Subject: [PATCH 117/175] add priority to request --- .../java/us/codecraft/webmagic/Request.java | 27 ++++++++ webmagic-plugin/pom.xml | 1 + webmagic-plugin/webmagic-lucene/pom.xml | 28 ++++++++ .../webmagic/pipeline/LucenePipeline.java | 64 +++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 webmagic-plugin/webmagic-lucene/pom.xml create mode 100644 webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index 42dd079fa..1f6657cee 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -28,6 +28,8 @@ public class Request { private Object[] extra; + private double priority; + /** * 构建一个request对象 * @param url 必须参数,待抓取的url @@ -38,6 +40,15 @@ public Request(String url, Object... extra) { this.extra = extra; } + public double getPriority() { + return priority; + } + + public Request setPriority(double priority) { + this.priority = priority; + return this; + } + /** * 获取预存的对象 * @return object[] 预存的对象数组 @@ -54,4 +65,20 @@ public String getUrl() { return url; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Request request = (Request) o; + + if (!url.equals(request.url)) return false; + + return true; + } + + @Override + public int hashCode() { + return url.hashCode(); + } } diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml index 22257222c..54c69ec57 100644 --- a/webmagic-plugin/pom.xml +++ b/webmagic-plugin/pom.xml @@ -12,6 +12,7 @@ webmagic-misc webmagic-selenium + webmagic-lucene webmagic-plugin diff --git a/webmagic-plugin/webmagic-lucene/pom.xml b/webmagic-plugin/webmagic-lucene/pom.xml new file mode 100644 index 000000000..b072472dd --- /dev/null +++ b/webmagic-plugin/webmagic-lucene/pom.xml @@ -0,0 +1,28 @@ + + + + webmagic-plugin + us.codecraft + 0.1.0 + + 4.0.0 + + webmagic-lucene + + + + org.apache.lucene + lucene-analyzers-common + 4.4.0 + + + org.apache.lucene + lucene-queryparser + 4.4.0 + + + + + \ No newline at end of file diff --git a/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java b/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java new file mode 100644 index 000000000..2e7191c55 --- /dev/null +++ b/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java @@ -0,0 +1,64 @@ +package us.codecraft.webmagic.pipeline; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.util.Version; +import us.codecraft.webmagic.ResultItems; +import us.codecraft.webmagic.Task; + +import java.io.File; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-8-5
      + * Time: 下午2:11
      + */ +public class LucenePipeline implements Pipeline { + @Override + public void process(ResultItems resultItems, Task task) { + try { + + } catch (Exception e) { + + } + } + + public static void main(String[] args) throws Exception { + Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44); +// Directory directory = new RAMDirectory(); + // To store an index on disk, use this instead: + Directory directory = FSDirectory.open(new File("/data/webmagic/www.guoxue123.cn/")); + IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer); + IndexWriter iwriter = new IndexWriter(directory, config); + Document doc = new Document(); +// String text = "This is the text to be indexed."; +// doc.add(new Field("fieldname", text, TextField.TYPE_STORED)); +// iwriter.addDocument(doc); + iwriter.close(); + + // Now search the index: + DirectoryReader ireader = DirectoryReader.open(directory); + IndexSearcher isearcher = new IndexSearcher(ireader); + // Parse a simple query that searches for "text": + QueryParser parser = new QueryParser(Version.LUCENE_44, "fieldname", analyzer); + Query query = parser.parse("经典"); + ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs; + // Iterate through the results: + for (int i = 0; i < hits.length; i++) { + Document hitDoc = isearcher.doc(hits[i].doc); + System.out.println(hitDoc); + } + ireader.close(); + directory.close(); + } +} From 18f0921b39849c31c9134625e3c1ad27f773746a Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 18:17:52 +0800 Subject: [PATCH 118/175] update request --- .../java/us/codecraft/webmagic/Request.java | 34 ++++++++++++------- .../webmagic/scheduler/RedisScheduler.java | 2 +- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index 1f6657cee..9b9740d0d 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -1,5 +1,8 @@ package us.codecraft.webmagic; +import java.util.HashMap; +import java.util.Map; + /** * Request对象封装了待抓取的url信息。
      * 在PageProcessor中,Request对象可以通过{@link us.codecraft.webmagic.Page#getRequest()} 获取。
      @@ -18,26 +21,29 @@ * String linktext = (String)page.getRequest().getExtra()[0]; * } * + * * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 上午11:37 + * Date: 13-4-21 + * Time: 上午11:37 */ public class Request { private String url; - private Object[] extra; + /** + * 额外参数,可以保存一些需要的上下文信息 + */ + private Map extras = new HashMap(); private double priority; /** * 构建一个request对象 - * @param url 必须参数,待抓取的url - * @param extra 额外参数,可以保存一些需要的上下文信息 + * + * @param url 必须参数,待抓取的url */ - public Request(String url, Object... extra) { + public Request(String url) { this.url = url; - this.extra = extra; } public double getPriority() { @@ -49,16 +55,18 @@ public Request setPriority(double priority) { return this; } - /** - * 获取预存的对象 - * @return object[] 预存的对象数组 - */ - public Object[] getExtra() { - return extra; + public Object getExtra(String key) { + return extras.get(key); + } + + public Request putExtra(String key,Object value) { + extras.put(key,value); + return this; } /** * 获取待抓取的url + * * @return url 待抓取的url */ public String getUrl() { diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index 094295c80..8109ad1f2 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -33,7 +33,7 @@ public synchronized void push(Request request, Task task) { if (jedis.zrank(SET_PREFIX + task.getUUID(), request.getUrl()) == null) { //使用List保存队列 jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl()); - jedis.zadd(SET_PREFIX + task.getUUID(), System.currentTimeMillis(), request.getUrl()); + jedis.zadd(SET_PREFIX + task.getUUID(), request.getPriority(), request.getUrl()); } pool.returnResource(jedis); } From c7613f5ea9030d4a0e0c7f3fad14e6467a2e4c7c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 19:36:49 +0800 Subject: [PATCH 119/175] lazy init --- .../src/main/java/us/codecraft/webmagic/Request.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index 9b9740d0d..77db2c1ae 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -33,7 +33,7 @@ public class Request { /** * 额外参数,可以保存一些需要的上下文信息 */ - private Map extras = new HashMap(); + private Map extras; private double priority; @@ -56,10 +56,16 @@ public Request setPriority(double priority) { } public Object getExtra(String key) { + if (extras==null){ + return null; + } return extras.get(key); } public Request putExtra(String key,Object value) { + if (extras==null){ + extras = new HashMap(); + } extras.put(key,value); return this; } From ec087a3051a0f0b98f8c7a8c667ab3e683099604 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 20:45:34 +0800 Subject: [PATCH 120/175] add extractors chain --- .../codecraft/webmagic/model/ExtractBy2.java | 23 ++++ .../codecraft/webmagic/model/ExtractBy3.java | 23 ++++ .../codecraft/webmagic/model/Extractor.java | 10 +- .../webmagic/model/PageModelExtractor.java | 126 +++++++++++++----- 4 files changed, 148 insertions(+), 34 deletions(-) create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java create mode 100644 webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java new file mode 100644 index 000000000..55d5dfa85 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java @@ -0,0 +1,23 @@ +package us.codecraft.webmagic.model; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * 定义类或者字段的抽取规则。
      + * @author code4crafter@gmail.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ExtractBy2 { + + String value(); + + public enum Type {XPath2, XPath, Regex, Css} + + Type type() default Type.XPath2; + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java new file mode 100644 index 000000000..10f6a9f40 --- /dev/null +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java @@ -0,0 +1,23 @@ +package us.codecraft.webmagic.model; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * 定义类或者字段的抽取规则。
      + * @author code4crafter@gmail.com
      + * @date: 13-8-1
      + * Time: 下午8:40
      + */ +@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ExtractBy3 { + + String value(); + + public enum Type {XPath2, XPath, Regex, Css} + + Type type() default Type.XPath2; + +} diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java index 498aba996..82c7dbb6b 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java @@ -9,7 +9,7 @@ */ class Extractor { - protected final Selector selector; + protected Selector selector; protected final Source source; @@ -37,4 +37,12 @@ Source getSource() { boolean isNotNull() { return notNull; } + + boolean isMulti() { + return multi; + } + + void setSelector(Selector selector) { + this.selector = selector; + } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index 9694c4e2d..b2c2bb017 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -14,6 +14,7 @@ /** * Model主要逻辑类。将一个带注解的POJO转换为一个PageModelExtractor。
      + * * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午9:33
      @@ -46,41 +47,54 @@ private void init(Class clazz) { fieldExtractors = new ArrayList(); for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); - getAnnotationExtractBy(clazz, field); - getAnnotationExtractByRaw(clazz,field); - getAnnotationExtractByUrl(clazz, field); + FieldExtractor fieldExtractor = getAnnotationExtractBy(clazz, field); + FieldExtractor fieldExtractorTmp = getAnnotationExtractByRaw(clazz, field); + if (fieldExtractor != null && fieldExtractorTmp != null) { + throw new IllegalStateException("Only one of 'ExtractBy ExtractByRaw ExtractByUrl' can be added to a field!"); + } else if (fieldExtractor == null && fieldExtractorTmp != null) { + fieldExtractor = fieldExtractorTmp; + } + // ExtractBy2 & ExtractBy3 + addAnnotationExtractBy2(clazz, fieldExtractor); + addAnnotationExtractBy3(clazz, fieldExtractor); + fieldExtractorTmp = getAnnotationExtractByUrl(clazz, field); + if (fieldExtractor != null && fieldExtractorTmp != null) { + throw new IllegalStateException("Only one of 'ExtractBy ExtractByRaw ExtractByUrl' can be added to a field!"); + } else if (fieldExtractor == null && fieldExtractorTmp != null) { + fieldExtractor = fieldExtractorTmp; + } + if (fieldExtractor != null) { + if (!fieldExtractor.isMulti() && !String.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be string"); + } else if (fieldExtractor.isMulti() && !List.class.isAssignableFrom(field.getType())) { + throw new IllegalStateException("Field " + field.getName() + " must be list"); + } + } + } } - private void getAnnotationExtractByUrl(Class clazz, Field field) { + private FieldExtractor getAnnotationExtractByUrl(Class clazz, Field field) { + FieldExtractor fieldExtractor = null; ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class); if (extractByUrl != null) { - if (!extractByUrl.multi() && !String.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractByUrl.multi() && !List.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be list"); - } String regexPattern = extractByUrl.value(); if (regexPattern.trim().equals("")) { regexPattern = ".*"; } - FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull(), extractByUrl.multi()); + fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url, extractByUrl.notNull(), extractByUrl.multi()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); } - fieldExtractors.add(fieldExtractor); } + return fieldExtractor; } - private void getAnnotationExtractBy(Class clazz, Field field) { + private FieldExtractor getAnnotationExtractBy(Class clazz, Field field) { + FieldExtractor fieldExtractor = null; ExtractBy extractBy = field.getAnnotation(ExtractBy.class); if (extractBy != null) { - if (!extractBy.multi() && !String.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractBy.multi() && !List.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be list"); - } String value = extractBy.value(); Selector selector; switch (extractBy.type()) { @@ -99,23 +113,69 @@ private void getAnnotationExtractBy(Class clazz, Field field) { default: selector = new Xpath2Selector(value); } - FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull(), extractBy.multi()); + fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull(), extractBy.multi()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); } - fieldExtractors.add(fieldExtractor); + } + return fieldExtractor; + } + + private void addAnnotationExtractBy2(Class clazz, FieldExtractor fieldExtractor) { + ExtractBy2 extractBy = fieldExtractor.getField().getAnnotation(ExtractBy2.class); + if (extractBy != null) { + String value = extractBy.value(); + Selector selector; + switch (extractBy.type()) { + case Css: + selector = new CssSelector(value); + break; + case Regex: + selector = new RegexSelector(value); + break; + case XPath: + selector = new XpathSelector(value); + break; + case XPath2: + selector = new Xpath2Selector(value); + break; + default: + selector = new Xpath2Selector(value); + } + fieldExtractor.setSelector(new AndSelector(fieldExtractor.getSelector(), selector)); + } + } + + private void addAnnotationExtractBy3(Class clazz, FieldExtractor fieldExtractor) { + ExtractBy3 extractBy = fieldExtractor.getField().getAnnotation(ExtractBy3.class); + if (extractBy != null) { + String value = extractBy.value(); + Selector selector; + switch (extractBy.type()) { + case Css: + selector = new CssSelector(value); + break; + case Regex: + selector = new RegexSelector(value); + break; + case XPath: + selector = new XpathSelector(value); + break; + case XPath2: + selector = new Xpath2Selector(value); + break; + default: + selector = new Xpath2Selector(value); + } + fieldExtractor.setSelector(new AndSelector(fieldExtractor.getSelector(), selector)); } } - private void getAnnotationExtractByRaw(Class clazz, Field field) { + private FieldExtractor getAnnotationExtractByRaw(Class clazz, Field field) { + FieldExtractor fieldExtractor = null; ExtractByRaw extractByRaw = field.getAnnotation(ExtractByRaw.class); if (extractByRaw != null) { - if (!extractByRaw.multi() && !String.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be string"); - } else if (extractByRaw.multi() && !List.class.isAssignableFrom(field.getType())) { - throw new IllegalStateException("Field " + field.getName() + " must be list"); - } String value = extractByRaw.value(); Selector selector; switch (extractByRaw.type()) { @@ -134,13 +194,13 @@ private void getAnnotationExtractByRaw(Class clazz, Field field) { default: selector = new Xpath2Selector(value); } - FieldExtractor fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.RawHtml, extractByRaw.notNull(), extractByRaw.multi()); + fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.RawHtml, extractByRaw.notNull(), extractByRaw.multi()); Method setterMethod = getSetterMethod(clazz, field); if (setterMethod != null) { fieldExtractor.setSetterMethod(setterMethod); } - fieldExtractors.add(fieldExtractor); } + return fieldExtractor; } public static Method getSetterMethod(Class clazz, Field field) { @@ -197,19 +257,19 @@ public Object process(Page page) { return null; } if (extractor == null) { - return processSingle(page,page.getHtml().toString()); + return processSingle(page, page.getHtml().toString()); } else { - if (extractor.multi){ + if (extractor.multi) { List os = new ArrayList(); List list = extractor.getSelector().selectList(page.getHtml().toString()); for (String s : list) { Object o = processSingle(page, s); - if (o!=null){ + if (o != null) { os.add(o); } } return os; - }else { + } else { String select = extractor.getSelector().select(page.getHtml().toString()); Object o = processSingle(page, select); return o; @@ -217,12 +277,12 @@ public Object process(Page page) { } } - private Object processSingle(Page page,String html) { + private Object processSingle(Page page, String html) { Object o = null; try { o = clazz.newInstance(); for (FieldExtractor fieldExtractor : fieldExtractors) { - if (fieldExtractor.multi) { + if (fieldExtractor.isMulti()) { List value; switch (fieldExtractor.getSource()) { case RawHtml: From 7acccd6c1527ef29633944fa9c3a2e4674caf556 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 21:03:47 +0800 Subject: [PATCH 121/175] fix pagedmodel bug --- .../webmagic/model/PageModelExtractor.java | 12 +++++++----- .../codecraft/webmagic/pipeline/PagedPipeline.java | 11 +++++++---- .../codecraft/webmagic/model/samples/News163.java | 14 +++++--------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index b2c2bb017..0207b7ace 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -55,8 +55,10 @@ private void init(Class clazz) { fieldExtractor = fieldExtractorTmp; } // ExtractBy2 & ExtractBy3 - addAnnotationExtractBy2(clazz, fieldExtractor); - addAnnotationExtractBy3(clazz, fieldExtractor); + if (fieldExtractor!=null){ + addAnnotationExtractBy2(fieldExtractor); + addAnnotationExtractBy3(fieldExtractor); + } fieldExtractorTmp = getAnnotationExtractByUrl(clazz, field); if (fieldExtractor != null && fieldExtractorTmp != null) { throw new IllegalStateException("Only one of 'ExtractBy ExtractByRaw ExtractByUrl' can be added to a field!"); @@ -69,8 +71,8 @@ private void init(Class clazz) { } else if (fieldExtractor.isMulti() && !List.class.isAssignableFrom(field.getType())) { throw new IllegalStateException("Field " + field.getName() + " must be list"); } + fieldExtractors.add(fieldExtractor); } - } } @@ -122,7 +124,7 @@ private FieldExtractor getAnnotationExtractBy(Class clazz, Field field) { return fieldExtractor; } - private void addAnnotationExtractBy2(Class clazz, FieldExtractor fieldExtractor) { + private void addAnnotationExtractBy2(FieldExtractor fieldExtractor) { ExtractBy2 extractBy = fieldExtractor.getField().getAnnotation(ExtractBy2.class); if (extractBy != null) { String value = extractBy.value(); @@ -147,7 +149,7 @@ private void addAnnotationExtractBy2(Class clazz, FieldExtractor fieldExtractor) } } - private void addAnnotationExtractBy3(Class clazz, FieldExtractor fieldExtractor) { + private void addAnnotationExtractBy3(FieldExtractor fieldExtractor) { ExtractBy3 extractBy = fieldExtractor.getField().getAnnotation(ExtractBy3.class); if (extractBy != null) { String value = extractBy.value(); diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java index cc71e5c67..282545f1f 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java @@ -33,10 +33,13 @@ private void handleObject(Iterator> iterator) { Object o = objectEntry.getValue(); if (o instanceof PagedModel) { PagedModel pagedModel = (PagedModel) o; - for (String otherPage : pagedModel.getOtherPages()) { - Boolean aBoolean = pageMap.get(pagedModel.getPageKey(), otherPage); - if (aBoolean == null) { - pageMap.put(pagedModel.getPageKey(), otherPage, Boolean.FALSE); + pageMap.put(pagedModel.getPageKey(), pagedModel.getPage(), Boolean.TRUE); + if (pagedModel.getOtherPages()!=null){ + for (String otherPage : pagedModel.getOtherPages()) { + Boolean aBoolean = pageMap.get(pagedModel.getPageKey(), otherPage); + if (aBoolean == null) { + pageMap.put(pagedModel.getPageKey(), otherPage, Boolean.FALSE); + } } } //check if all pages are processed diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index 07b1e8e8c..52abe887d 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -1,12 +1,10 @@ package us.codecraft.webmagic.model.samples; -import us.codecraft.webmagic.Page; import us.codecraft.webmagic.PagedModel; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.model.*; import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.PagedPipeline; -import us.codecraft.webmagic.selector.Selectable; import java.util.Collection; import java.util.List; @@ -17,14 +15,16 @@ * Time: 下午8:17
      */ @TargetUrl("http://news.163.com/\\d+/\\d+/\\d+/\\w+*.html") -public class News163 implements PagedModel, AfterExtractor { +public class News163 implements PagedModel { - @ExtractByUrl("http://news\\.163\\.com/\\d+/\\d+/\\d+/(\\w+)*\\.html") + @ExtractByUrl("http://news\\.163\\.com/\\d+/\\d+/\\d+/([^_]*).*\\.html") private String pageKey; @ExtractByUrl(value = "http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html", notNull = false) private String page; + @ExtractBy(value = "//div[@class=\"ep-pages\"]//a/@href", multi = true) + @ExtractBy2(value = "http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html", type = ExtractBy2.Type.Regex) private List otherPage; @ExtractBy("//h1[@id=\"h1title\"]/text()") @@ -54,6 +54,7 @@ public String getPage() { @Override public PagedModel combine(PagedModel pagedModel) { News163 news163 = new News163(); + news163.title = this.title; News163 pagedModel1 = (News163) pagedModel; news163.content = this.content + pagedModel1.content; return news163; @@ -73,9 +74,4 @@ public static void main(String[] args) { .clearPipeline().pipeline(new PagedPipeline()).pipeline(new ConsolePipeline()).run(); } - @Override - public void afterProcess(Page page) { - Selectable xpath = page.getHtml().xpath("//div[@class=\"ep-pages\"]//a/@href"); - otherPage = xpath.regex("http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html").all(); - } } From 885e13cffc0e9000c6751567169dcad1aadf5bdb Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 21:44:29 +0800 Subject: [PATCH 122/175] complete redis support --- .../java/us/codecraft/webmagic/Request.java | 19 +++++++---- webmagic-plugin/webmagic-misc/pom.xml | 5 +++ .../webmagic/scheduler/HessianSerializer.java | 33 +++++++++++++++++++ .../webmagic/scheduler/RedisScheduler.java | 24 +++++++++++++- 4 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index 77db2c1ae..6cf344fd0 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; @@ -26,7 +27,9 @@ * Date: 13-4-21 * Time: 上午11:37 */ -public class Request { +public class Request implements Serializable { + + private static final long serialVersionUID = 2062192774891352043L; private String url; @@ -40,7 +43,7 @@ public class Request { /** * 构建一个request对象 * - * @param url 必须参数,待抓取的url + * @param url 必须参数,待抓取的url */ public Request(String url) { this.url = url; @@ -56,17 +59,17 @@ public Request setPriority(double priority) { } public Object getExtra(String key) { - if (extras==null){ + if (extras == null) { return null; } return extras.get(key); } - public Request putExtra(String key,Object value) { - if (extras==null){ + public Request putExtra(String key, Object value) { + if (extras == null) { extras = new HashMap(); } - extras.put(key,value); + extras.put(key, value); return this; } @@ -91,6 +94,10 @@ public boolean equals(Object o) { return true; } + public Map getExtras() { + return extras; + } + @Override public int hashCode() { return url.hashCode(); diff --git a/webmagic-plugin/webmagic-misc/pom.xml b/webmagic-plugin/webmagic-misc/pom.xml index c54561596..4d8776c83 100644 --- a/webmagic-plugin/webmagic-misc/pom.xml +++ b/webmagic-plugin/webmagic-misc/pom.xml @@ -17,6 +17,11 @@ freemarker 2.3.15 + + org.resthub + hessian + 4.0.8 + redis.clients jedis diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java new file mode 100644 index 000000000..68cb5bbd2 --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java @@ -0,0 +1,33 @@ +package us.codecraft.webmagic.scheduler; + +import com.caucho.hessian.io.Hessian2Input; +import com.caucho.hessian.io.Hessian2Output; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * @author yihua.huang@dianping.com
      + * @date: 13-7-14
      + * Time: 下午9:20
      + */ +public enum HessianSerializer { + INSTANCE; + public byte[] serialize(T v) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Hessian2Output hessian2Output = new Hessian2Output(baos); + hessian2Output.writeObject(v); + hessian2Output.close(); + return baos.toByteArray(); + } + + @SuppressWarnings("unchecked") + public T deSerialize(byte[] bytes) throws IOException { + ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + Hessian2Input hessian2Input = new Hessian2Input(bais); + T t = (T) hessian2Input.readObject(); + hessian2Input.close(); + return t; + } +} diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index 8109ad1f2..c00c12f20 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.scheduler; +import org.apache.commons.codec.digest.DigestUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @@ -7,6 +8,8 @@ import us.codecraft.webmagic.Task; import us.codecraft.webmagic.schedular.Scheduler; +import java.io.IOException; + /** * 使用redis管理url,构建一个分布式的爬虫。
      * @@ -22,6 +25,8 @@ public class RedisScheduler implements Scheduler { private static final String SET_PREFIX = "set_"; + private static final String ITEM_PREFIX = "item_"; + public RedisScheduler(String host) { pool = new JedisPool(new JedisPoolConfig(), host); } @@ -34,6 +39,15 @@ public synchronized void push(Request request, Task task) { //使用List保存队列 jedis.rpush(QUEUE_PREFIX + task.getUUID(), request.getUrl()); jedis.zadd(SET_PREFIX + task.getUUID(), request.getPriority(), request.getUrl()); + if (request.getExtras() != null) { + String key = ITEM_PREFIX + DigestUtils.shaHex(request.getUrl()); + try { + byte[] serialize = HessianSerializer.INSTANCE.serialize(request); + jedis.set(key.getBytes(), serialize); + } catch (IOException e) { + e.printStackTrace(); + } + } } pool.returnResource(jedis); } @@ -42,8 +56,16 @@ public synchronized void push(Request request, Task task) { public synchronized Request poll(Task task) { Jedis jedis = pool.getResource(); String url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); + String key = ITEM_PREFIX + DigestUtils.shaHex(url); + byte[] bytes = jedis.get(key.getBytes()); + try { + Object o = HessianSerializer.INSTANCE.deSerialize(bytes); + return (Request)o; + } catch (Exception e) { + e.printStackTrace(); + } pool.returnResource(jedis); - if (url==null){ + if (url == null) { return null; } return new Request(url); From 314d52e01e0bf45457f71b35ca4a03de981c0352 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Mon, 5 Aug 2013 22:06:39 +0800 Subject: [PATCH 123/175] fix nullpointer exception --- .../webmagic/model/ModelPageProcessor.java | 4 ++-- .../webmagic/scheduler/RedisScheduler.java | 18 ++++++++++-------- .../webmagic/model/samples/News163.java | 3 ++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java index 12e85d070..84563ce95 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java @@ -51,14 +51,14 @@ private ModelPageProcessor(Site site) { @Override public void process(Page page) { for (PageModelExtractor pageModelExtractor : pageModelExtractorList) { + extractLinks(page, pageModelExtractor.getHelpUrlRegionSelector(), pageModelExtractor.getHelpUrlPatterns()); + extractLinks(page, pageModelExtractor.getTargetUrlRegionSelector(), pageModelExtractor.getTargetUrlPatterns()); Object process = pageModelExtractor.process(page); if (process == null || (process instanceof List && ((List) process).size() == 0)) { page.getResultItems().setSkip(true); } postProcessPageModel(pageModelExtractor.getClazz(), process); page.putField(pageModelExtractor.getClazz().getCanonicalName(), process); - extractLinks(page, pageModelExtractor.getHelpUrlRegionSelector(), pageModelExtractor.getHelpUrlPatterns()); - extractLinks(page, pageModelExtractor.getTargetUrlRegionSelector(), pageModelExtractor.getTargetUrlPatterns()); } } diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index c00c12f20..fb82a69e8 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -56,18 +56,20 @@ public synchronized void push(Request request, Task task) { public synchronized Request poll(Task task) { Jedis jedis = pool.getResource(); String url = jedis.lpop(QUEUE_PREFIX + task.getUUID()); + if (url == null) { + return null; + } String key = ITEM_PREFIX + DigestUtils.shaHex(url); byte[] bytes = jedis.get(key.getBytes()); - try { - Object o = HessianSerializer.INSTANCE.deSerialize(bytes); - return (Request)o; - } catch (Exception e) { - e.printStackTrace(); + if (bytes!=null){ + try { + Object o = HessianSerializer.INSTANCE.deSerialize(bytes); + return (Request)o; + } catch (Exception e) { + e.printStackTrace(); + } } pool.returnResource(jedis); - if (url == null) { - return null; - } return new Request(url); } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index 52abe887d..2aa90733f 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -5,6 +5,7 @@ import us.codecraft.webmagic.model.*; import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.PagedPipeline; +import us.codecraft.webmagic.scheduler.RedisScheduler; import java.util.Collection; import java.util.List; @@ -71,7 +72,7 @@ public String toString() { public static void main(String[] args) { OOSpider.create(Site.me().addStartUrl("http://news.163.com/13/0802/05/958I1E330001124J_2.html"), News163.class) - .clearPipeline().pipeline(new PagedPipeline()).pipeline(new ConsolePipeline()).run(); + .scheduler(new RedisScheduler("localhost")).clearPipeline().pipeline(new PagedPipeline()).pipeline(new ConsolePipeline()).run(); } } From d28b934c7c4c98029166d7c27be1585e4fc9961b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 20:41:35 +0800 Subject: [PATCH 124/175] move model package to plugin --- .../src/main/java/us/codecraft/webmagic/model/AfterExtractor.java | 0 .../us/codecraft/webmagic/model/ConsolePageModelPipeline.java | 0 .../src/main/java/us/codecraft/webmagic/model/ExtractBy.java | 0 .../src/main/java/us/codecraft/webmagic/model/ExtractBy2.java | 0 .../src/main/java/us/codecraft/webmagic/model/ExtractBy3.java | 0 .../src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java | 0 .../src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java | 0 .../src/main/java/us/codecraft/webmagic/model/Extractor.java | 0 .../src/main/java/us/codecraft/webmagic/model/FieldExtractor.java | 0 .../src/main/java/us/codecraft/webmagic/model/HelpUrl.java | 0 .../main/java/us/codecraft/webmagic/model/ModelPageProcessor.java | 0 .../src/main/java/us/codecraft/webmagic/model/ModelPipeline.java | 0 .../src/main/java/us/codecraft/webmagic/model/OOSpider.java | 0 .../main/java/us/codecraft/webmagic/model/PageModelExtractor.java | 0 .../main/java/us/codecraft/webmagic/model/PageModelPipeline.java | 0 .../src/main/java/us/codecraft/webmagic/model/TargetUrl.java | 0 .../src/main/java/us/codecraft/webmagic/model/package.html | 0 .../src/main/java/us/codecraft/webmagic/model/samples/Blog.java | 0 .../main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java | 0 .../main/java/us/codecraft/webmagic/model/samples/News163.java | 0 .../java/us/codecraft/webmagic/model/samples/OschinaAnswer.java | 0 .../java/us/codecraft/webmagic/model/samples/OschinaBlog.java | 0 .../src/test/java/us/codecraft/webmagic/model/OschinaBlog.java | 0 .../src/test/java/us/codecraft/webmagic/model/TestFetcher.java | 0 24 files changed, 0 insertions(+), 0 deletions(-) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ExtractBy.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/Extractor.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/HelpUrl.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/OOSpider.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/TargetUrl.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/package.html (100%) rename {webmagic-samples => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/samples/Blog.java (100%) rename {webmagic-samples => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java (100%) rename {webmagic-samples => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/samples/News163.java (100%) rename {webmagic-samples => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java (100%) rename {webmagic-samples => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/test/java/us/codecraft/webmagic/model/TestFetcher.java (100%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/Extractor.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/Extractor.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/Extractor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/HelpUrl.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/HelpUrl.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/HelpUrl.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/OOSpider.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/OOSpider.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/OOSpider.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/TargetUrl.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/TargetUrl.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/TargetUrl.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/package.html similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/model/package.html rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/package.html diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/Blog.java similarity index 100% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/Blog.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java similarity index 100% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/News163.java similarity index 100% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/News163.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java similarity index 100% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java similarity index 100% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java similarity index 100% rename from webmagic-core/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java rename to webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/model/TestFetcher.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/TestFetcher.java similarity index 100% rename from webmagic-core/src/test/java/us/codecraft/webmagic/model/TestFetcher.java rename to webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/TestFetcher.java From 85db722acb4815ed0e44ee438766a94bc4877548 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 21:23:29 +0800 Subject: [PATCH 125/175] update package --- .../src/main/java/us/codecraft/webmagic/model/samples/Blog.java | 0 .../main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java | 0 .../main/java/us/codecraft/webmagic/model/samples/News163.java | 0 .../java/us/codecraft/webmagic/model/samples/OschinaAnswer.java | 0 .../java/us/codecraft/webmagic/model/samples/OschinaBlog.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {webmagic-plugin/webmagic-misc => webmagic-samples}/src/main/java/us/codecraft/webmagic/model/samples/Blog.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-samples}/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-samples}/src/main/java/us/codecraft/webmagic/model/samples/News163.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-samples}/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-samples}/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java (100%) diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/Blog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/Blog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/News163.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java From f2f9d2720f175a764df62aacea79adb6bb2a946f Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 21:26:03 +0800 Subject: [PATCH 126/175] change freemarker dep to samples --- webmagic-plugin/webmagic-misc/pom.xml | 5 ---- .../src/main/resources/ftl/wordpress.ftl | 23 ------------------- .../webmagic/FreemarkerPipelineTest.java | 19 --------------- webmagic-samples/pom.xml | 5 ++++ .../webmagic/pipeline/FreemarkerPipeline.java | 0 5 files changed, 5 insertions(+), 47 deletions(-) delete mode 100644 webmagic-plugin/webmagic-misc/src/main/resources/ftl/wordpress.ftl delete mode 100644 webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java rename {webmagic-plugin/webmagic-misc => webmagic-samples}/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java (100%) diff --git a/webmagic-plugin/webmagic-misc/pom.xml b/webmagic-plugin/webmagic-misc/pom.xml index 4d8776c83..98b7c77aa 100644 --- a/webmagic-plugin/webmagic-misc/pom.xml +++ b/webmagic-plugin/webmagic-misc/pom.xml @@ -12,11 +12,6 @@ webmagic-misc - - org.freemarker - freemarker - 2.3.15 - org.resthub hessian diff --git a/webmagic-plugin/webmagic-misc/src/main/resources/ftl/wordpress.ftl b/webmagic-plugin/webmagic-misc/src/main/resources/ftl/wordpress.ftl deleted file mode 100644 index 61820b727..000000000 --- a/webmagic-plugin/webmagic-misc/src/main/resources/ftl/wordpress.ftl +++ /dev/null @@ -1,23 +0,0 @@ - - $it.Title - http://127.0.0.1/wordpress/?p=$it.Id - ${date} - admin - http://127.0.0.1/wordpress/?p=$it.Id - - - - <#--$it.Id--> - ${date} - ${date} - open - open - ${title} - publish - 0 - 0 - post - - 0 - $tags - \ No newline at end of file diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java deleted file mode 100644 index 8ceb99fed..000000000 --- a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/FreemarkerPipelineTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package us.codecraft.webmagic; - -import org.junit.Test; -import us.codecraft.webmagic.pipeline.FreemarkerPipeline; - -import java.io.IOException; - -/** - * @author code4crafter@gmail.com
      - * Date: 13-6-9 - * Time: 上午7:14 - */ -public class FreemarkerPipelineTest { - - @Test - public void testTemplateLoad() throws IOException { - new FreemarkerPipeline("wordpress.ftl"); - } -} diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index 8a7e00ce0..a38e872de 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -27,6 +27,11 @@ webmagic-selenium ${project.version}
      + + org.freemarker + freemarker + 2.3.15 + junit junit diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java From 94ce0b7eeef16f66fb0562e15d8311fd202d4c27 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 21:47:44 +0800 Subject: [PATCH 127/175] update lucene pipeline --- .../java/us/codecraft/webmagic/Spider.java | 6 +- .../webmagic/pipeline/ConsolePipeline.java | 3 - .../webmagic/pipeline/FilePipeline.java | 3 - .../webmagic/pipeline/LucenePipeline.java | 75 +++++++++++++------ .../webmagic/model/ModelPipeline.java | 3 - .../webmagic/pipeline/FreemarkerPipeline.java | 3 - 6 files changed, 56 insertions(+), 37 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 414315c25..878c63e38 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -228,8 +228,10 @@ private void processRequest(Request request) { } pageProcessor.process(page); addRequest(page); - for (Pipeline pipeline : pipelines) { - pipeline.process(page.getResultItems(), this); + if (!page.getResultItems().isSkip()){ + for (Pipeline pipeline : pipelines) { + pipeline.process(page.getResultItems(), this); + } } sleep(site.getSleepTime()); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 8f294745a..2ff99c870 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -15,9 +15,6 @@ public class ConsolePipeline implements Pipeline{ @Override public void process(ResultItems resultItems,Task task) { - if (resultItems.isSkip()){ - return; - } System.out.println("get page: "+resultItems.getRequest().getUrl()); for (Map.Entry entry : resultItems.getAll().entrySet()) { if (entry.getValue() instanceof Iterable) { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 01f8d8b82..39248d243 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -47,9 +47,6 @@ public void process(ResultItems resultItems, Task task) { if (!file.exists()) { file.mkdirs(); } - if (resultItems.isSkip()) { - return; - } try { PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()) + ".html")); printWriter.println("url:\t" + resultItems.getRequest().getUrl()); diff --git a/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java b/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java index 2e7191c55..aca6501fa 100644 --- a/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java +++ b/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java @@ -3,20 +3,26 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.store.Directory; -import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; -import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * @author yihua.huang@dianping.com
      @@ -24,41 +30,64 @@ * Time: 下午2:11
      */ public class LucenePipeline implements Pipeline { - @Override - public void process(ResultItems resultItems, Task task) { - try { - } catch (Exception e) { + private Directory directory; - } - } + private IndexWriter indexWriter; + + private Analyzer analyzer; - public static void main(String[] args) throws Exception { - Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44); -// Directory directory = new RAMDirectory(); - // To store an index on disk, use this instead: - Directory directory = FSDirectory.open(new File("/data/webmagic/www.guoxue123.cn/")); + private void init() throws IOException { + analyzer = new StandardAnalyzer(Version.LUCENE_44); + directory = new RAMDirectory(); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer); - IndexWriter iwriter = new IndexWriter(directory, config); - Document doc = new Document(); -// String text = "This is the text to be indexed."; -// doc.add(new Field("fieldname", text, TextField.TYPE_STORED)); -// iwriter.addDocument(doc); - iwriter.close(); + indexWriter = new IndexWriter(directory, config); + indexWriter.close(); + } + + public LucenePipeline() { + try { + init(); + } catch (IOException e) { + e.printStackTrace(); + } + } - // Now search the index: + public List search(String fieldName, String value) throws IOException, ParseException { + List documents = new ArrayList(); DirectoryReader ireader = DirectoryReader.open(directory); IndexSearcher isearcher = new IndexSearcher(ireader); // Parse a simple query that searches for "text": - QueryParser parser = new QueryParser(Version.LUCENE_44, "fieldname", analyzer); - Query query = parser.parse("经典"); + QueryParser parser = new QueryParser(Version.LUCENE_44, fieldName, analyzer); + Query query = parser.parse(value); ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs; // Iterate through the results: for (int i = 0; i < hits.length; i++) { Document hitDoc = isearcher.doc(hits[i].doc); - System.out.println(hitDoc); + documents.add(hitDoc); } ireader.close(); directory.close(); + return documents; + } + + @Override + public void process(ResultItems resultItems, Task task) { + if (resultItems.isSkip()){ + return; + } + Document doc = new Document(); + Map all = resultItems.getAll(); + if (all==null){ + return; + } + for (Map.Entry objectEntry : all.entrySet()) { + doc.add(new Field(objectEntry.getKey(), objectEntry.getValue().toString(), TextField.TYPE_STORED)); + } + try { + indexWriter.addDocument(doc); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java index f9b0015aa..c9f67dce1 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java @@ -29,9 +29,6 @@ public ModelPipeline put(Class clazz, PageModelPipeline pageModelPipeline) { @Override public void process(ResultItems resultItems, Task task) { - if (resultItems.isSkip()) { - return; - } for (Map.Entry classPageModelPipelineEntry : pageModelPipelines.entrySet()) { Object o = resultItems.get(classPageModelPipelineEntry.getKey().getCanonicalName()); if (o != null) { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java index 9a045eff0..37420628f 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java @@ -40,9 +40,6 @@ public FreemarkerPipeline(String template) throws IOException { @Override public void process(ResultItems resultItems, Task task) { - if (resultItems.isSkip()) { - return; - } String path = this.path + "" + task.getUUID() + "/"; File file = new File(path); if (!file.exists()) { From e83ca3627dcca83c052e866624adfb8f5faf6cae Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 22:12:52 +0800 Subject: [PATCH 128/175] update email --- .../java/us/codecraft/webmagic/pipeline/LucenePipeline.java | 2 +- .../src/main/java/us/codecraft/webmagic/PagedModel.java | 2 +- .../main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java | 2 +- .../java/us/codecraft/webmagic/scheduler/HessianSerializer.java | 2 +- .../main/java/us/codecraft/webmagic/model/samples/News163.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java b/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java index aca6501fa..4c048efb2 100644 --- a/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java +++ b/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java @@ -25,7 +25,7 @@ import java.util.Map; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-5
      * Time: 下午2:11
      */ diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java index f18426a78..95e1a8338 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java @@ -3,7 +3,7 @@ import java.util.Collection; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-4
      * Time: 下午5:18
      */ diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java index 282545f1f..b692da271 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java @@ -9,7 +9,7 @@ import java.util.concurrent.ConcurrentHashMap; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-4
      * Time: 下午5:15
      */ diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java index 68cb5bbd2..c137bfb38 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java @@ -8,7 +8,7 @@ import java.io.IOException; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-7-14
      * Time: 下午9:20
      */ diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index 2aa90733f..83f8388bd 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -11,7 +11,7 @@ import java.util.List; /** - * @author yihua.huang@dianping.com
      + * @author code4crafter@gmail.com
      * @date: 13-8-4
      * Time: 下午8:17
      */ From fa9968218946d9ebd3365183b1d11ea65eea0590 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 22:25:27 +0800 Subject: [PATCH 129/175] change serilizer to fastjson --- webmagic-plugin/webmagic-misc/pom.xml | 6 +- .../webmagic/pipeline/JsonFilePipeline.java | 58 +++++++++++++++++++ .../webmagic/scheduler/HessianSerializer.java | 33 ----------- .../webmagic/scheduler/RedisScheduler.java | 21 ++----- 4 files changed, 67 insertions(+), 51 deletions(-) create mode 100644 webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java delete mode 100644 webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java diff --git a/webmagic-plugin/webmagic-misc/pom.xml b/webmagic-plugin/webmagic-misc/pom.xml index 98b7c77aa..5e241731a 100644 --- a/webmagic-plugin/webmagic-misc/pom.xml +++ b/webmagic-plugin/webmagic-misc/pom.xml @@ -13,9 +13,9 @@ - org.resthub - hessian - 4.0.8 + com.alibaba + fastjson + 1.1.35 redis.clients diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java new file mode 100644 index 000000000..1500409d9 --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java @@ -0,0 +1,58 @@ +package us.codecraft.webmagic.pipeline; + +import com.alibaba.fastjson.JSON; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.log4j.Logger; +import us.codecraft.webmagic.ResultItems; +import us.codecraft.webmagic.Task; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * 持久化到文件的接口。 + * + * @author code4crafter@gmail.com
      + * Date: 13-4-21 + * Time: 下午6:28 + */ +public class JsonFilePipeline implements Pipeline { + + private String path = "/data/temp/webmagic/"; + + private Logger logger = Logger.getLogger(getClass()); + + /** + * 新建一个FilePipeline,使用默认保存路径"/data/temp/webmagic/" + */ + public JsonFilePipeline() { + + } + + /** + * 新建一个FilePipeline + * + * @param path 文件保存路径 + */ + public JsonFilePipeline(String path) { + this.path = path; + } + + @Override + public void process(ResultItems resultItems, Task task) { + String path = this.path + "/" + task.getUUID() + "/"; + File file = new File(path); + if (!file.exists()) { + file.mkdirs(); + } + try { + PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()) + ".json")); + printWriter.write(JSON.toJSONString(resultItems.getAll())); + printWriter.close(); + } catch (IOException e) { + logger.warn("write file error", e); + } + } +} diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java deleted file mode 100644 index c137bfb38..000000000 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/HessianSerializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package us.codecraft.webmagic.scheduler; - -import com.caucho.hessian.io.Hessian2Input; -import com.caucho.hessian.io.Hessian2Output; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-7-14
      - * Time: 下午9:20
      - */ -public enum HessianSerializer { - INSTANCE; - public byte[] serialize(T v) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Hessian2Output hessian2Output = new Hessian2Output(baos); - hessian2Output.writeObject(v); - hessian2Output.close(); - return baos.toByteArray(); - } - - @SuppressWarnings("unchecked") - public T deSerialize(byte[] bytes) throws IOException { - ByteArrayInputStream bais = new ByteArrayInputStream(bytes); - Hessian2Input hessian2Input = new Hessian2Input(bais); - T t = (T) hessian2Input.readObject(); - hessian2Input.close(); - return t; - } -} diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index fb82a69e8..8233698da 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -1,5 +1,6 @@ package us.codecraft.webmagic.scheduler; +import com.alibaba.fastjson.JSON; import org.apache.commons.codec.digest.DigestUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; @@ -8,8 +9,6 @@ import us.codecraft.webmagic.Task; import us.codecraft.webmagic.schedular.Scheduler; -import java.io.IOException; - /** * 使用redis管理url,构建一个分布式的爬虫。
      * @@ -41,12 +40,8 @@ public synchronized void push(Request request, Task task) { jedis.zadd(SET_PREFIX + task.getUUID(), request.getPriority(), request.getUrl()); if (request.getExtras() != null) { String key = ITEM_PREFIX + DigestUtils.shaHex(request.getUrl()); - try { - byte[] serialize = HessianSerializer.INSTANCE.serialize(request); - jedis.set(key.getBytes(), serialize); - } catch (IOException e) { - e.printStackTrace(); - } + byte[] serialize = JSON.toJSONBytes(request); + jedis.set(key.getBytes(), serialize); } } pool.returnResource(jedis); @@ -61,13 +56,9 @@ public synchronized Request poll(Task task) { } String key = ITEM_PREFIX + DigestUtils.shaHex(url); byte[] bytes = jedis.get(key.getBytes()); - if (bytes!=null){ - try { - Object o = HessianSerializer.INSTANCE.deSerialize(bytes); - return (Request)o; - } catch (Exception e) { - e.printStackTrace(); - } + if (bytes != null) { + Object o = JSON.parse(bytes); + return (Request) o; } pool.returnResource(jedis); return new Request(url); From eb24fc24ae957c0f2449b44b8ef648c799170352 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 22:26:39 +0800 Subject: [PATCH 130/175] change file dir --- .../java/us/codecraft/webmagic/pipeline/FilePipeline.java | 4 ++-- .../java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 39248d243..72ae1aa12 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -20,12 +20,12 @@ */ public class FilePipeline implements Pipeline { - private String path = "/data/temp/webmagic/"; + private String path = "/data/webmagic/"; private Logger logger = Logger.getLogger(getClass()); /** - * 新建一个FilePipeline,使用默认保存路径"/data/temp/webmagic/" + * 新建一个FilePipeline,使用默认保存路径"/data/webmagic/" */ public FilePipeline() { diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java index 1500409d9..08f3e87b7 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java @@ -20,12 +20,12 @@ */ public class JsonFilePipeline implements Pipeline { - private String path = "/data/temp/webmagic/"; + private String path = "/data/webmagic/"; private Logger logger = Logger.getLogger(getClass()); /** - * 新建一个FilePipeline,使用默认保存路径"/data/temp/webmagic/" + * 新建一个FilePipeline,使用默认保存路径"/data/webmagic/" */ public JsonFilePipeline() { From 64ab86b7a021e270b3851ef4bfc9e21a529b5bfe Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 22:36:37 +0800 Subject: [PATCH 131/175] json fix --- .../src/main/java/us/codecraft/webmagic/Request.java | 11 +++++++++++ .../codecraft/webmagic/scheduler/RedisScheduler.java | 8 ++++---- .../webmagic/scheduler/RedisSchedulerTest.java | 6 ++++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java index 6cf344fd0..905dbe591 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java @@ -40,6 +40,9 @@ public class Request implements Serializable { private double priority; + public Request() { + } + /** * 构建一个request对象 * @@ -102,4 +105,12 @@ public Map getExtras() { public int hashCode() { return url.hashCode(); } + + public void setExtras(Map extras) { + this.extras = extras; + } + + public void setUrl(String url) { + this.url = url; + } } diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index 8233698da..c9992db8d 100644 --- a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -40,8 +40,8 @@ public synchronized void push(Request request, Task task) { jedis.zadd(SET_PREFIX + task.getUUID(), request.getPriority(), request.getUrl()); if (request.getExtras() != null) { String key = ITEM_PREFIX + DigestUtils.shaHex(request.getUrl()); - byte[] serialize = JSON.toJSONBytes(request); - jedis.set(key.getBytes(), serialize); + byte[] bytes = JSON.toJSONString(request).getBytes(); + jedis.set(key.getBytes(), bytes); } } pool.returnResource(jedis); @@ -57,8 +57,8 @@ public synchronized Request poll(Task task) { String key = ITEM_PREFIX + DigestUtils.shaHex(url); byte[] bytes = jedis.get(key.getBytes()); if (bytes != null) { - Object o = JSON.parse(bytes); - return (Request) o; + Request o = JSON.parseObject(new String(bytes),Request.class); + return o; } pool.returnResource(jedis); return new Request(url); diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java index 3d596710b..144dba5ae 100644 --- a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java +++ b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java @@ -1,7 +1,6 @@ package us.codecraft.webmagic.scheduler; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Site; @@ -35,8 +34,11 @@ public Site getSite() { return null; } }; - redisScheduler.push(new Request("http://www.ibm.com/developerworks/cn/java/j-javadev2-22/"), task); + Request request = new Request("http://www.ibm.com/developerworks/cn/java/j-javadev2-22/"); + request.putExtra("1","2"); + redisScheduler.push(request, task); Request poll = redisScheduler.poll(task); + System.out.println(poll); } } From ade08071d8fcd19161d7d4a1c1ee2e5da23a6b67 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 22:38:12 +0800 Subject: [PATCH 132/175] remove duplicated class --- .../codecraft/webmagic/model/OschinaBlog.java | 40 ------------------- .../codecraft/webmagic/model/TestFetcher.java | 24 ----------- .../scheduler/RedisSchedulerTest.java | 1 + 3 files changed, 1 insertion(+), 64 deletions(-) delete mode 100644 webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java delete mode 100644 webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/TestFetcher.java diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java deleted file mode 100644 index 2552104c8..000000000 --- a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/OschinaBlog.java +++ /dev/null @@ -1,40 +0,0 @@ -package us.codecraft.webmagic.model; - -import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; - -import java.util.List; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-8-1
      - * Time: 下午10:18
      - */ -@TargetUrl("http://my.oschina.net/flashsword/blog/*") -public class OschinaBlog implements AfterExtractor { - - @ExtractBy("//title") - private String title; - - @ExtractBy(value = "div.BlogContent", type = ExtractBy.Type.Css) - private String content; - - @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) - private List tags; - - @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) - private List comments; - - @Override - public void afterProcess(Page page) { - System.out.println("title:\t"+title); - System.out.println("content:\t"+content); - System.out.println("tags:\t" + tags); - page.setSkip(true); - } - - public static void main(String[] args) { - OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) - .run(); - } -} \ No newline at end of file diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/TestFetcher.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/TestFetcher.java deleted file mode 100644 index 009d53aca..000000000 --- a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/model/TestFetcher.java +++ /dev/null @@ -1,24 +0,0 @@ -package us.codecraft.webmagic.model; - -import org.junit.Ignore; -import org.junit.Test; -import us.codecraft.webmagic.Site; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-8-1
      - * Time: 下午8:42
      - */ -public class TestFetcher { - - @Ignore("takes long") - @Test - public void test() { - OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog/145796"), OschinaBlog.class) - .run(); - - } - - - -} diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java index 144dba5ae..f0cbb3d7f 100644 --- a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java +++ b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java @@ -1,6 +1,7 @@ package us.codecraft.webmagic.scheduler; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Site; From d08b6fba4f88d37f0e276868062380a38bca5bb4 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 22:43:31 +0800 Subject: [PATCH 133/175] fix a null domain error --- .../src/main/java/us/codecraft/webmagic/Site.java | 14 +++++++++++++- .../webmagic/model/samples/OschinaBlog.java | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java index 2c6118c75..9ab97fe86 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Site.java @@ -1,5 +1,7 @@ package us.codecraft.webmagic; +import us.codecraft.webmagic.utils.UrlUtils; + import java.util.*; /** @@ -90,6 +92,11 @@ public String getUserAgent() { * @return 已设置的domain */ public String getDomain() { + if (domain == null) { + if (startUrls.size() > 0) { + domain = UrlUtils.getDomain(startUrls.get(0)); + } + } return domain; } @@ -150,6 +157,7 @@ public Set getAcceptStatCode() { /** * 获取初始页面的地址列表 + * * @return 初始页面的地址列表 */ public List getStartUrls() { @@ -158,6 +166,7 @@ public List getStartUrls() { /** * 增加初始页面的地址,可反复调用此方法增加多个初始地址。 + * * @param startUrl 初始页面的地址 * @return this */ @@ -179,6 +188,7 @@ public Site setSleepTime(int sleepTime) { /** * 获取两次抓取之间的间隔 + * * @return 两次抓取之间的间隔,单位毫秒 */ public int getSleepTime() { @@ -187,6 +197,7 @@ public int getSleepTime() { /** * 获取重新下载的次数,默认为0 + * * @return 重新下载的次数 */ public int getRetryTimes() { @@ -195,6 +206,7 @@ public int getRetryTimes() { /** * 设置获取重新下载的次数,默认为0 + * * @return this */ public Site setRetryTimes(int retryTimes) { @@ -219,7 +231,7 @@ public boolean equals(Object o) { return true; } - public Task toTask(){ + public Task toTask() { return new Task() { @Override public String getUUID() { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java index 9f11d0e0a..38cb41f01 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java @@ -4,6 +4,8 @@ import us.codecraft.webmagic.model.ExtractBy; import us.codecraft.webmagic.model.OOSpider; import us.codecraft.webmagic.model.TargetUrl; +import us.codecraft.webmagic.pipeline.ConsolePipeline; +import us.codecraft.webmagic.pipeline.JsonFilePipeline; /** * @author code4crafter@gmail.com
      @@ -28,7 +30,7 @@ public String toString() { } public static void main(String[] args) { - OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).run(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).pipeline(new ConsolePipeline()).pipeline(new JsonFilePipeline()).run(); } public String getTitle() { From 4f630fe548206478e19fb6a3e4e098c4408665e3 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:01:43 +0800 Subject: [PATCH 134/175] add xpath2.0 api --- .../webmagic/pipeline/ConsolePipeline.java | 21 +++++++------------ .../us/codecraft/webmagic/selector/Html.java | 6 ++++++ .../webmagic/selector/PlainText.java | 5 +++++ .../webmagic/selector/Selectable.java | 8 +++++++ .../webmagic/selector/SelectorFactory.java | 4 ++++ .../webmagic/downloader/FileDownloader.java | 0 .../scheduler}/FileCacheQueueScheduler.java | 3 ++- .../webmagic/utils/DoubleKeyMap.java | 0 .../webmagic/utils/MultiKeyMapBase.java | 0 .../webmagic/model/samples/OschinaBlog.java | 3 +-- .../webmagic/samples/GuoxueProcessor.java | 2 +- .../us/codecraft/webmagic/SpiderTest.java | 2 +- .../processor/DiandianProcessorTest.java | 2 +- .../processor/DiaoyuwengProcessorTest.java | 2 +- .../processor/SinablogProcessorTest.java | 2 +- 15 files changed, 38 insertions(+), 22 deletions(-) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java (100%) rename {webmagic-core/src/main/java/us/codecraft/webmagic/schedular => webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler}/FileCacheQueueScheduler.java (97%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java (100%) rename {webmagic-core => webmagic-plugin/webmagic-misc}/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java (100%) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java index 2ff99c870..e1648fe71 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/ConsolePipeline.java @@ -7,25 +7,18 @@ /** * 命令行输出抽取结果。可用于测试。
      + * * @author code4crafter@gmail.com
      - * Date: 13-4-21 - * Time: 下午1:45 + * Date: 13-4-21 + * Time: 下午1:45 */ -public class ConsolePipeline implements Pipeline{ +public class ConsolePipeline implements Pipeline { @Override - public void process(ResultItems resultItems,Task task) { - System.out.println("get page: "+resultItems.getRequest().getUrl()); + public void process(ResultItems resultItems, Task task) { + System.out.println("get page: " + resultItems.getRequest().getUrl()); for (Map.Entry entry : resultItems.getAll().entrySet()) { - if (entry.getValue() instanceof Iterable) { - Iterable value = (Iterable) entry.getValue(); - System.out.println(entry.getKey() + ":"); - for (Object o : value) { - System.out.println(o); - } - } else { - System.out.println(entry.getKey() + ":\t" + entry.getValue()); - } + System.out.println(entry.getKey() + ":\t" + entry.getValue()); } } } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 114eef996..79d62a015 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -63,6 +63,12 @@ public Selectable xpath(String xpath) { return selectList(xpathSelector, strings); } + @Override + public Selectable xpath2(String xpath) { + Xpath2Selector xpathSelector = SelectorFactory.getInstatnce().newXpath2Selector(xpath); + return selectList(xpathSelector, strings); + } + @Override public Selectable $(String selector) { CssSelector cssSelector = new CssSelector(selector); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index d06a53105..4fff6da88 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -34,6 +34,11 @@ public Selectable xpath(String xpath) { throw new UnsupportedOperationException(); } + @Override + public Selectable xpath2(String xpath) { + throw new UnsupportedOperationException(); + } + @Override public Selectable $(String selector) { throw new UnsupportedOperationException(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index 42f3d1083..cea501dd3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -18,6 +18,14 @@ public interface Selectable { */ public Selectable xpath(String xpath); + /** + * select list with xpath 2.0 syntax + * + * @param xpath + * @return new Selectable after extract + */ + public Selectable xpath2(String xpath); + /** * select list with css selector * diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java index 1dd56e01c..9abb1ce3a 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java @@ -34,6 +34,10 @@ public XpathSelector newXpathSelector(String xpath) { return newSelector(XpathSelector.class, xpath); } + public Xpath2Selector newXpath2Selector(String xpath) { + return newSelector(Xpath2Selector.class, xpath); + } + public SmartContentSelector newSmartContentSelector(){ return newSelector(SmartContentSelector.class); } diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java similarity index 97% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java index f5393a33e..d4a3987d9 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/FileCacheQueueScheduler.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java @@ -1,9 +1,10 @@ -package us.codecraft.webmagic.schedular; +package us.codecraft.webmagic.scheduler; import org.apache.commons.lang3.math.NumberUtils; import org.apache.log4j.Logger; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.schedular.Scheduler; import java.io.*; import java.util.LinkedHashSet; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java index 38cb41f01..817ba4480 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java @@ -4,7 +4,6 @@ import us.codecraft.webmagic.model.ExtractBy; import us.codecraft.webmagic.model.OOSpider; import us.codecraft.webmagic.model.TargetUrl; -import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.JsonFilePipeline; /** @@ -30,7 +29,7 @@ public String toString() { } public static void main(String[] args) { - OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).pipeline(new ConsolePipeline()).pipeline(new JsonFilePipeline()).run(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).pipeline(new JsonFilePipeline()).run(); } public String getTitle() { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java index db00c79c3..5d7d3559b 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java @@ -3,7 +3,7 @@ import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.SimplePageProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; +import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java index 76a423fbf..dbfa81548 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/SpiderTest.java @@ -5,7 +5,7 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.SimplePageProcessor; import us.codecraft.webmagic.samples.HuxiuProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; +import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java index 13910b528..cf587f1d0 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.FreemarkerPipeline; import us.codecraft.webmagic.samples.DiandianBlogProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; +import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; import java.io.IOException; diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 33bcf9c61..69a535c68 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.pipeline.FreemarkerPipeline; import us.codecraft.webmagic.samples.DiaoyuwengProcessor; -import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; +import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; import java.io.IOException; diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index a0160e186..a44fe35b5 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.pipeline.FreemarkerPipeline; import us.codecraft.webmagic.samples.SinaBlogProcesser; -import us.codecraft.webmagic.schedular.FileCacheQueueScheduler; +import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; import java.io.IOException; From b4e21e72aa825ef0e5f5d14a31b8857575d01101 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:05:00 +0800 Subject: [PATCH 135/175] orgnize dep --- webmagic-plugin/webmagic-misc/pom.xml | 5 ++ .../selenium}/SeleniumDownloader.java | 2 +- .../downloader/selenium}/WebDriverPool.java | 2 +- webmagic-plugin/webmagic-selenium/README.md | 3 - webmagic-plugin/webmagic-selenium/pom.xml | 23 ------- .../webmagic/selenium/SeleniumTest.java | 41 ------------- .../downloader/SeleniumDownloaderTest.java | 61 ------------------- .../downloader/WebDriverPoolTest.java | 31 ---------- webmagic-samples/pom.xml | 5 -- 9 files changed, 7 insertions(+), 166 deletions(-) rename webmagic-plugin/{webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader => webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium}/SeleniumDownloader.java (98%) rename webmagic-plugin/{webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader => webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium}/WebDriverPool.java (97%) delete mode 100644 webmagic-plugin/webmagic-selenium/README.md delete mode 100644 webmagic-plugin/webmagic-selenium/pom.xml delete mode 100644 webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java delete mode 100644 webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java delete mode 100644 webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java diff --git a/webmagic-plugin/webmagic-misc/pom.xml b/webmagic-plugin/webmagic-misc/pom.xml index 5e241731a..130e4000b 100644 --- a/webmagic-plugin/webmagic-misc/pom.xml +++ b/webmagic-plugin/webmagic-misc/pom.xml @@ -22,6 +22,11 @@ jedis 2.0.0
      + + org.seleniumhq.selenium + selenium-java + 2.33.0 +
      \ No newline at end of file diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java similarity index 98% rename from webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java index 002dcc9ea..e95f27c4d 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloader.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.selenium.downloader; +package us.codecraft.webmagic.downloader.selenium; import org.apache.log4j.Logger; import org.openqa.selenium.By; diff --git a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java similarity index 97% rename from webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java rename to webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java index fdd978df6..c763a99a7 100644 --- a/webmagic-plugin/webmagic-selenium/src/main/java/us/codecraft/webmagic/selenium/downloader/WebDriverPool.java +++ b/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.selenium.downloader; +package us.codecraft.webmagic.downloader.selenium; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; diff --git a/webmagic-plugin/webmagic-selenium/README.md b/webmagic-plugin/webmagic-selenium/README.md deleted file mode 100644 index 5e5ce8211..000000000 --- a/webmagic-plugin/webmagic-selenium/README.md +++ /dev/null @@ -1,3 +0,0 @@ -webmagic-selenium -------- -尝试使用selenium来进行页面动态渲染,开发中。 \ No newline at end of file diff --git a/webmagic-plugin/webmagic-selenium/pom.xml b/webmagic-plugin/webmagic-selenium/pom.xml deleted file mode 100644 index 0da4504f7..000000000 --- a/webmagic-plugin/webmagic-selenium/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - us.codecraft - webmagic-plugin - 0.1.0 - - 4.0.0 - webmagic-selenium - - - - org.seleniumhq.selenium - selenium-java - 2.33.0 - - - - - \ No newline at end of file diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java deleted file mode 100644 index a6de8471f..000000000 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/SeleniumTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package us.codecraft.webmagic.selenium; - -import org.junit.Ignore; -import org.junit.Test; -import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.chrome.ChromeDriver; -import org.openqa.selenium.remote.DesiredCapabilities; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-7-26
      - * Time: 下午12:27
      - */ -public class SeleniumTest { - - @Ignore("need chrome driver") - @Test - public void testSelenium() { - System.getProperties().setProperty("webdriver.chrome.driver", "/Users/yihua/Downloads/chromedriver"); - Map contentSettings = new HashMap(); - contentSettings.put("images", 2); - - Map preferences = new HashMap(); - preferences.put("profile.default_content_settings", contentSettings); - - DesiredCapabilities caps = DesiredCapabilities.chrome(); - caps.setCapability("chrome.prefs", preferences); - caps.setCapability("chrome.switches", Arrays.asList("--user-data-dir=/Users/yihua/temp/chrome")); - WebDriver webDriver = new ChromeDriver(caps); - webDriver.get("http://huaban.com/"); - WebElement webElement = webDriver.findElement(By.xpath("/html")); - System.out.println(webElement.getAttribute("outerHTML")); - webDriver.close(); - } -} diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java deleted file mode 100644 index 23711fa93..000000000 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/SeleniumDownloaderTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package us.codecraft.webmagic.selenium.downloader; - -import org.junit.Ignore; -import org.junit.Test; -import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Request; -import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Task; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-7-26
      - * Time: 下午2:46
      - */ -public class SeleniumDownloaderTest { - - private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; - - @Ignore("need chrome driver") - @Test - public void test() { - SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); - long time1 = System.currentTimeMillis(); - for (int i = 0; i < 100; i++) { - Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { - @Override - public String getUUID() { - return "huaban.com"; - } - - @Override - public Site getSite() { - return Site.me(); - } - }); - System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); - } - System.out.println(System.currentTimeMillis() - time1); - } - - @Ignore - @Test - public void testBaiduWenku() { - SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); - seleniumDownloader.setSleepTime(10000); - long time1 = System.currentTimeMillis(); - Page page = seleniumDownloader.download(new Request("http://wenku.baidu.com/view/462933ff04a1b0717fd5ddc2.html"), new Task() { - @Override - public String getUUID() { - return "huaban.com"; - } - - @Override - public Site getSite() { - return Site.me(); - } - }); - System.out.println(page.getHtml().$("div.inner").replace("<[^<>]+>","").replace("&nsbp;","").all()); - } - -} diff --git a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java b/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java deleted file mode 100644 index cbf386068..000000000 --- a/webmagic-plugin/webmagic-selenium/src/test/java/us/codecraft/webmagic/selenium/downloader/WebDriverPoolTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package us.codecraft.webmagic.selenium.downloader; - -import org.junit.Ignore; -import org.junit.Test; -import org.openqa.selenium.WebDriver; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-7-26
      - * Time: 下午2:12
      - */ -public class WebDriverPoolTest { - - private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; - - @Ignore("need chrome driver") - @Test - public void test() { - System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); - WebDriverPool webDriverPool = new WebDriverPool(5); - for (int i = 0; i < 5; i++) { - try { - WebDriver webDriver = webDriverPool.get(); - System.out.println(i); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - webDriverPool.closeAll(); - } -} diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index a38e872de..ff37e2103 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -22,11 +22,6 @@ webmagic-misc ${project.version}
      - - us.codecraft - webmagic-selenium - ${project.version} - org.freemarker freemarker From 0cc2a15bcfb057ddd51133ca6b77d3a13407a89f Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:11:00 +0800 Subject: [PATCH 136/175] add test case back --- .../webmagic/downloader/SeleniumTest.java | 41 +++++++++++++ .../selenium/SeleniumDownloaderTest.java | 61 +++++++++++++++++++ .../selenium/WebDriverPoolTest.java | 31 ++++++++++ .../webmagic/samples/HuabanProcessor.java | 2 +- 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java create mode 100644 webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java create mode 100644 webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java new file mode 100644 index 000000000..2c190336d --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java @@ -0,0 +1,41 @@ +package us.codecraft.webmagic.downloader; + +import org.junit.Ignore; +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.remote.DesiredCapabilities; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-7-26
      + * Time: 下午12:27
      + */ +public class SeleniumTest { + + @Ignore("need chrome driver") + @Test + public void testSelenium() { + System.getProperties().setProperty("webdriver.chrome.driver", "/Users/yihua/Downloads/chromedriver"); + Map contentSettings = new HashMap(); + contentSettings.put("images", 2); + + Map preferences = new HashMap(); + preferences.put("profile.default_content_settings", contentSettings); + + DesiredCapabilities caps = DesiredCapabilities.chrome(); + caps.setCapability("chrome.prefs", preferences); + caps.setCapability("chrome.switches", Arrays.asList("--user-data-dir=/Users/yihua/temp/chrome")); + WebDriver webDriver = new ChromeDriver(caps); + webDriver.get("http://huaban.com/"); + WebElement webElement = webDriver.findElement(By.xpath("/html")); + System.out.println(webElement.getAttribute("outerHTML")); + webDriver.close(); + } +} diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java new file mode 100644 index 000000000..fe98e8f58 --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java @@ -0,0 +1,61 @@ +package us.codecraft.webmagic.downloader.selenium; + +import org.junit.Ignore; +import org.junit.Test; +import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Request; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.Task; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-7-26
      + * Time: 下午2:46
      + */ +public class SeleniumDownloaderTest { + + private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + + @Ignore("need chrome driver") + @Test + public void test() { + SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + long time1 = System.currentTimeMillis(); + for (int i = 0; i < 100; i++) { + Page page = seleniumDownloader.download(new Request("http://huaban.com/"), new Task() { + @Override + public String getUUID() { + return "huaban.com"; + } + + @Override + public Site getSite() { + return Site.me(); + } + }); + System.out.println(page.getHtml().$("#waterfall").links().regex(".*pins.*").all()); + } + System.out.println(System.currentTimeMillis() - time1); + } + + @Ignore + @Test + public void testBaiduWenku() { + SeleniumDownloader seleniumDownloader = new SeleniumDownloader(chromeDriverPath); + seleniumDownloader.setSleepTime(10000); + long time1 = System.currentTimeMillis(); + Page page = seleniumDownloader.download(new Request("http://wenku.baidu.com/view/462933ff04a1b0717fd5ddc2.html"), new Task() { + @Override + public String getUUID() { + return "huaban.com"; + } + + @Override + public Site getSite() { + return Site.me(); + } + }); + System.out.println(page.getHtml().$("div.inner").replace("<[^<>]+>","").replace("&nsbp;","").all()); + } + +} diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java new file mode 100644 index 000000000..4d5d2755b --- /dev/null +++ b/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java @@ -0,0 +1,31 @@ +package us.codecraft.webmagic.downloader.selenium; + +import org.junit.Ignore; +import org.junit.Test; +import org.openqa.selenium.WebDriver; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-7-26
      + * Time: 下午2:12
      + */ +public class WebDriverPoolTest { + + private String chromeDriverPath = "/Users/yihua/Downloads/chromedriver"; + + @Ignore("need chrome driver") + @Test + public void test() { + System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverPath); + WebDriverPool webDriverPool = new WebDriverPool(5); + for (int i = 0; i < 5; i++) { + try { + WebDriver webDriver = webDriverPool.get(); + System.out.println(i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + webDriverPool.closeAll(); + } +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java index eef2b2fa1..4763c076b 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -6,7 +6,7 @@ import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.scheduler.RedisScheduler; -import us.codecraft.webmagic.selenium.downloader.SeleniumDownloader; +import us.codecraft.webmagic.downloader.downloader.SeleniumDownloader; /** * 花瓣网抽取器。
      From 42ca885cafaf92a409f60d435161069c718c5608 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:11:43 +0800 Subject: [PATCH 137/175] fix compile error --- .../java/us/codecraft/webmagic/samples/HuabanProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java index 4763c076b..44173fbc2 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -3,10 +3,10 @@ import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.downloader.selenium.SeleniumDownloader; import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.scheduler.RedisScheduler; -import us.codecraft.webmagic.downloader.downloader.SeleniumDownloader; /** * 花瓣网抽取器。
      From 6637ac52f8b5881ef394a61be945a268fcdf3096 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:17:07 +0800 Subject: [PATCH 138/175] update packages structure --- pom.xml | 2 +- .../pom.xml | 13 ++++++-- .../us/codecraft/webmagic/PagedModel.java | 0 .../webmagic/downloader/FileDownloader.java | 0 .../selenium/SeleniumDownloader.java | 0 .../downloader/selenium/WebDriverPool.java | 0 .../webmagic/model/AfterExtractor.java | 0 .../model/ConsolePageModelPipeline.java | 0 .../codecraft/webmagic/model/ExtractBy.java | 0 .../codecraft/webmagic/model/ExtractBy2.java | 0 .../codecraft/webmagic/model/ExtractBy3.java | 0 .../webmagic/model/ExtractByRaw.java | 0 .../webmagic/model/ExtractByUrl.java | 0 .../codecraft/webmagic/model/Extractor.java | 0 .../webmagic/model/FieldExtractor.java | 0 .../us/codecraft/webmagic/model/HelpUrl.java | 0 .../webmagic/model/ModelPageProcessor.java | 0 .../webmagic/model/ModelPipeline.java | 0 .../us/codecraft/webmagic/model/OOSpider.java | 0 .../webmagic/model/PageModelExtractor.java | 0 .../webmagic/model/PageModelPipeline.java | 0 .../codecraft/webmagic/model/TargetUrl.java | 0 .../us/codecraft/webmagic/model/package.html | 0 .../webmagic/pipeline/JsonFilePipeline.java | 0 .../webmagic/pipeline/PagedPipeline.java | 0 .../scheduler/FileCacheQueueScheduler.java | 0 .../webmagic/scheduler/RedisScheduler.java | 0 .../webmagic/utils/DoubleKeyMap.java | 0 .../webmagic/utils/MultiKeyMapBase.java | 0 .../webmagic/downloader/SeleniumTest.java | 0 .../selenium/SeleniumDownloaderTest.java | 0 .../selenium/WebDriverPoolTest.java | 0 .../scheduler/RedisSchedulerTest.java | 0 .../pom.xml | 11 ++++++- .../webmagic/pipeline/LucenePipeline.java | 0 webmagic-plugin/README.md | 6 ---- webmagic-plugin/pom.xml | 32 ------------------- webmagic-samples/pom.xml | 2 +- 38 files changed, 23 insertions(+), 43 deletions(-) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/pom.xml (70%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/PagedModel.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ExtractBy.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/Extractor.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/HelpUrl.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/OOSpider.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/TargetUrl.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/model/package.html (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java (100%) rename {webmagic-plugin/webmagic-misc => webmagic-extension}/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java (100%) rename {webmagic-plugin/webmagic-lucene => webmagic-lucene}/pom.xml (71%) rename {webmagic-plugin/webmagic-lucene => webmagic-lucene}/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java (100%) delete mode 100644 webmagic-plugin/README.md delete mode 100644 webmagic-plugin/pom.xml diff --git a/pom.xml b/pom.xml index fa369f4a8..b269adeef 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ webmagic-core - webmagic-plugin/ + webmagic-extension/ webmagic-samples/ diff --git a/webmagic-plugin/webmagic-misc/pom.xml b/webmagic-extension/pom.xml similarity index 70% rename from webmagic-plugin/webmagic-misc/pom.xml rename to webmagic-extension/pom.xml index 130e4000b..cbff0b850 100644 --- a/webmagic-plugin/webmagic-misc/pom.xml +++ b/webmagic-extension/pom.xml @@ -4,12 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> us.codecraft - webmagic-plugin + webmagic 0.1.0 4.0.0 - webmagic-misc + webmagic-extension @@ -27,6 +27,15 @@ selenium-java 2.33.0 + + us.codecraft + webmagic-core + ${project.version} + + + junit + junit + \ No newline at end of file diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/PagedModel.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/PagedModel.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/PagedModel.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/Extractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/Extractor.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/Extractor.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/Extractor.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/HelpUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/HelpUrl.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/HelpUrl.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/HelpUrl.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/OOSpider.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/OOSpider.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/OOSpider.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/OOSpider.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/TargetUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/TargetUrl.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/TargetUrl.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/TargetUrl.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/package.html b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/package.html similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/model/package.html rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/package.html diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java diff --git a/webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java b/webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java rename to webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java b/webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java rename to webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java b/webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java rename to webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java diff --git a/webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-extension/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java similarity index 100% rename from webmagic-plugin/webmagic-misc/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java rename to webmagic-extension/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java diff --git a/webmagic-plugin/webmagic-lucene/pom.xml b/webmagic-lucene/pom.xml similarity index 71% rename from webmagic-plugin/webmagic-lucene/pom.xml rename to webmagic-lucene/pom.xml index b072472dd..512d18965 100644 --- a/webmagic-plugin/webmagic-lucene/pom.xml +++ b/webmagic-lucene/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - webmagic-plugin + webmagic us.codecraft 0.1.0 @@ -22,6 +22,15 @@ lucene-queryparser 4.4.0
      + + us.codecraft + webmagic-core + ${project.version} + + + junit + junit +
      diff --git a/webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java b/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java similarity index 100% rename from webmagic-plugin/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java rename to webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java diff --git a/webmagic-plugin/README.md b/webmagic-plugin/README.md deleted file mode 100644 index 536d59602..000000000 --- a/webmagic-plugin/README.md +++ /dev/null @@ -1,6 +0,0 @@ -webmagic-plugin -------- -webmagic的插件模块。 -目前仅实现了freemarker模板渲染,和redis实现分布式爬虫。 - -另外有一个使用Selenium来动态渲染页面的模块在开发中。 \ No newline at end of file diff --git a/webmagic-plugin/pom.xml b/webmagic-plugin/pom.xml deleted file mode 100644 index 54c69ec57..000000000 --- a/webmagic-plugin/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - us.codecraft - webmagic - 0.1.0 - - pom - 4.0.0 - - webmagic-misc - webmagic-selenium - webmagic-lucene - - - webmagic-plugin - - - - us.codecraft - webmagic-core - ${project.version} - - - junit - junit - - - - \ No newline at end of file diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index ff37e2103..de3b4aafe 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -19,7 +19,7 @@
      us.codecraft - webmagic-misc + webmagic-extension ${project.version} From 27cd329b89a790352bffceb0b888130496379498 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:23:23 +0800 Subject: [PATCH 139/175] update readme --- webmagic-lucene/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 webmagic-lucene/README.md diff --git a/webmagic-lucene/README.md b/webmagic-lucene/README.md new file mode 100644 index 000000000..77050ab08 --- /dev/null +++ b/webmagic-lucene/README.md @@ -0,0 +1,3 @@ +webmagic-lucene +-------- +尝试将webmagic与lucene结合,打造一个搜索引擎。开发中,不作为webmagic主要模块。 \ No newline at end of file From 7f4d4c3474ec30a1b618656b58740924086e6549 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Tue, 6 Aug 2013 23:32:02 +0800 Subject: [PATCH 140/175] fix a lucene bug --- webmagic-lucene/pom.xml | 2 +- .../webmagic/pipeline/LucenePipeline.java | 11 ++-- .../webmagic/lucene/OschinaBlog.java | 61 +++++++++++++++++++ 3 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java diff --git a/webmagic-lucene/pom.xml b/webmagic-lucene/pom.xml index 512d18965..2d0ceebcc 100644 --- a/webmagic-lucene/pom.xml +++ b/webmagic-lucene/pom.xml @@ -24,7 +24,7 @@ us.codecraft - webmagic-core + webmagic-extension ${project.version} diff --git a/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java b/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java index 4c048efb2..724ac7eb8 100644 --- a/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java +++ b/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java @@ -33,16 +33,14 @@ public class LucenePipeline implements Pipeline { private Directory directory; - private IndexWriter indexWriter; - private Analyzer analyzer; + private IndexWriterConfig config; + private void init() throws IOException { analyzer = new StandardAnalyzer(Version.LUCENE_44); directory = new RAMDirectory(); - IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer); - indexWriter = new IndexWriter(directory, config); - indexWriter.close(); + config = new IndexWriterConfig(Version.LUCENE_44, analyzer); } public LucenePipeline() { @@ -67,7 +65,6 @@ public List search(String fieldName, String value) throws IOException, documents.add(hitDoc); } ireader.close(); - directory.close(); return documents; } @@ -85,7 +82,9 @@ public void process(ResultItems resultItems, Task task) { doc.add(new Field(objectEntry.getKey(), objectEntry.getValue().toString(), TextField.TYPE_STORED)); } try { + IndexWriter indexWriter = new IndexWriter(directory, config); indexWriter.addDocument(doc); + indexWriter.close(); } catch (IOException e) { e.printStackTrace(); } diff --git a/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java b/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java new file mode 100644 index 000000000..d44427530 --- /dev/null +++ b/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java @@ -0,0 +1,61 @@ +package us.codecraft.webmagic.lucene; + +import org.apache.lucene.document.Document; +import org.apache.lucene.queryparser.classic.ParseException; +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.model.ExtractBy; +import us.codecraft.webmagic.model.OOSpider; +import us.codecraft.webmagic.model.TargetUrl; +import us.codecraft.webmagic.pipeline.LucenePipeline; + +import java.io.IOException; +import java.util.List; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-8-2
      + * Time: 上午7:52
      + */ +@TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") +public class OschinaBlog { + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div.BlogContent", type = ExtractBy.Type.Css) + private String content; + + @Override + public String toString() { + return "OschinaBlog{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } + + public static void main(String[] args) { + LucenePipeline pipeline = new LucenePipeline(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).pipeline(pipeline).runAsync(); + while (true) { + try { + List search = pipeline.search("title", "webmagic"); + System.out.println(search); + Thread.sleep(3000); + } catch (IOException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + public String getTitle() { + return title; + } + + public String getContent() { + return content; + } +} From f8f77e4b0f39130b683060a5b5afa012a78dcf36 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 08:05:14 +0800 Subject: [PATCH 141/175] update maven dep --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b269adeef..706d9fd7e 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,7 @@ org.apache.maven.plugins maven-dependency-plugin + 2.8 copy-dependencies @@ -99,6 +100,7 @@ org.apache.maven.plugins maven-resources-plugin + 2.6 UTF-8 @@ -106,6 +108,7 @@ org.apache.maven.plugins maven-source-plugin + 2.2.1 attach-sources @@ -118,6 +121,10 @@ org.apache.maven.plugins maven-javadoc-plugin + 2.9.1 + + UTF-8 + attach-javadocs @@ -130,7 +137,7 @@ org.apache.maven.plugins maven-release-plugin - 2.0-beta-7 + 2.4.1 From d0ec226a2c238792936dbc1c56ead59686ac37e4 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 09:45:00 +0800 Subject: [PATCH 142/175] update readme --- webmagic-core/README.md | 2 +- webmagic-extension/README.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 webmagic-extension/README.md diff --git a/webmagic-core/README.md b/webmagic-core/README.md index 4964e1677..90a6f0a47 100644 --- a/webmagic-core/README.md +++ b/webmagic-core/README.md @@ -1,3 +1,3 @@ webmagic-core ------- -webmagic核心部分。 \ No newline at end of file +webmagic核心部分。只包含爬虫基本模块和基本抽取器。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。 \ No newline at end of file diff --git a/webmagic-extension/README.md b/webmagic-extension/README.md new file mode 100644 index 000000000..71d3c48bc --- /dev/null +++ b/webmagic-extension/README.md @@ -0,0 +1,3 @@ +webmagic-extension +------- +webmagic的扩展模块。包括注解格式定义爬虫、JSON、分布式等支持。 \ No newline at end of file From 6f8649dc157e5dfadf0755e3c77190dd39a70a07 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 09:47:28 +0800 Subject: [PATCH 143/175] add readme --- webmagic-samples/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 webmagic-samples/README.md diff --git a/webmagic-samples/README.md b/webmagic-samples/README.md new file mode 100644 index 000000000..7cdad186f --- /dev/null +++ b/webmagic-samples/README.md @@ -0,0 +1,3 @@ +webmagic-samples +------- +webmagic的一些示例。包括抓取常见博客、信息类网站等。 \ No newline at end of file From c39165cd9dca09a13c4b7cb916b1b9079758f707 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 12:48:32 +0800 Subject: [PATCH 144/175] update version --- pom.xml | 2 +- webmagic-core/pom.xml | 2 +- webmagic-extension/pom.xml | 2 +- webmagic-lucene/pom.xml | 2 +- webmagic-samples/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 706d9fd7e..5033977b1 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> us.codecraft - 0.1.0 + 0.2.0 4.0.0 pom webmagic diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index a5fbd7558..d2c48b24a 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -5,7 +5,7 @@ us.codecraft webmagic - 0.1.0 + 0.2.0 4.0.0 diff --git a/webmagic-extension/pom.xml b/webmagic-extension/pom.xml index cbff0b850..2a3590d3c 100644 --- a/webmagic-extension/pom.xml +++ b/webmagic-extension/pom.xml @@ -5,7 +5,7 @@ us.codecraft webmagic - 0.1.0 + 0.2.0 4.0.0 diff --git a/webmagic-lucene/pom.xml b/webmagic-lucene/pom.xml index 2d0ceebcc..d7b4665c0 100644 --- a/webmagic-lucene/pom.xml +++ b/webmagic-lucene/pom.xml @@ -5,7 +5,7 @@ webmagic us.codecraft - 0.1.0 + 0.2.0 4.0.0 diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index de3b4aafe..b85e70823 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -5,7 +5,7 @@ us.codecraft webmagic - 0.1.0 + 0.2.0 4.0.0 From b825781d8f5d63058652fcf747bd2b246e06b985 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 12:51:21 +0800 Subject: [PATCH 145/175] update package structure --- .../main/java/us/codecraft/webmagic/model/ModelPipeline.java | 1 + .../java/us/codecraft/webmagic/model/PageModelExtractor.java | 1 + .../codecraft/webmagic/model/{ => annotation}/ExtractBy.java | 2 +- .../codecraft/webmagic/model/{ => annotation}/ExtractBy2.java | 2 +- .../codecraft/webmagic/model/{ => annotation}/ExtractBy3.java | 2 +- .../webmagic/model/{ => annotation}/ExtractByRaw.java | 2 +- .../webmagic/model/{ => annotation}/ExtractByUrl.java | 2 +- .../us/codecraft/webmagic/model/{ => annotation}/HelpUrl.java | 2 +- .../codecraft/webmagic/model/{ => annotation}/TargetUrl.java | 2 +- .../test/java/us/codecraft/webmagic/lucene/OschinaBlog.java | 4 ++-- .../java/us/codecraft/webmagic/model/samples/IteyeBlog.java | 4 ++-- .../java/us/codecraft/webmagic/model/samples/News163.java | 4 ++++ .../us/codecraft/webmagic/model/samples/OschinaAnswer.java | 3 +++ .../java/us/codecraft/webmagic/model/samples/OschinaBlog.java | 4 ++-- 14 files changed, 22 insertions(+), 13 deletions(-) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/ExtractBy.java (92%) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/ExtractBy2.java (91%) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/ExtractBy3.java (91%) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/ExtractByRaw.java (93%) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/ExtractByUrl.java (91%) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/HelpUrl.java (89%) rename webmagic-extension/src/main/java/us/codecraft/webmagic/model/{ => annotation}/TargetUrl.java (91%) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java index c9f67dce1..84db4558d 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java @@ -2,6 +2,7 @@ import us.codecraft.webmagic.ResultItems; import us.codecraft.webmagic.Task; +import us.codecraft.webmagic.model.annotation.ExtractBy; import us.codecraft.webmagic.pipeline.Pipeline; import java.lang.annotation.Annotation; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index 0207b7ace..445bdd92f 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -2,6 +2,7 @@ import org.apache.commons.lang3.StringUtils; import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.model.annotation.*; import us.codecraft.webmagic.selector.*; import java.lang.annotation.Annotation; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java similarity index 92% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java index 661fd6731..af8946a1a 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java similarity index 91% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java index 55d5dfa85..f68b7d64c 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy2.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java similarity index 91% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java index 10f6a9f40..f3212a6a9 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractBy3.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java similarity index 93% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java index 5dca8e145..96927320e 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByRaw.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java similarity index 91% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java index f443c0ee5..52f4a57ae 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ExtractByUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/HelpUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java similarity index 89% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/HelpUrl.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java index 808d58aa8..3437e4445 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/HelpUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/TargetUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java similarity index 91% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/model/TargetUrl.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java index 3622f55c1..c747da6c1 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/TargetUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.model; +package us.codecraft.webmagic.model.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java b/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java index d44427530..4480f0bee 100644 --- a/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java +++ b/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java @@ -3,9 +3,9 @@ import org.apache.lucene.document.Document; import org.apache.lucene.queryparser.classic.ParseException; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.model.ExtractBy; +import us.codecraft.webmagic.model.annotation.ExtractBy; import us.codecraft.webmagic.model.OOSpider; -import us.codecraft.webmagic.model.TargetUrl; +import us.codecraft.webmagic.model.annotation.TargetUrl; import us.codecraft.webmagic.pipeline.LucenePipeline; import java.io.IOException; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java index 4d01902c6..4be2edef4 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java @@ -1,9 +1,9 @@ package us.codecraft.webmagic.model.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.model.ExtractBy; +import us.codecraft.webmagic.model.annotation.ExtractBy; import us.codecraft.webmagic.model.OOSpider; -import us.codecraft.webmagic.model.TargetUrl; +import us.codecraft.webmagic.model.annotation.TargetUrl; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index 83f8388bd..848800d41 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -3,6 +3,10 @@ import us.codecraft.webmagic.PagedModel; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.model.*; +import us.codecraft.webmagic.model.annotation.ExtractBy; +import us.codecraft.webmagic.model.annotation.ExtractBy2; +import us.codecraft.webmagic.model.annotation.ExtractByUrl; +import us.codecraft.webmagic.model.annotation.TargetUrl; import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.PagedPipeline; import us.codecraft.webmagic.scheduler.RedisScheduler; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java index df2387397..02b8a9c55 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java @@ -3,6 +3,9 @@ import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.model.*; +import us.codecraft.webmagic.model.annotation.ExtractBy; +import us.codecraft.webmagic.model.annotation.HelpUrl; +import us.codecraft.webmagic.model.annotation.TargetUrl; /** * @author code4crafter@gmail.com
      diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java index 817ba4480..64094925b 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java @@ -1,9 +1,9 @@ package us.codecraft.webmagic.model.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.model.ExtractBy; +import us.codecraft.webmagic.model.annotation.ExtractBy; import us.codecraft.webmagic.model.OOSpider; -import us.codecraft.webmagic.model.TargetUrl; +import us.codecraft.webmagic.model.annotation.TargetUrl; import us.codecraft.webmagic.pipeline.JsonFilePipeline; /** From b2ee24def1db2991f257386bb6d6f567f326c7ee Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 13:05:12 +0800 Subject: [PATCH 146/175] fix path format error --- .../main/java/us/codecraft/webmagic/pipeline/FilePipeline.java | 3 +++ .../java/us/codecraft/webmagic/downloader/FileDownloader.java | 3 +++ .../java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java | 3 +++ .../codecraft/webmagic/scheduler/FileCacheQueueScheduler.java | 3 +++ 4 files changed, 12 insertions(+) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java index 72ae1aa12..252ccd5f5 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/pipeline/FilePipeline.java @@ -37,6 +37,9 @@ public FilePipeline() { * @param path 文件保存路径 */ public FilePipeline(String path) { + if (!path.endsWith("/")&&!path.endsWith("\\")){ + path+="/"; + } this.path = path; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java index 722a2eb71..cca5b2065 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/FileDownloader.java @@ -34,6 +34,9 @@ public FileDownloader(String path) { } public FileDownloader(String path, Downloader downloaderWhenFileMiss) { + if (!path.endsWith("/")&&!path.endsWith("\\")){ + path+="/"; + } this.path = path; this.downloaderWhenFileMiss = downloaderWhenFileMiss; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java index 08f3e87b7..dbe1a00a5 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java @@ -37,6 +37,9 @@ public JsonFilePipeline() { * @param path 文件保存路径 */ public JsonFilePipeline(String path) { + if (!path.endsWith("/")&&!path.endsWith("\\")){ + path+="/"; + } this.path = path; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java index d4a3987d9..c294f090a 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java @@ -47,6 +47,9 @@ public class FileCacheQueueScheduler implements Scheduler { private Set urls; public FileCacheQueueScheduler(String filePath) { + if (!filePath.endsWith("/")&&!filePath.endsWith("\\")){ + filePath+="/"; + } this.filePath = filePath; } From 8e468c95aa12a623381c72c171cf87d72e191855 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 14:06:49 +0800 Subject: [PATCH 147/175] add maven jar plugin --- webmagic-samples/assembly.xml | 21 +++++++++++++++++++++ webmagic-samples/pom.xml | 18 ++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 webmagic-samples/assembly.xml diff --git a/webmagic-samples/assembly.xml b/webmagic-samples/assembly.xml new file mode 100644 index 000000000..83370a25b --- /dev/null +++ b/webmagic-samples/assembly.xml @@ -0,0 +1,21 @@ + + jar-with-dependencies + + jar + + false + + + ${project.basedir}/target/classes + / + + + + + false + + + \ No newline at end of file diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index b85e70823..1a4b70263 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -33,4 +33,22 @@
      + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + ./lib/ + + + + + + + \ No newline at end of file From b4d6cd2f7c1725bb6bee7156daa58ee835d07252 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 14:18:58 +0800 Subject: [PATCH 148/175] remove samples --- .../webmagic/samples/{ => selenium}/HuabanProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename webmagic-samples/src/main/java/us/codecraft/webmagic/samples/{ => selenium}/HuabanProcessor.java (96%) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium/HuabanProcessor.java similarity index 96% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java rename to webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium/HuabanProcessor.java index 44173fbc2..dfff0c6c2 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium/HuabanProcessor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.samples; +package us.codecraft.webmagic.samples.selenium; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; From a729f2479601778344de25b657a4dde1f84ec8e5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 14:44:52 +0800 Subject: [PATCH 149/175] set selenium dep to seperate package --- pom.xml | 11 ++++--- webmagic-extension/pom.xml | 5 --- webmagic-samples/assembly.xml | 21 ------------- webmagic-selenium/README.md | 3 ++ webmagic-selenium/pom.xml | 31 +++++++++++++++++++ .../selenium/SeleniumDownloader.java | 0 .../downloader/selenium/WebDriverPool.java | 0 .../webmagic/downloader/SeleniumTest.java | 0 .../selenium/SeleniumDownloaderTest.java | 0 .../selenium/WebDriverPoolTest.java | 0 .../webmagic/samples}/HuabanProcessor.java | 4 +-- 11 files changed, 41 insertions(+), 34 deletions(-) delete mode 100644 webmagic-samples/assembly.xml create mode 100644 webmagic-selenium/README.md create mode 100644 webmagic-selenium/pom.xml rename {webmagic-extension => webmagic-selenium}/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java (100%) rename {webmagic-extension => webmagic-selenium}/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java (100%) rename {webmagic-extension => webmagic-selenium}/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java (100%) rename {webmagic-extension => webmagic-selenium}/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java (100%) rename {webmagic-extension => webmagic-selenium}/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java (100%) rename {webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium => webmagic-selenium/src/test/java/us/codecraft/webmagic/samples}/HuabanProcessor.java (89%) diff --git a/pom.xml b/pom.xml index 5033977b1..1497bb0c5 100644 --- a/pom.xml +++ b/pom.xml @@ -8,10 +8,12 @@ pom webmagic - - webmagic-core - webmagic-extension/ - webmagic-samples/ + + webmagic-core + webmagic-extension/ + webmagic-samples/ + webmagic-selenium/ + webmagic-lucene/ @@ -143,5 +145,4 @@ - diff --git a/webmagic-extension/pom.xml b/webmagic-extension/pom.xml index 2a3590d3c..63034f235 100644 --- a/webmagic-extension/pom.xml +++ b/webmagic-extension/pom.xml @@ -22,11 +22,6 @@ jedis 2.0.0 - - org.seleniumhq.selenium - selenium-java - 2.33.0 - us.codecraft webmagic-core diff --git a/webmagic-samples/assembly.xml b/webmagic-samples/assembly.xml deleted file mode 100644 index 83370a25b..000000000 --- a/webmagic-samples/assembly.xml +++ /dev/null @@ -1,21 +0,0 @@ - - jar-with-dependencies - - jar - - false - - - ${project.basedir}/target/classes - / - - - - - false - - - \ No newline at end of file diff --git a/webmagic-selenium/README.md b/webmagic-selenium/README.md new file mode 100644 index 000000000..71d3c48bc --- /dev/null +++ b/webmagic-selenium/README.md @@ -0,0 +1,3 @@ +webmagic-extension +------- +webmagic的扩展模块。包括注解格式定义爬虫、JSON、分布式等支持。 \ No newline at end of file diff --git a/webmagic-selenium/pom.xml b/webmagic-selenium/pom.xml new file mode 100644 index 000000000..814b7b31b --- /dev/null +++ b/webmagic-selenium/pom.xml @@ -0,0 +1,31 @@ + + + + us.codecraft + webmagic + 0.2.0 + + 4.0.0 + + webmagic-selenium + + + + org.seleniumhq.selenium + selenium-java + 2.33.0 + + + us.codecraft + webmagic-core + ${project.version} + + + junit + junit + + + + \ No newline at end of file diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java b/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java similarity index 100% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java rename to webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java b/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java similarity index 100% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java rename to webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java diff --git a/webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java similarity index 100% rename from webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java rename to webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java diff --git a/webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java similarity index 100% rename from webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java rename to webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java diff --git a/webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java similarity index 100% rename from webmagic-extension/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java rename to webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium/HuabanProcessor.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java similarity index 89% rename from webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium/HuabanProcessor.java rename to webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java index dfff0c6c2..6b3d8a071 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/selenium/HuabanProcessor.java +++ b/webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.samples.selenium; +package us.codecraft.webmagic.samples; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; @@ -6,7 +6,6 @@ import us.codecraft.webmagic.downloader.selenium.SeleniumDownloader; import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.PageProcessor; -import us.codecraft.webmagic.scheduler.RedisScheduler; /** * 花瓣网抽取器。
      @@ -39,7 +38,6 @@ public Site getSite() { public static void main(String[] args) { Spider.create(new HuabanProcessor()).thread(5) - .scheduler(new RedisScheduler("localhost")) .pipeline(new FilePipeline("/data/webmagic/test/")) .downloader(new SeleniumDownloader("/Users/yihua/Downloads/chromedriver")) .runAsync(); From a2d7748cda059447c032f313404a17fb72e3df2d Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 14:45:44 +0800 Subject: [PATCH 150/175] update readme --- webmagic-selenium/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmagic-selenium/README.md b/webmagic-selenium/README.md index 71d3c48bc..c8583c3ab 100644 --- a/webmagic-selenium/README.md +++ b/webmagic-selenium/README.md @@ -1,3 +1,3 @@ webmagic-extension ------- -webmagic的扩展模块。包括注解格式定义爬虫、JSON、分布式等支持。 \ No newline at end of file +webmagic与selenium的集成,用于爬取ajax页面。selenium太重,所以单独抽出成一个包了。 \ No newline at end of file From 58755d7208fb40af8983d11dca571d9359ccef5c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 21:51:26 +0800 Subject: [PATCH 151/175] add starter --- .../codecraft/webmagic/main/QuickStarter.java | 57 +++++++++++++++++++ .../webmagic/model/samples/News163.java | 2 +- .../webmagic/samples/GlobalProcessor.java | 49 ---------------- .../webmagic/samples/GuoxueProcessor.java | 20 ------- 4 files changed, 58 insertions(+), 70 deletions(-) create mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java delete mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java delete mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java new file mode 100644 index 000000000..2046fcb8c --- /dev/null +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java @@ -0,0 +1,57 @@ +package us.codecraft.webmagic.main; + +import us.codecraft.webmagic.Site; +import us.codecraft.webmagic.model.OOSpider; +import us.codecraft.webmagic.model.samples.IteyeBlog; +import us.codecraft.webmagic.model.samples.News163; +import us.codecraft.webmagic.model.samples.OschinaBlog; +import us.codecraft.webmagic.pipeline.ConsolePipeline; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Scanner; + +/** + * @author code4crafter@gmail.com
      + * @date: 13-8-7
      + * Time: 下午9:24
      + */ +public class QuickStarter { + + public static void main(String[] args) { + Map clazzMap = new LinkedHashMap(); + clazzMap.put("1", OschinaBlog.class); + clazzMap.put("2", IteyeBlog.class); + clazzMap.put("3", News163.class); + Map urlMap = new LinkedHashMap(); + urlMap.put("1", "http://my.oschina.net/flashsword/blog"); + urlMap.put("2", "http://flashsword20.iteye.com/"); + urlMap.put("3", "http://news.163.com/"); + Scanner stdin = new Scanner(System.in); + String key = null; + System.out.println("Choose a Spider demo:"); + for (Map.Entry classEntry : clazzMap.entrySet()) { + System.out.println(classEntry.getKey()+"\t" + classEntry.getValue() + "\t" + urlMap.get(classEntry.getKey())); + } + while (key == null) { + key = new String(stdin.nextLine()); + if (clazzMap.get(key) == null) { + System.out.println("Invalid choice!"); + key = null; + } + } + System.out.println("The demo started and will last 60 seconds..."); + + //Start spider + OOSpider.create(Site.me().addStartUrl(urlMap.get(key)), clazzMap.get(key)).pipeline(new ConsolePipeline()).runAsync(); + + + try { + Thread.sleep(60000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("The demo stopped!"); + System.exit(0); + } +} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index 848800d41..6baa8ae78 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -28,7 +28,7 @@ public class News163 implements PagedModel { @ExtractByUrl(value = "http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html", notNull = false) private String page; - @ExtractBy(value = "//div[@class=\"ep-pages\"]//a/@href", multi = true) + @ExtractBy(value = "//div[@class=\"ep-pages\"]//a/@href", multi = true,notNull = false) @ExtractBy2(value = "http://news\\.163\\.com/\\d+/\\d+/\\d+/\\w+_(\\d+)\\.html", type = ExtractBy2.Type.Regex) private List otherPage; diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java deleted file mode 100644 index 0448683b1..000000000 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GlobalProcessor.java +++ /dev/null @@ -1,49 +0,0 @@ -package us.codecraft.webmagic.samples; - -import us.codecraft.webmagic.Page; -import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.pipeline.FilePipeline; -import us.codecraft.webmagic.processor.PageProcessor; -import us.codecraft.webmagic.scheduler.RedisScheduler; - -import java.util.List; - -/** - * Author code4crafter@gmail.com - * Date: 13-6-24 - * Time: 下午2:12 - */ -public class GlobalProcessor implements PageProcessor { - - private Site site; - - @Override - public void process(Page page) { - final List requests = page.getHtml().links().all(); - page.addTargetRequests(requests); - - } - - @Override - public Site getSite() { - if (site == null) { - site = Site.me().setDomain("www.2345.com").setSleepTime(0) - .addStartUrl("http://www.2345.com/").addStartUrl("http://hao.360.cn/") - .addStartUrl("http://www.baidu.com/s?wd=%E7%BD%91%E7%AB%99%E5%AF%BC%E8%88%AA&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=80039098_oem_dg&rsv_n=2&rsv_sug3=6&rsv_sug4=698&rsv_sug=0&rsv_sug1=3") - .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); - } - return site; - } - - public static void main(String[] args) { - Spider.create(new GlobalProcessor()).thread(10) - .scheduler(new RedisScheduler("localhost")) - .pipeline(new FilePipeline("/data/webmagic/test/")) - .runAsync(); - Spider.create(new GlobalProcessor()).thread(10) - .scheduler(new RedisScheduler("localhost")) - .pipeline(new FilePipeline("/data/webmagic/test/")) - .run(); - } -} diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java deleted file mode 100644 index 5d7d3559b..000000000 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/GuoxueProcessor.java +++ /dev/null @@ -1,20 +0,0 @@ -package us.codecraft.webmagic.samples; - -import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.pipeline.FilePipeline; -import us.codecraft.webmagic.processor.SimplePageProcessor; -import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-7-14
      - * Time: 上午8:33
      - */ -public class GuoxueProcessor { - - public static void main(String[] args) { - SimplePageProcessor simplePageProcessor = new SimplePageProcessor("http://www.guoxue123.cn/", "http://www.guoxue123.cn/*"); - simplePageProcessor.getSite().setCharset("GBK").setSleepTime(500); - Spider.create(simplePageProcessor).pipeline(new FilePipeline("/data/webmagic/")).scheduler(new FileCacheQueueScheduler("/data/webmagic/")).run(); - } -} From d0a57dacf3c7a3110f8c47b309f3006094aeb35c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 21:57:05 +0800 Subject: [PATCH 152/175] update main class --- webmagic-samples/pom.xml | 1 + .../java/us/codecraft/webmagic/main/QuickStarter.java | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index 1a4b70263..d8963ff47 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -44,6 +44,7 @@ true ./lib/ + us.codecraft.webmagic.main.QuickStarter diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java index 2046fcb8c..e40b37192 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java @@ -6,6 +6,7 @@ import us.codecraft.webmagic.model.samples.News163; import us.codecraft.webmagic.model.samples.OschinaBlog; import us.codecraft.webmagic.pipeline.ConsolePipeline; +import us.codecraft.webmagic.pipeline.PagedPipeline; import java.util.LinkedHashMap; import java.util.Map; @@ -40,18 +41,19 @@ public static void main(String[] args) { key = null; } } - System.out.println("The demo started and will last 60 seconds..."); + System.out.println("The demo started and will last 20 seconds..."); //Start spider - OOSpider.create(Site.me().addStartUrl(urlMap.get(key)), clazzMap.get(key)).pipeline(new ConsolePipeline()).runAsync(); + OOSpider.create(Site.me().addStartUrl(urlMap.get(key)), clazzMap.get(key)).pipeline(new PagedPipeline()).pipeline(new ConsolePipeline()).runAsync(); try { - Thread.sleep(60000); + Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("The demo stopped!"); + System.out.println("To more usage, try to customize your own Spider!"); System.exit(0); } } From 71e4eec5225940eea63e6657742674fb20cdf662 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 22:03:10 +0800 Subject: [PATCH 153/175] modify class --- .../java/us/codecraft/webmagic/model/samples/IteyeBlog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java index 4be2edef4..38b698038 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java @@ -10,7 +10,7 @@ * @date: 13-8-2
      * Time: 上午7:52
      */ -@TargetUrl("http://dengminhui.iteye.com/blog/*") +@TargetUrl("http://*.iteye.com/blog/*") public class IteyeBlog implements Blog{ @ExtractBy("//title") @@ -28,7 +28,7 @@ public String toString() { } public static void main(String[] args) { - OOSpider.create(Site.me().addStartUrl("http://dengminhui.iteye.com/blog"), IteyeBlog.class).run(); + OOSpider.create(Site.me().addStartUrl("http://*.iteye.com/blog"), IteyeBlog.class).run(); } public String getTitle() { From f86f9c8f7d93c9381ed2e6254e6dcc5809572992 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 22:32:58 +0800 Subject: [PATCH 154/175] some refector --- .../codecraft/webmagic/main/QuickStarter.java | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java index e40b37192..65940e0c4 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java @@ -19,34 +19,29 @@ */ public class QuickStarter { - public static void main(String[] args) { - Map clazzMap = new LinkedHashMap(); + private static Map clazzMap; + + private static Map urlMap; + + private static void init(){ + clazzMap = new LinkedHashMap(); clazzMap.put("1", OschinaBlog.class); clazzMap.put("2", IteyeBlog.class); clazzMap.put("3", News163.class); - Map urlMap = new LinkedHashMap(); + urlMap = new LinkedHashMap(); urlMap.put("1", "http://my.oschina.net/flashsword/blog"); urlMap.put("2", "http://flashsword20.iteye.com/"); urlMap.put("3", "http://news.163.com/"); - Scanner stdin = new Scanner(System.in); + } + + public static void main(String[] args) { + init(); String key = null; - System.out.println("Choose a Spider demo:"); - for (Map.Entry classEntry : clazzMap.entrySet()) { - System.out.println(classEntry.getKey()+"\t" + classEntry.getValue() + "\t" + urlMap.get(classEntry.getKey())); - } - while (key == null) { - key = new String(stdin.nextLine()); - if (clazzMap.get(key) == null) { - System.out.println("Invalid choice!"); - key = null; - } - } + key = readKey(key); System.out.println("The demo started and will last 20 seconds..."); - //Start spider OOSpider.create(Site.me().addStartUrl(urlMap.get(key)), clazzMap.get(key)).pipeline(new PagedPipeline()).pipeline(new ConsolePipeline()).runAsync(); - try { Thread.sleep(20000); } catch (InterruptedException e) { @@ -56,4 +51,20 @@ public static void main(String[] args) { System.out.println("To more usage, try to customize your own Spider!"); System.exit(0); } + + private static String readKey(String key) { + Scanner stdin = new Scanner(System.in); + System.out.println("Choose a Spider demo:"); + for (Map.Entry classEntry : clazzMap.entrySet()) { + System.out.println(classEntry.getKey()+"\t" + classEntry.getValue() + "\t" + urlMap.get(classEntry.getKey())); + } + while (key == null) { + key = new String(stdin.nextLine()); + if (clazzMap.get(key) == null) { + System.out.println("Invalid choice!"); + key = null; + } + } + return key; + } } From 3aa7971959ebb01fc25a6770eb665f780a58a34b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 23:04:10 +0800 Subject: [PATCH 155/175] remove saxon to extension --- webmagic-core/pom.xml | 5 --- .../us/codecraft/webmagic/selector/Html.java | 6 --- .../webmagic/selector/PlainText.java | 5 --- .../webmagic/selector/Selectable.java | 8 ---- .../webmagic/selector/SelectorFactory.java | 4 -- .../webmagic/selector/SaxonTest.java | 45 ------------------- webmagic-extension/pom.xml | 4 ++ .../webmagic/selector/Xpath2Selector.java | 0 .../webmagic/selector/XpathSelectorTest.java | 36 --------------- 9 files changed, 4 insertions(+), 109 deletions(-) delete mode 100644 webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java rename {webmagic-core => webmagic-extension}/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java (100%) rename {webmagic-core => webmagic-extension}/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java (98%) diff --git a/webmagic-core/pom.xml b/webmagic-core/pom.xml index d2c48b24a..cf42d2a94 100644 --- a/webmagic-core/pom.xml +++ b/webmagic-core/pom.xml @@ -27,11 +27,6 @@ commons-lang3
      - - net.sf.saxon - Saxon-HE - - log4j log4j diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java index 79d62a015..114eef996 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Html.java @@ -63,12 +63,6 @@ public Selectable xpath(String xpath) { return selectList(xpathSelector, strings); } - @Override - public Selectable xpath2(String xpath) { - Xpath2Selector xpathSelector = SelectorFactory.getInstatnce().newXpath2Selector(xpath); - return selectList(xpathSelector, strings); - } - @Override public Selectable $(String selector) { CssSelector cssSelector = new CssSelector(selector); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java index 4fff6da88..d06a53105 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/PlainText.java @@ -34,11 +34,6 @@ public Selectable xpath(String xpath) { throw new UnsupportedOperationException(); } - @Override - public Selectable xpath2(String xpath) { - throw new UnsupportedOperationException(); - } - @Override public Selectable $(String selector) { throw new UnsupportedOperationException(); diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java index cea501dd3..42f3d1083 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Selectable.java @@ -18,14 +18,6 @@ public interface Selectable { */ public Selectable xpath(String xpath); - /** - * select list with xpath 2.0 syntax - * - * @param xpath - * @return new Selectable after extract - */ - public Selectable xpath2(String xpath); - /** * select list with css selector * diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java index 9abb1ce3a..1dd56e01c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/SelectorFactory.java @@ -34,10 +34,6 @@ public XpathSelector newXpathSelector(String xpath) { return newSelector(XpathSelector.class, xpath); } - public Xpath2Selector newXpath2Selector(String xpath) { - return newSelector(Xpath2Selector.class, xpath); - } - public SmartContentSelector newSmartContentSelector(){ return newSelector(SmartContentSelector.class); } diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java deleted file mode 100644 index 05a890631..000000000 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/SaxonTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package us.codecraft.webmagic.selector; - -import net.sf.saxon.xpath.XPathFactoryImpl; -import org.htmlcleaner.CleanerProperties; -import org.htmlcleaner.DomSerializer; -import org.htmlcleaner.HtmlCleaner; -import org.htmlcleaner.TagNode; -import org.junit.Test; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; - -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathFactoryConfigurationException; - -/** - * @author code4crafter@gmail.com
      - * @date: 13-8-2
      - * Time: 下午5:48
      - */ -public class SaxonTest { - - @Test - public void test() throws XPathFactoryConfigurationException { -// System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); -// XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); - String xml = "#BBB##CCC##DDD#"; - try { - HtmlCleaner htmlCleaner = new HtmlCleaner(); - TagNode tagNode = htmlCleaner.clean(""); - Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); - - javax.xml.xpath.XPathFactory factory = XPathFactoryImpl.newInstance(); - XPath xpath = factory.newXPath(); - XPathExpression expr = xpath.compile("//a[matches(.,'#...#')]"); - - Object result = expr.evaluate(document, XPathConstants.NODESET); - NodeList nodes = (NodeList) result; - System.out.println(nodes); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/webmagic-extension/pom.xml b/webmagic-extension/pom.xml index 63034f235..843c2c3c1 100644 --- a/webmagic-extension/pom.xml +++ b/webmagic-extension/pom.xml @@ -27,6 +27,10 @@ webmagic-core ${project.version}
      + + net.sf.saxon + Saxon-HE + junit junit diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java rename to webmagic-extension/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-extension/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java similarity index 98% rename from webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java rename to webmagic-extension/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 2f663c990..9f32a8f14 100644 --- a/webmagic-core/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-extension/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1380,42 +1380,6 @@ public void testXPath2() { System.out.println(xpathSelector.select(text)); } - //http://sourceforge.net/mailarchive/forum.php?thread_name=4EA92A8A.6080202%40saxonica.com&forum_name=saxon-help - @Test - public void testSaxon() { - String text = "

      眉山:扎实推进农业农村工作 促农持续增收
      \n" + - "2013-07-31 23:29:45   来源:眉山网      责任编辑:张斯炜

      "; - try { - HtmlCleaner htmlCleaner = new HtmlCleaner(); - TagNode tagNode = htmlCleaner.clean(text); - Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode); - XPathEvaluator xPathEvaluator = new XPathEvaluator(); - xPathEvaluator.setNamespaceContext(new NamespaceContextImpl(new NamespaceResolver() { - - - @Override - public String getURIForPrefix(String s, boolean b) { - return NamespaceConstant.FN; - } - - @Override - public Iterator iteratePrefixes() { - return Collections.singletonList("fn").iterator(); - } - })); - XPathExpression expr = xPathEvaluator.compile("fn:substring-before(//h1,'\n')"); - Object result = expr.evaluate(document, XPathConstants.STRING); - Assert.assertNotNull(result); - } catch (Exception e) { - e.printStackTrace(); - } - Xpath2Selector xpath2Selector = new Xpath2Selector("fn:substring-before(//h1,'\n')"); - String select = xpath2Selector.select(text); - Assert.assertNotNull(select); - Assert.assertNotNull(xpath2Selector.selectList(text)); - - } - @Test public void testXpath2Selector() { Xpath2Selector xpath2Selector = new Xpath2Selector("//a/@href"); From 5a622590b4b5fe7b68053ab510ed2cd9755ec28c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 23:21:28 +0800 Subject: [PATCH 156/175] move xpath2.0 support to seperate package --- pom.xml | 1 + webmagic-extension/pom.xml | 4 --- .../webmagic/model/PageModelExtractor.java | 26 +++++----------- .../webmagic/model/annotation/ExtractBy.java | 4 +-- .../webmagic/model/annotation/ExtractBy2.java | 5 ++-- .../webmagic/model/annotation/ExtractBy3.java | 4 +-- .../model/annotation/ExtractByRaw.java | 4 +-- webmagic-saxon/README.md | 3 ++ webmagic-saxon/pom.xml | 30 +++++++++++++++++++ .../webmagic/selector/Xpath2Selector.java | 0 .../webmagic/selector/XpathSelectorTest.java | 17 ----------- 11 files changed, 50 insertions(+), 48 deletions(-) create mode 100644 webmagic-saxon/README.md create mode 100644 webmagic-saxon/pom.xml rename {webmagic-extension => webmagic-saxon}/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java (100%) rename {webmagic-extension => webmagic-saxon}/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java (99%) diff --git a/pom.xml b/pom.xml index 1497bb0c5..cb354e290 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ webmagic-samples/ webmagic-selenium/ webmagic-lucene/ + webmagic-saxon/
      diff --git a/webmagic-extension/pom.xml b/webmagic-extension/pom.xml index 843c2c3c1..63034f235 100644 --- a/webmagic-extension/pom.xml +++ b/webmagic-extension/pom.xml @@ -27,10 +27,6 @@ webmagic-core ${project.version} - - net.sf.saxon - Saxon-HE - junit junit diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index 445bdd92f..158e74d11 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -110,11 +110,8 @@ private FieldExtractor getAnnotationExtractBy(Class clazz, Field field) { case XPath: selector = new XpathSelector(value); break; - case XPath2: - selector = new Xpath2Selector(value); - break; default: - selector = new Xpath2Selector(value); + selector = new XpathSelector(value); } fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.Html, extractBy.notNull(), extractBy.multi()); Method setterMethod = getSetterMethod(clazz, field); @@ -140,11 +137,8 @@ private void addAnnotationExtractBy2(FieldExtractor fieldExtractor) { case XPath: selector = new XpathSelector(value); break; - case XPath2: - selector = new Xpath2Selector(value); - break; default: - selector = new Xpath2Selector(value); + selector = new XpathSelector(value); } fieldExtractor.setSelector(new AndSelector(fieldExtractor.getSelector(), selector)); } @@ -165,11 +159,8 @@ private void addAnnotationExtractBy3(FieldExtractor fieldExtractor) { case XPath: selector = new XpathSelector(value); break; - case XPath2: - selector = new Xpath2Selector(value); - break; default: - selector = new Xpath2Selector(value); + selector = new XpathSelector(value); } fieldExtractor.setSelector(new AndSelector(fieldExtractor.getSelector(), selector)); } @@ -191,11 +182,8 @@ private FieldExtractor getAnnotationExtractByRaw(Class clazz, Field field) { case XPath: selector = new XpathSelector(value); break; - case XPath2: - selector = new Xpath2Selector(value); - break; default: - selector = new Xpath2Selector(value); + selector = new XpathSelector(value); } fieldExtractor = new FieldExtractor(field, selector, FieldExtractor.Source.RawHtml, extractByRaw.notNull(), extractByRaw.multi()); Method setterMethod = getSetterMethod(clazz, field); @@ -228,7 +216,7 @@ private void initClassExtractors() { targetUrlPatterns.add(Pattern.compile("(" + s.replace(".", "\\.").replace("*", "[^\"'#]*") + ")")); } if (!targetUrl.sourceRegion().equals("")) { - targetUrlRegionSelector = new Xpath2Selector(targetUrl.sourceRegion()); + targetUrlRegionSelector = new XpathSelector(targetUrl.sourceRegion()); } } annotation = clazz.getAnnotation(HelpUrl.class); @@ -239,13 +227,13 @@ private void initClassExtractors() { helpUrlPatterns.add(Pattern.compile("(" + s.replace(".", "\\.").replace("*", "[^\"'#]*") + ")")); } if (!helpUrl.sourceRegion().equals("")) { - helpUrlRegionSelector = new Xpath2Selector(helpUrl.sourceRegion()); + helpUrlRegionSelector = new XpathSelector(helpUrl.sourceRegion()); } } annotation = clazz.getAnnotation(ExtractBy.class); if (annotation != null) { ExtractBy extractBy = (ExtractBy) annotation; - extractor = new Extractor(new Xpath2Selector(extractBy.value()), Extractor.Source.Html, extractBy.notNull(), extractBy.multi()); + extractor = new Extractor(new XpathSelector(extractBy.value()), Extractor.Source.Html, extractBy.notNull(), extractBy.multi()); } } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java index af8946a1a..2fcdb82e5 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java @@ -16,9 +16,9 @@ String value(); - public enum Type {XPath2, XPath, Regex, Css} + public enum Type {XPath, Regex, Css} - Type type() default Type.XPath2; + Type type() default Type.XPath; boolean notNull() default true; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java index f68b7d64c..ad720b3a0 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java @@ -6,6 +6,7 @@ /** * 定义类或者字段的抽取规则。
      + * * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      @@ -16,8 +17,8 @@ String value(); - public enum Type {XPath2, XPath, Regex, Css} + public enum Type {XPath, Regex, Css} - Type type() default Type.XPath2; + Type type() default Type.XPath; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java index f3212a6a9..023360ef6 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java @@ -16,8 +16,8 @@ String value(); - public enum Type {XPath2, XPath, Regex, Css} + public enum Type { XPath, Regex, Css} - Type type() default Type.XPath2; + Type type() default Type.XPath; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java index 96927320e..1bd3da1ef 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java @@ -16,9 +16,9 @@ String value(); - public enum Type {XPath2, XPath, Regex, Css} + public enum Type {XPath, Regex, Css} - Type type() default Type.XPath2; + Type type() default Type.XPath; boolean notNull() default true; diff --git a/webmagic-saxon/README.md b/webmagic-saxon/README.md new file mode 100644 index 000000000..0471c68b6 --- /dev/null +++ b/webmagic-saxon/README.md @@ -0,0 +1,3 @@ +webmagic-extension +------- +webmagic的扩展模块,依赖Saxon进行xpath2.0解析支持。Saxon依赖包太大,不作为默认模块引入。 \ No newline at end of file diff --git a/webmagic-saxon/pom.xml b/webmagic-saxon/pom.xml new file mode 100644 index 000000000..a2db76851 --- /dev/null +++ b/webmagic-saxon/pom.xml @@ -0,0 +1,30 @@ + + + + us.codecraft + webmagic + 0.2.0 + + 4.0.0 + + webmagic-saxon + + + + us.codecraft + webmagic-core + ${project.version} + + + net.sf.saxon + Saxon-HE + + + junit + junit + + + + \ No newline at end of file diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java b/webmagic-saxon/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java similarity index 100% rename from webmagic-extension/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java rename to webmagic-saxon/src/main/java/us/codecraft/webmagic/selector/Xpath2Selector.java diff --git a/webmagic-extension/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java b/webmagic-saxon/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java similarity index 99% rename from webmagic-extension/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java rename to webmagic-saxon/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java index 9f32a8f14..b62304069 100644 --- a/webmagic-extension/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java +++ b/webmagic-saxon/src/test/java/us/codecraft/webmagic/selector/XpathSelectorTest.java @@ -1,25 +1,8 @@ package us.codecraft.webmagic.selector; -import net.sf.saxon.Configuration; -import net.sf.saxon.lib.NamespaceConstant; -import net.sf.saxon.om.NamespaceResolver; -import net.sf.saxon.pull.NamespaceContextImpl; -import net.sf.saxon.xpath.JAXPXPathStaticContext; -import net.sf.saxon.xpath.XPathEvaluator; -import net.sf.saxon.xpath.XPathFactoryImpl; -import org.htmlcleaner.CleanerProperties; -import org.htmlcleaner.DomSerializer; -import org.htmlcleaner.HtmlCleaner; -import org.htmlcleaner.TagNode; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import org.w3c.dom.Document; -import org.w3c.dom.NodeList; - -import javax.xml.xpath.*; -import java.util.Collections; -import java.util.Iterator; /** * @author code4crafter@gmail.com
      Date: 13-4-21 Time: 上午10:06 From b96290ffcfaeed8a47e48668407c42ab3eefc858 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 23:32:22 +0800 Subject: [PATCH 157/175] remove freemarker dep --- webmagic-samples/pom.xml | 5 -- .../webmagic/pipeline/FreemarkerPipeline.java | 57 ------------------- 2 files changed, 62 deletions(-) delete mode 100644 webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java diff --git a/webmagic-samples/pom.xml b/webmagic-samples/pom.xml index d8963ff47..9d00d2f0c 100644 --- a/webmagic-samples/pom.xml +++ b/webmagic-samples/pom.xml @@ -22,11 +22,6 @@ webmagic-extension ${project.version}
      - - org.freemarker - freemarker - 2.3.15 - junit junit diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java deleted file mode 100644 index 37420628f..000000000 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/pipeline/FreemarkerPipeline.java +++ /dev/null @@ -1,57 +0,0 @@ -package us.codecraft.webmagic.pipeline; - -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import org.apache.commons.codec.digest.DigestUtils; -import us.codecraft.webmagic.ResultItems; -import us.codecraft.webmagic.Task; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * @author code4crafter@gmail.com
      - * Date: 13-6-8 - * Time: 下午9:00 - */ -public class FreemarkerPipeline implements Pipeline { - - private Configuration configuration; - - private Template template; - - private String path = "/data/temp/webmagic/ftl/"; - - public FreemarkerPipeline(String template, String path) throws IOException { - configuration = new Configuration(); - configuration.setDirectoryForTemplateLoading(new File(this.getClass().getClassLoader().getResource("ftl/").getFile())); - this.template = configuration.getTemplate(template); - this.path = path; - new File(path); - } - - public FreemarkerPipeline(String template) throws IOException { - this(template, "/data/temp/webmagic/ftl/"); - } - - - @Override - public void process(ResultItems resultItems, Task task) { - String path = this.path + "" + task.getUUID() + "/"; - File file = new File(path); - if (!file.exists()) { - file.mkdirs(); - } - try { - PrintWriter printWriter = new PrintWriter(new FileWriter(path + DigestUtils.md5Hex(resultItems.getRequest().getUrl()) + ".html")); - template.process(resultItems.getAll(), printWriter); - printWriter.close(); - } catch (TemplateException e) { - } catch (IOException e) { - e.printStackTrace(); - } - } -} From 86be758c0d70c6b8ef961ebddd1f257fa29595f5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 23:33:10 +0800 Subject: [PATCH 158/175] remove freemarker --- .../processor/DiandianProcessorTest.java | 37 ------------------- 1 file changed, 37 deletions(-) delete mode 100644 webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java deleted file mode 100644 index cf587f1d0..000000000 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiandianProcessorTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package us.codecraft.webmagic.processor; - -import org.junit.Ignore; -import org.junit.Test; -import us.codecraft.webmagic.Spider; -import us.codecraft.webmagic.pipeline.ConsolePipeline; -import us.codecraft.webmagic.pipeline.FreemarkerPipeline; -import us.codecraft.webmagic.samples.DiandianBlogProcessor; -import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; - -import java.io.IOException; - -/** - * @author code4crafter@gmail.com
      - * Date: 13-6-9 - * Time: 上午8:02 - */ -public class DiandianProcessorTest { - - @Ignore - @Test - public void test() throws IOException { - DiandianBlogProcessor diaoyuwengProcessor = new DiandianBlogProcessor(); - //pipeline是抓取结束后的处理 - //ftl文件放到classpath:ftl/文件夹下 - //默认放到/data/temp/webmagic/ftl/[domain]目录下 - FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl"); - //Spider.me()是简化写法,其实就是new一个啦 - //Spider.pipeline()设定一个pipeline,支持链式调用 - //ConsolePipeline输出结果到控制台 - //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录 - //Spider.run()执行 - - Spider.create(diaoyuwengProcessor).pipeline(new ConsolePipeline()).pipeline(pipeline).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). - run(); - } -} From 68fc832ce4395eb1dad0c115d841a32b48792edf Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Wed, 7 Aug 2013 23:36:48 +0800 Subject: [PATCH 159/175] remove freemarker dp --- .../webmagic/processor/DiaoyuwengProcessorTest.java | 4 ++-- .../webmagic/processor/SinablogProcessorTest.java | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java index 69a535c68..0371eb23c 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/DiaoyuwengProcessorTest.java @@ -4,7 +4,7 @@ import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; -import us.codecraft.webmagic.pipeline.FreemarkerPipeline; +import us.codecraft.webmagic.pipeline.JsonFilePipeline; import us.codecraft.webmagic.samples.DiaoyuwengProcessor; import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; @@ -21,7 +21,7 @@ public class DiaoyuwengProcessorTest { @Test public void test() throws IOException { DiaoyuwengProcessor diaoyuwengProcessor = new DiaoyuwengProcessor(); - FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl"); + JsonFilePipeline pipeline = new JsonFilePipeline("/data/webmagic/"); Spider.create(diaoyuwengProcessor).pipeline(new FilePipeline()).pipeline(pipeline).scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")). run(); } diff --git a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java index a44fe35b5..026f8d5f7 100644 --- a/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java +++ b/webmagic-samples/src/test/java/us/codecraft/webmagic/processor/SinablogProcessorTest.java @@ -4,7 +4,7 @@ import org.junit.Test; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; -import us.codecraft.webmagic.pipeline.FreemarkerPipeline; +import us.codecraft.webmagic.pipeline.JsonFilePipeline; import us.codecraft.webmagic.samples.SinaBlogProcesser; import us.codecraft.webmagic.scheduler.FileCacheQueueScheduler; @@ -22,9 +22,8 @@ public class SinablogProcessorTest { public void test() throws IOException { SinaBlogProcesser sinaBlogProcesser = new SinaBlogProcesser(); //pipeline是抓取结束后的处理 - //ftl文件放到classpath:ftl/文件夹下 - //默认放到/data/temp/webmagic/ftl/[domain]目录下 - FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl"); + //默认放到/data/webmagic/ftl/[domain]目录下 + JsonFilePipeline pipeline = new JsonFilePipeline("/data/webmagic/"); //Spider.me()是简化写法,其实就是new一个啦 //Spider.pipeline()设定一个pipeline,支持链式调用 //ConsolePipeline输出结果到控制台 From 8dc9cf43ac208ee80bbb60c1961fe099f2b98b2d Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 8 Aug 2013 13:10:05 +0800 Subject: [PATCH 160/175] update notnull default to false --- .../java/us/codecraft/webmagic/model/annotation/ExtractBy.java | 2 +- .../us/codecraft/webmagic/model/annotation/ExtractByRaw.java | 2 +- .../us/codecraft/webmagic/model/annotation/ExtractByUrl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java index 2fcdb82e5..bcd570642 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java @@ -20,7 +20,7 @@ public enum Type {XPath, Regex, Css} Type type() default Type.XPath; - boolean notNull() default true; + boolean notNull() default false; boolean multi() default false; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java index 1bd3da1ef..f774d3e92 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java @@ -20,7 +20,7 @@ public enum Type {XPath, Regex, Css} Type type() default Type.XPath; - boolean notNull() default true; + boolean notNull() default false; boolean multi() default false; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java index 52f4a57ae..d57ec6ebb 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java @@ -16,7 +16,7 @@ String value() default ""; - boolean notNull() default true; + boolean notNull() default false; boolean multi() default false; From 2e5ff3c5eb19accb5985fcf8cf7ebb5210cff3f1 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Thu, 8 Aug 2013 13:53:04 +0800 Subject: [PATCH 161/175] remove uncore package from pom --- pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/pom.xml b/pom.xml index cb354e290..cacce99b3 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,6 @@ webmagic-core webmagic-extension/ webmagic-samples/ - webmagic-selenium/ - webmagic-lucene/ - webmagic-saxon/ From 0dd2df6e8cf897c1c15c6da3dcb4cd743ea1dc6b Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 00:03:14 +0800 Subject: [PATCH 162/175] add manual --- webmagic manual.md | 246 ++++++++++++++++++ .../webmagic/model/samples/OschinaBlog.java | 27 +- .../samples/OschinaBlogPageProcesser.java | 22 +- 3 files changed, 270 insertions(+), 25 deletions(-) create mode 100644 webmagic manual.md diff --git a/webmagic manual.md b/webmagic manual.md new file mode 100644 index 000000000..e275f7303 --- /dev/null +++ b/webmagic manual.md @@ -0,0 +1,246 @@ +webmagic使用手册 +------ +>webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。 + +>web爬虫是一种技术,webmagic致力于将这种技术的实现成本降低,但是出于对资源提供者的尊重,webmagic不会做反封锁的事情,包括:验证码破解、代理切换、自动登录、抓取静态资源等。 + +>作者黄亿华([code4crafter@gmail.com](code4crafter@gmail.com))目前就职于大众点评,曾经在前公司进行过一年的垂直爬虫的开发。webmagic就是为了解决爬虫开发的一些重复劳动而产生的框架。有使用不便或者问题,欢迎在github[提交issue](https://github.com/code4craft/webmagic/issues),或者在[oschina讨论模块](http://www.oschina.net/question)提问。 + +>webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: + +>python爬虫 **scrapy** [https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) + +>Java爬虫 **Spiderman** [https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) + +--------- + +## 快速开始 + +### 使用maven + +webmagic使用maven管理依赖,你可以直接下载webmagic源码进行编译: + + git clone https://github.com/code4craft/webmagic.git + mvn clean install + +安装后,在项目中添加对应的依赖即可使用webmagic: + + + us.codecraft + webmagic-core + 0.2.0 + + + us.codecraft + webmagic-extension + 0.2.0 + + +#### 项目结构 + +webmagic主要包括两个包: + +* **webmagic-core** + + webmagic核心部分,只包含爬虫基本模块和基本抽取器。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。 + +* **webmagic-extension** + + webmagic的扩展模块,提供一些更方便的编写爬虫的工具。包括注解格式定义爬虫、JSON、分布式等支持。 + +webmagic还包含两个可用的扩展包,因为这两个包都依赖了比较重量级的工具,所以从主要包中抽离出来: + +* **webmagic-saxon** + + webmagic与Saxon结合的模块。Saxon是一个XPath、XSLT的解析工具,webmagic依赖Saxon来进行XPath2.0语法解析支持。 + +* **webmagic-selenium** + + webmagic与Selenium结合的模块。Selenium是一个模拟浏览器进行页面渲染的工具,webmagic依赖Selenium进行动态页面的抓取。 + +在项目中,你可以根据需要依赖不同的包。 + +### 不使用maven + +不使用maven的用户,可以下载这个二进制打包版本(感谢[oschina](http://www.oschina.net/)): + + git clone http://git.oschina.net/flashsword20/webmagic-bin.git + +在`bin/lib`目录下,有项目依赖的所有jar包,直接在IDE里import即可。 + +### 第一个爬虫 + +#### 定制PageProcessor + +PageProcessor是webmagic-core的一部分,定制一个PageProcessor即可实现自己的爬虫逻辑。以下是抓取osc博客的一段代码: + + public class OschinaBlogPageProcesser implements PageProcessor { + + private Site site = Site.me().setDomain("my.oschina.net") + .addStartUrl("http://my.oschina.net/flashsword/blog"); + + @Override + public void process(Page page) { + List links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").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()); + } + + @Override + public Site getSite() { + return site; + + } + + public static void main(String[] args) { + Spider.create(new OschinaBlogPageProcesser()) + .pipeline(new ConsolePipeline()).run(); + } + } + +这里通过page.addTargetRequests()方法来增加要抓取的URL,并通过page.putField()来保存抽取结果。page.getHtml().xpath()则是按照某个规则对结果进行抽取,这里抽取支持链式调用。调用结束后,toString()表示转化为单个String,all()则转化为一个String列表。 + +Spider是爬虫的入口类。Pipeline是结果输出和持久化的接口,这里ConsolePipeline表示结果输出到控制台。 + +执行这个main方法,即可在控制台看到抓取结果。webmagic默认有3秒抓取间隔,请耐心等待。 + +#### 使用注解 + +PageProcessor的方式灵活、强大,但是没有解决两个问题: + +* 对于一个站点,如果想抓取多种格式的URL,那么必须在PageProcesser中写判断逻辑,代码难以管理。 +* 抓取结果没有对应Model,并不符合Java程序开发习惯,与一些框架也无法很好整合。 + +webmagic-extension包括了注解方式编写爬虫的方法,只需基于一个POJO增加注解即可完成一个爬虫。以下仍然是抓取oschina博客的一段代码,功能与OschinaBlogPageProcesser完全相同: + + @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") + public class OschinaBlog { + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) + private String content; + + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List tags; + + public static void main(String[] args) { + OOSpider.create( + Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), + new ConsolePageModelPipeline(), OschinaBlog.class).run(); + } + } + +这个例子定义了一个Model类,Model类的字段'title'、'content'、'tags'均为要抽取的属性。这个类在Pipeline里是可以复用的。 + +"TargetUrl"关键词表示要抓取的URL,这里使用了正则表达式,匹配 "http://my.oschina.net/flashsword/blog/150039" 格式的URL。webmagic对正则表达式进行了修改,"."仅表示字符"."而不代表任意字符,而"\*"则代表了".\*",例如"http://\*.oschina.net/\*"代表了oschina所有的二级域名下的URL。 + +"ExtractBy"关键词定义了字段抽取的规则。抽取的规则默认使用[**XPath**](http://www.w3school.com.cn/xpath/),也可以选择使用CSS Selector、正则表达式。使用"ExtractBy"注解提取的字段(设置type),目前只能为String或者List类型(multi=true时有效)。"ExtractBy"支持链式抽取,通过增加注解"ExtractBy2"、"ExtractBy3"实现。 + +OOSpider是注解式爬虫的入口,这里调用create()方法将OschinaBlog这个类加入到爬虫的抽取中,这里是可以传入多个类的,OOSpider会根据TargetUrl调用不同的Model进行解析。 + +可以通过定义PageModelPipeline来选择结果输出方式。这里new ConsolePageModelPipeline()是PageModelPipeline的一个实现,会将结果输出到控制台。 + +注解方式其实也是通过一个PageProcessor的实现--ModelPageProcessor完成,因此对webmagic-core代码没有任何影响。 + +## 核心架构解析 + +webmagic-core是爬虫的核心框架。此部分摘自作者的博文 +[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796)。 + +### webmagic-core的模块划分 + +webmagic-core参考了scrapy的模块划分,分为Spider(整个爬虫的调度框架)、Downloader(页面下载)、PageProcessor(链接提取和页面分析)、Scheduler(URL管理)、Pipeline(离线分析和持久化)几部分。只不过scrapy通过middleware实现扩展,而webmagic则通过定义这几个接口,并将其不同的实现注入主框架类Spider来实现扩展。 + +![image](http://code4craft.github.io/images/posts/webmagic.png) + +#### Spider类(核心调度) + +Spider是爬虫的入口类,Spider的接口调用采用了链式的API设计,其他功能全部通过接口注入Spider实现,下面是启动一个比较复杂的Spider的例子。 + + + Spider.create(sinaBlogProcessor) + .scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")) + .pipeline(new FilePipeline()) + .thread(10).run(); + + +Spider的核心处理流程非常简单,代码如下: + + + private void processRequest(Request request) { + Page page = downloader.download(request, this); + if (page == null) { + sleep(site.getSleepTime()); + return; + } + pageProcessor.process(page); + addRequest(page); + for (Pipeline pipeline : pipelines) { + pipeline.process(page, this); + } + sleep(site.getSleepTime()); + } + +#### Downloader(页面下载) + +大部分爬虫都是通过模拟http请求,接收并分析响应来完成。这方面,JDK自带的**HttpURLConnection**可以满足最简单的需要,而**Apache HttpClient**(4.0后整合到HttpCompenent项目中)则是开发复杂爬虫的不二之选。它支持自定义HTTP头(对于爬虫比较有用的就是User-agent、cookie等)、自动redirect、连接复用、cookie保留、设置代理等诸多强大的功能。 + +webmagic使用了HttpClient 4.2,并封装到了**HttpClientDownloader**。学习HttpClient的使用对于构建高性能爬虫是非常有帮助的,官方的[Tutorial](http://hc.apache.org/httpcomponents-client-ga/tutorial/html/)就是很好的学习资料。目前webmagic对HttpClient的使用仍在初步阶段,不过对于一般抓取任务,已经够用了。 + +对于一些Javascript动态加载的网页,仅仅使用http模拟下载工具,并不能取到页面的内容。这方面的思路有两种:一种是抽丝剥茧,分析js的逻辑,再用爬虫去重现它(比如在网页中提取关键数据,再用这些数据去构造Ajax请求,最后直接从响应体获取想要的数据); +另一种就是:内置一个浏览器,直接获取最后加载完的页面。这方面,js可以使用**PhantomJS**,它内部集成了webkit。而Java可以使用**Selenium**,这是一个非常强大的浏览器模拟工具。webmagic-selenium包中整合了Selenium到`SeleniumDownloader`,可以直接进行动态加载页面的抓取。 + +#### PageProcessor(页面分析及链接抽取) + +页面分析可以说是垂直爬虫最复杂的一部分,在webmagic里,PageProcessor是定制爬虫的核心。通过编写一个实现PageProcessor接口的类,就可以定制一个自己的爬虫。 + +**Selector**是webmagic为了简化页面抽取开发的独立模块,是webmagic的主要着力点。这里整合了CSS Selector、XPath和正则表达式,并可以进行链式的抽取,很容易就实现强大的功能。即使你使用自己开发的爬虫工具,webmagic的Selector仍然值得一试。 + +例如,我已经下载了一个页面,现在要抽取某个区域的所有包含"blog"的链接,我可以这样写: + + + //content是用别的爬虫工具抽取到的正文 + String content = "blabla"; + List links = Html.create(content) + .$("div.title") //css 选择,Java里虽然很少有$符号出现,不过貌似$作为方法名是合法的 + .xpath("//@href") //提取链接 + .regex(".*blog.*") //正则匹配过滤 + .all(); //转换为string列表 + + +另外,webmagic的抓取链接需要显示的调用`Page.addTargetRequests()`去添加,这也是为了灵活性考虑的(很多时候,下一步的URL不是单纯的页面href链接,可能会根据页面模块进行抽取,甚至可能是自己拼凑出来的)。 + +webmagic包括一个对于页面正文的自动抽取的功能**SmartContentSelector**。相信用过Evernote Clearly都会对其自动抽取正文的技术印象深刻。这个技术又叫**Readability**。当然webmagic对Readability的实现还比较粗略,但是仍有一些学习价值。 + +基于Saxon,webmagic提供了XPath2.0语法的支持。XPath2.0语法支持内部函数、逻辑控制等,是一门完整的语言,如果你熟悉语法,倒是不妨一试(需要引入webmagic-saxon包)。 + +#### Scheduler(URL管理) + + +URL管理的问题可大可小。对于小规模的抓取,URL管理是很简单的。我们只需要将待抓取URL和未抓取URL分开保存,并进行去重即可。使用JDK内置的集合类型Set、List或者Queue都可以满足需要。如果我们要进行多线程抓取,则可以选择线程安全的容器,例如LinkedBlockingQueue以及ConcurrentHashMap。 + +因为小规模的URL管理非常简单,很多框架都并不将其抽象为一个模块,而是直接融入到代码中。但是实际上,抽象出Scheduler模块,会使得框架的解耦程度上升一个档次,并非常容易进行横向扩展,这也是我从scrapy中学到的。 + +在webmagic的设计中,除了Scheduler模块,其他的处理-从下载、解析到持久化,每个任务都是互相独立的,因此可以通过多个Spider共用一个Scheduler来进行扩展。排除去重的因素,URL管理天生就是一个队列,我们可以很方便的用分布式的队列工具去扩展它,也可以基于mysql、redis或者mongodb这样的存储工具来构造一个队列,这样构建一个多线程乃至分布式的爬虫就轻而易举了。 + +URL去重也是一个比较复杂的问题。如果数据量较少,则使用hash的方式就能很好解决。数据量较大的情况下,可以使用Bloom Filter或者更复杂的方式。 + +webmagic目前有两个Scheduler的实现,**QueueScheduler**是一个简单的内存队列,速度较快,并且是线程安全的,**FileCacheQueueScheduler**则是一个文件队列,它可以用于耗时较长的下载任务,在任务中途停止后,下次执行仍然从中止的URL开始继续爬取。 + +webmagic有一个基于redis的Scheduler实现**RedisScheduler**。通过使用同一台redis服务器存储URL,webmagic可以很容易的在多机部署,从而达到分布式爬虫的效果。 + + +#### Pipeline-离线处理和持久化 + + +Pipeline其实也是容易被忽略的一部分。大家都知道持久化的重要性,但是很多框架都选择直接在页面抽取的时候将持久化一起完成,例如crawer4j。但是Pipeline真正的好处是,将页面的在线分析和离线处理拆分开来,可以在一些线程里进行下载,另一些线程里进行处理和持久化。 + +你可以扩展Pipeline来实现抽取结果的持久化,将其保存到你想要保存的地方-本地文件、数据库、mongodb等等。Pipeline的处理目前还是在线的,但是修改为离线的也并不困难。 + +webmagic目前只支持控制台输出和文件持久化,但是持久化到数据库也是很容易的。这里不妨看一下[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。因为JFinal目前还不支持maven,所以并没有放到webmagic-samples里来。 + +## 示例 \ No newline at end of file diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java index 64094925b..95a789157 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java @@ -1,10 +1,12 @@ package us.codecraft.webmagic.model.samples; import us.codecraft.webmagic.Site; -import us.codecraft.webmagic.model.annotation.ExtractBy; +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.TargetUrl; -import us.codecraft.webmagic.pipeline.JsonFilePipeline; + +import java.util.List; /** * @author code4crafter@gmail.com
      @@ -12,7 +14,7 @@ * Time: 上午7:52
      */ @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") -public class OschinaBlog implements Blog{ +public class OschinaBlog { @ExtractBy("//title") private String title; @@ -20,23 +22,12 @@ public class OschinaBlog implements Blog{ @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) private String content; - @Override - public String toString() { - return "OschinaBlog{" + - "title='" + title + '\'' + - ", content='" + content + '\'' + - '}'; - } + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List tags; public static void main(String[] args) { - OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), OschinaBlog.class).pipeline(new JsonFilePipeline()).run(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog") + ,new ConsolePageModelPipeline(), OschinaBlog.class).run(); } - public String getTitle() { - return title; - } - - public String getContent() { - return content; - } } diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java index f2dbe8e10..8ba7063b0 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/OschinaBlogPageProcesser.java @@ -2,6 +2,8 @@ import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; +import us.codecraft.webmagic.Spider; +import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.processor.PageProcessor; import java.util.List; @@ -13,18 +15,24 @@ */ public class OschinaBlogPageProcesser implements PageProcessor { + private Site site = Site.me().setDomain("my.oschina.net").addStartUrl("http://my.oschina.net/flashsword/blog"); + @Override public void process(Page page) { - List strings = page.getHtml().links().regex("(http://my\\.oschina\\.net)").all(); - page.addTargetRequests(strings); - page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1")); - page.putField("content", page.getHtml().smartContent()); - page.putField("author", page.getUrl().regex("my\\.oschina\\.net/(\\w+)/blog/\\d+")); + List links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").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()); } @Override public Site getSite() { - return Site.me().setDomain("my.oschina.net").addStartUrl("http://www.oschina.net/"). - setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); + return site; + + } + + public static void main(String[] args) { + Spider.create(new OschinaBlogPageProcesser()).pipeline(new ConsolePipeline()).run(); } } From f14fe59192f76f5ef6a00baf496de5c05c91ea3d Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 00:48:35 +0800 Subject: [PATCH 163/175] update manual --- webmagic manual.md | 86 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/webmagic manual.md b/webmagic manual.md index e275f7303..9d243c0e9 100644 --- a/webmagic manual.md +++ b/webmagic manual.md @@ -108,11 +108,6 @@ Spider是爬虫的入口类。Pipeline是结果输出和持久化的接口,这 #### 使用注解 -PageProcessor的方式灵活、强大,但是没有解决两个问题: - -* 对于一个站点,如果想抓取多种格式的URL,那么必须在PageProcesser中写判断逻辑,代码难以管理。 -* 抓取结果没有对应Model,并不符合Java程序开发习惯,与一些框架也无法很好整合。 - webmagic-extension包括了注解方式编写爬虫的方法,只需基于一个POJO增加注解即可完成一个爬虫。以下仍然是抓取oschina博客的一段代码,功能与OschinaBlogPageProcesser完全相同: @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") @@ -136,19 +131,15 @@ webmagic-extension包括了注解方式编写爬虫的方法,只需基于一 这个例子定义了一个Model类,Model类的字段'title'、'content'、'tags'均为要抽取的属性。这个类在Pipeline里是可以复用的。 -"TargetUrl"关键词表示要抓取的URL,这里使用了正则表达式,匹配 "http://my.oschina.net/flashsword/blog/150039" 格式的URL。webmagic对正则表达式进行了修改,"."仅表示字符"."而不代表任意字符,而"\*"则代表了".\*",例如"http://\*.oschina.net/\*"代表了oschina所有的二级域名下的URL。 - -"ExtractBy"关键词定义了字段抽取的规则。抽取的规则默认使用[**XPath**](http://www.w3school.com.cn/xpath/),也可以选择使用CSS Selector、正则表达式。使用"ExtractBy"注解提取的字段(设置type),目前只能为String或者List类型(multi=true时有效)。"ExtractBy"支持链式抽取,通过增加注解"ExtractBy2"、"ExtractBy3"实现。 - -OOSpider是注解式爬虫的入口,这里调用create()方法将OschinaBlog这个类加入到爬虫的抽取中,这里是可以传入多个类的,OOSpider会根据TargetUrl调用不同的Model进行解析。 +关于注解的使用方式,在后面会专门讲到。 -可以通过定义PageModelPipeline来选择结果输出方式。这里new ConsolePageModelPipeline()是PageModelPipeline的一个实现,会将结果输出到控制台。 - -注解方式其实也是通过一个PageProcessor的实现--ModelPageProcessor完成,因此对webmagic-core代码没有任何影响。 +------ ## 核心架构解析 -webmagic-core是爬虫的核心框架。此部分摘自作者的博文 +webmagic-core是爬虫的核心框架,只包括一个爬虫各功能模块的核心功能。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。 + +此节部分内容摘自作者的博文 [webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796)。 ### webmagic-core的模块划分 @@ -243,4 +234,69 @@ Pipeline其实也是容易被忽略的一部分。大家都知道持久化的重 webmagic目前只支持控制台输出和文件持久化,但是持久化到数据库也是很容易的。这里不妨看一下[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。因为JFinal目前还不支持maven,所以并没有放到webmagic-samples里来。 -## 示例 \ No newline at end of file +------ + +## 注解模块 + +webmagic-extension包括注解模块。为什么会有注解方式? + +因为PageProcessor的方式灵活、强大,但是没有解决两个问题: + +* 对于一个站点,如果想抓取多种格式的URL,那么必须在PageProcesser中写判断逻辑,代码难以管理。 +* 抓取结果没有对应Model,并不符合Java程序开发习惯,与一些框架也无法很好整合。 + +注解的核心是Model类,本身是一个POJO,这个Model类用于传递、保存页面最终抓取结果数据。注解方式直接将抽取与数据绑定,以便于编写和维护。 + +注解方式其实也是通过一个PageProcessor的实现--ModelPageProcessor完成,因此对webmagic-core代码没有任何影响。 + +注解部分包括以下内容: + +* ### TargetUrl + + "TargetUrl"表示这个Model对应要抓取的URL,它包含两层意思:符合这个条件的URL会被加入抓取队列;符合这个条件的URL会被这个Model抓取。TargetUrl可以`sourceRegion`指定提取URL的区域(仅支持XPath)。 + + TargetUrl使用了正则表达式,匹配 "http://my.oschina.net/flashsword/blog/150039" 格式的URL。webmagic对正则表达式进行了修改,"."仅表示字符"."而不代表任意字符,而"\*"则代表了".\*",例如"http://\*.oschina.net/\*"代表了oschina所有的二级域名下的URL。 + + 与TargetUrl相似的还有`HelpUrl`,HelpUrl表示:仅仅抓取该URL用作链接提取,并不对它进行内容抽取。例如博客正文页对应TargetUrl,而列表页则对应HelpUrl。 + +* ### ExtractBy + + * #### 用于字段 + + "ExtractBy"可用于类以及字段。用于字段时,定义了字段抽取的规则。抽取的规则默认使用[**XPath**](http://www.w3school.com.cn/xpath/),也可以选择使用CSS Selector、正则表达式(通过设置type)。 + + ExtractBy还有几个扩展属性。`multi`表示是否抽取列表,当然,设置为multi时,你需要一个List字段去容纳它。`notnull`则表示,此字段不允许为null,若为null则放弃整个对象。 + + * #### 用于类 + "ExtractBy"用于类时,则限定了字段抽取的区域。用于类时仍支持multi,multi则表示一个页面可以抽取到多个对象。 + + * #### ExtractByRaw & ExtractByUrl + + 在类使用"ExtractBy"修饰后,字段的"ExtractBy"使用的是其抽取的结果,如果仍然想要抽取原HTML,可以使用"ExtractByRaw"。与此类似的还有"ExtractByUrl",表示从URL重抽取信息。ExtractByUrl只支持正则表达式。 + + * #### ExtractBy2 ExtractBy3 + + "ExtractBy"、"ExtractByRaw"支持链式抽取,通过增加注解"ExtractBy2"、"ExtractBy3"实现。 + +* ### AfterExtractor + + AfterExtractor接口是对注解方式抽取能力不足的补充。实现AfterExtractor接口后,会在**使用注解方式填充完字段后**调用`afterProcess()`方法,在这个方法中可以直接访问已抽取的字段、补充需要抽取的字段,甚至做一些简单的输出和持久化操作(并不是很建议这么做)。这部分可以参考[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。 + +* ### OOSpider + OOSpider是注解式爬虫的入口,这里调用`create()`方法将OschinaBlog这个类加入到爬虫的抽取中,这里是可以传入多个类的,OOSpider会根据TargetUrl调用不同的Model进行解析。 + +* ### PageModelPipeline + 可以通过定义PageModelPipeline来选择结果输出方式。这里new ConsolePageModelPipeline()是PageModelPipeline的一个实现,会将结果输出到控制台。 + +* ### 分页 + 处理单项数据分页(例如单条新闻多个页面)是爬虫一个比较头疼的问题。webmagic有一个对于分页的实现,通过实现`PagedModel`接口即可。webmagic-samples里有一个抓取网易新闻的类:`us.codecraft.webmagic.model.samples.News163`。关于分页,这里有一篇对于webmagic分页实现的详细说明的文章[关于爬虫实现分页的一些思考](http://my.oschina.net/flashsword/blog/150039)。 + 目前分页功能还没有分布式实现。 + +-------- + +## 分布式 + webmagic-extension中,通过redis来管理URL,达到分布式的效果。具体实现方式只有一个类:`us.codecraft.webmagic.scheduler.RedisScheduler`。 + + + + From 81ccf48ca276df5d6a9d3bfab32768f06f46e998 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 00:49:32 +0800 Subject: [PATCH 164/175] update manual --- webmagic manual.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webmagic manual.md b/webmagic manual.md index 9d243c0e9..d009a976e 100644 --- a/webmagic manual.md +++ b/webmagic manual.md @@ -295,7 +295,8 @@ webmagic-extension包括注解模块。为什么会有注解方式? -------- ## 分布式 - webmagic-extension中,通过redis来管理URL,达到分布式的效果。具体实现方式只有一个类:`us.codecraft.webmagic.scheduler.RedisScheduler`。 + +webmagic-extension中,通过redis来管理URL,达到分布式的效果。具体实现方式只有一个类:`us.codecraft.webmagic.scheduler.RedisScheduler`。 From 7ce47d96fea6e62f5c62db597bccf29c381ca4b5 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 20:36:27 +0800 Subject: [PATCH 165/175] complete docs --- .../webmagic/model/ModelPipeline.java | 3 ++- .../webmagic/model/annotation/ExtractBy.java | 25 ++++++++++++++++++- .../webmagic/model/annotation/ExtractBy2.java | 2 +- .../webmagic/model/annotation/ExtractBy3.java | 2 +- .../model/annotation/ExtractByRaw.java | 24 +++++++++++++++++- .../model/annotation/ExtractByUrl.java | 17 +++++++++++++ .../webmagic/model/annotation/HelpUrl.java | 10 ++++++++ .../webmagic/model/annotation/TargetUrl.java | 11 ++++++++ .../webmagic/pipeline/JsonFilePipeline.java | 2 +- .../webmagic/pipeline/PagedPipeline.java | 9 ++++--- 10 files changed, 96 insertions(+), 9 deletions(-) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java index 84db4558d..efb724e42 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java @@ -11,7 +11,8 @@ import java.util.concurrent.ConcurrentHashMap; /** - * 基于Pipeline的扩展点。
      + * 基于Pipeline的扩展点,用于实现注解格式的Pipeline。
      + * 与PageModelPipeline是一对多的关系(原谅作者没有更好的名字了)。
      * @author code4crafter@gmail.com
      * @date: 13-8-2
      * Time: 上午10:47
      diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java index bcd570642..168387bc4 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java @@ -6,22 +6,45 @@ /** * 定义类或者字段的抽取规则。
      + * * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD,ElementType.TYPE}) +@Target({ElementType.FIELD, ElementType.TYPE}) public @interface ExtractBy { + /** + * 抽取规则 + * + * @return 抽取规则 + */ String value(); public enum Type {XPath, Regex, Css} + /** + * 抽取规则类型,支持XPath、Css selector、正则表达式,默认是XPath + * + * @return 抽取规则类型 + */ Type type() default Type.XPath; + /** + * 是否是不能为空的关键字段,若notNull为true,则对应字段抽取不到时,丢弃整个类,默认为false + * + * @return 是否是不能为空的关键字段 + */ boolean notNull() default false; + /** + * 是否抽取多个结果
      + * 用于字段时,需要List来盛放结果
      + * 用于类时,表示单页抽取多个对象
      + * + * @return 是否抽取多个结果 + */ boolean multi() default false; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java index ad720b3a0..99ebd7634 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java @@ -5,7 +5,7 @@ import java.lang.annotation.Target; /** - * 定义类或者字段的抽取规则。
      + * 定义类或者字段的抽取规则,只能在Extract、ExtractByRaw之后使用。
      * * @author code4crafter@gmail.com
      * @date: 13-8-1
      diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java index 023360ef6..77910f812 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java @@ -5,7 +5,7 @@ import java.lang.annotation.Target; /** - * 定义类或者字段的抽取规则。
      + * 定义类或者字段的抽取规则,只能在Extract、ExtractByRaw之后使用。
      * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java index f774d3e92..caa87de07 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java @@ -6,22 +6,44 @@ /** * 对于在Class级别就使用过ExtractBy的类,在字段中想抽取全部内容可使用此方法。
      + * * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD,ElementType.TYPE}) +@Target({ElementType.FIELD, ElementType.TYPE}) public @interface ExtractByRaw { + /** + * 抽取规则 + * + * @return 抽取规则 + */ String value(); public enum Type {XPath, Regex, Css} + /** + * 抽取规则类型,支持XPath、Css selector、正则表达式,默认是XPath + * + * @return 抽取规则类型 + */ Type type() default Type.XPath; + /** + * 是否是不能为空的关键字段,若notNull为true,则对应字段抽取不到时,丢弃整个类,默认为false + * + * @return 是否是不能为空的关键字段 + */ boolean notNull() default false; + /** + * 是否抽取多个结果
      + * 需要List来盛放结果
      + * + * @return 是否抽取多个结果 + */ boolean multi() default false; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java index d57ec6ebb..401e4694d 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java @@ -14,10 +14,27 @@ @Target({ElementType.FIELD}) public @interface ExtractByUrl{ + /** + * 抽取规则,支持正则表达式 + * + * @return 抽取规则 + */ String value() default ""; + /** + * 是否是不能为空的关键字段,若notNull为true,则对应字段抽取不到时,丢弃整个类,默认为false + * + * @return 是否是不能为空的关键字段 + */ boolean notNull() default false; + /** + * 是否抽取多个结果
      + * 用于字段时,需要List来盛放结果
      + * 用于类时,表示单页抽取多个对象
      + * + * @return 是否抽取多个结果 + */ boolean multi() default false; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java index 3437e4445..0b2a2ec8a 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java @@ -14,7 +14,17 @@ @Target({ElementType.TYPE}) public @interface HelpUrl { + /** + * 某个类对应的URL规则列表
      + * webmagic对正则表达式进行了修改,"."仅表示字符"."而不代表任意字符,而"\*"则代表了".\*",例如"http://\*.oschina.net/\*"代表了oschina所有的二级域名下的URL。
      + * + * @return 抽取规则 + */ String[] value(); + /** + * 指定提取URL的区域(仅支持XPath) + * @return 指定提取URL的区域 + */ String sourceRegion() default ""; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java index c747da6c1..0caf190cb 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java @@ -6,6 +6,7 @@ /** * 定义某个类抽取的范围和来源,sourceRegion可以用xpath语法限定抽取区域。
      + * * @author code4crafter@gmail.com
      * @date: 13-8-1
      * Time: 下午8:40
      @@ -14,8 +15,18 @@ @Target({ElementType.TYPE}) public @interface TargetUrl { + /** + * 某个类对应的URL规则列表
      + * webmagic对正则表达式进行了修改,"."仅表示字符"."而不代表任意字符,而"\*"则代表了".\*",例如"http://\*.oschina.net/\*"代表了oschina所有的二级域名下的URL。
      + * + * @return 抽取规则 + */ String[] value(); + /** + * 指定提取URL的区域(仅支持XPath) + * @return 指定提取URL的区域 + */ String sourceRegion() default ""; } diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java index dbe1a00a5..53dba9e4e 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/JsonFilePipeline.java @@ -12,7 +12,7 @@ import java.io.PrintWriter; /** - * 持久化到文件的接口。 + * JSON格式持久化到文件的接口。 * * @author code4crafter@gmail.com
      * Date: 13-4-21 diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java index b692da271..175384240 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java @@ -9,6 +9,9 @@ import java.util.concurrent.ConcurrentHashMap; /** + * 用于实现分页的Pipeline。
      + * 在使用redis做分布式爬虫时,请不要使用此功能。
      + * * @author code4crafter@gmail.com
      * @date: 13-8-4
      * Time: 下午5:15
      @@ -34,7 +37,7 @@ private void handleObject(Iterator> iterator) { if (o instanceof PagedModel) { PagedModel pagedModel = (PagedModel) o; pageMap.put(pagedModel.getPageKey(), pagedModel.getPage(), Boolean.TRUE); - if (pagedModel.getOtherPages()!=null){ + if (pagedModel.getOtherPages() != null) { for (String otherPage : pagedModel.getOtherPages()) { Boolean aBoolean = pageMap.get(pagedModel.getPageKey(), otherPage); if (aBoolean == null) { @@ -70,8 +73,8 @@ public int compare(Map.Entry o1, Map.Entry Date: Fri, 9 Aug 2013 20:38:28 +0800 Subject: [PATCH 166/175] add docs --- webmagic manual.md | 177 ++++++++++++------ ...7\347\224\250\346\226\207\346\241\243.pdf" | Bin 0 -> 441895 bytes 2 files changed, 117 insertions(+), 60 deletions(-) create mode 100644 "webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" diff --git a/webmagic manual.md b/webmagic manual.md index d009a976e..0c681c551 100644 --- a/webmagic manual.md +++ b/webmagic manual.md @@ -4,7 +4,7 @@ webmagic使用手册 >web爬虫是一种技术,webmagic致力于将这种技术的实现成本降低,但是出于对资源提供者的尊重,webmagic不会做反封锁的事情,包括:验证码破解、代理切换、自动登录、抓取静态资源等。 ->作者黄亿华([code4crafter@gmail.com](code4crafter@gmail.com))目前就职于大众点评,曾经在前公司进行过一年的垂直爬虫的开发。webmagic就是为了解决爬虫开发的一些重复劳动而产生的框架。有使用不便或者问题,欢迎在github[提交issue](https://github.com/code4craft/webmagic/issues),或者在[oschina讨论模块](http://www.oschina.net/question)提问。 +>作者黄亿华([code4crafter@gmail.com](code4crafter@gmail.com))目前就职于大众点评,曾经在前公司进行过一年的垂直爬虫的开发,webmagic就是为了解决爬虫开发的一些重复劳动而产生的框架。 >webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: @@ -12,7 +12,10 @@ webmagic使用手册 >Java爬虫 **Spiderman** [https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) ---------- +>webmagic遵循[Apache 2.0协议](http://www.apache.org/licenses/LICENSE-2.0.html),你可以自由进行使用和修改。有使用不便或者问题,欢迎在github[提交issue](https://github.com/code4craft/webmagic/issues),或者在[oschina讨论模块](http://www.oschina.net/question)提问。 + +
      + ## 快速开始 @@ -66,7 +69,7 @@ webmagic还包含两个可用的扩展包,因为这两个包都依赖了比较 git clone http://git.oschina.net/flashsword20/webmagic-bin.git -在`bin/lib`目录下,有项目依赖的所有jar包,直接在IDE里import即可。 +在**bin/lib**目录下,有项目依赖的所有jar包,直接在IDE里import即可。 ### 第一个爬虫 @@ -131,11 +134,12 @@ webmagic-extension包括了注解方式编写爬虫的方法,只需基于一 这个例子定义了一个Model类,Model类的字段'title'、'content'、'tags'均为要抽取的属性。这个类在Pipeline里是可以复用的。 -关于注解的使用方式,在后面会专门讲到。 +注解的详细使用方式见后文中得webmagic-extension注解模块。 ------- +
      -## 核心架构解析 + +## webmagic-core webmagic-core是爬虫的核心框架,只包括一个爬虫各功能模块的核心功能。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。 @@ -147,12 +151,12 @@ webmagic-core是爬虫的核心框架,只包括一个爬虫各功能模块的 webmagic-core参考了scrapy的模块划分,分为Spider(整个爬虫的调度框架)、Downloader(页面下载)、PageProcessor(链接提取和页面分析)、Scheduler(URL管理)、Pipeline(离线分析和持久化)几部分。只不过scrapy通过middleware实现扩展,而webmagic则通过定义这几个接口,并将其不同的实现注入主框架类Spider来实现扩展。 ![image](http://code4craft.github.io/images/posts/webmagic.png) +
      #### Spider类(核心调度) -Spider是爬虫的入口类,Spider的接口调用采用了链式的API设计,其他功能全部通过接口注入Spider实现,下面是启动一个比较复杂的Spider的例子。 +**Spider**是爬虫的入口类,Spider的接口调用采用了链式的API设计,其他功能全部通过接口注入Spider实现,下面是启动一个比较复杂的Spider的例子。 - Spider.create(sinaBlogProcessor) .scheduler(new FileCacheQueueScheduler("/data/temp/webmagic/cache/")) .pipeline(new FilePipeline()) @@ -175,68 +179,115 @@ Spider的核心处理流程非常简单,代码如下: } sleep(site.getSleepTime()); } + +#### PageProcessor(页面分析及链接抽取) -#### Downloader(页面下载) - -大部分爬虫都是通过模拟http请求,接收并分析响应来完成。这方面,JDK自带的**HttpURLConnection**可以满足最简单的需要,而**Apache HttpClient**(4.0后整合到HttpCompenent项目中)则是开发复杂爬虫的不二之选。它支持自定义HTTP头(对于爬虫比较有用的就是User-agent、cookie等)、自动redirect、连接复用、cookie保留、设置代理等诸多强大的功能。 - -webmagic使用了HttpClient 4.2,并封装到了**HttpClientDownloader**。学习HttpClient的使用对于构建高性能爬虫是非常有帮助的,官方的[Tutorial](http://hc.apache.org/httpcomponents-client-ga/tutorial/html/)就是很好的学习资料。目前webmagic对HttpClient的使用仍在初步阶段,不过对于一般抓取任务,已经够用了。 - -对于一些Javascript动态加载的网页,仅仅使用http模拟下载工具,并不能取到页面的内容。这方面的思路有两种:一种是抽丝剥茧,分析js的逻辑,再用爬虫去重现它(比如在网页中提取关键数据,再用这些数据去构造Ajax请求,最后直接从响应体获取想要的数据); -另一种就是:内置一个浏览器,直接获取最后加载完的页面。这方面,js可以使用**PhantomJS**,它内部集成了webkit。而Java可以使用**Selenium**,这是一个非常强大的浏览器模拟工具。webmagic-selenium包中整合了Selenium到`SeleniumDownloader`,可以直接进行动态加载页面的抓取。 +页面分析是垂直爬虫中需要定制的部分。在webmagic-core里,通过实现**PageProcessor**接口来实现定制爬虫。PageProcessor有两个核心方法:public void process(Page page)和public Site getSite() 。 -#### PageProcessor(页面分析及链接抽取) +* public void process(Page page) -页面分析可以说是垂直爬虫最复杂的一部分,在webmagic里,PageProcessor是定制爬虫的核心。通过编写一个实现PageProcessor接口的类,就可以定制一个自己的爬虫。 + 通过对**Page**对象的操作,实现爬虫逻辑。Page对象包括两个最重要的方法:addTargetRequests()可以添加URL到待抓取队列,put()可以将结果保存供后续处理。 + Page的数据可以通过Page.getHtml()和Page.getUrl()获取。 -**Selector**是webmagic为了简化页面抽取开发的独立模块,是webmagic的主要着力点。这里整合了CSS Selector、XPath和正则表达式,并可以进行链式的抽取,很容易就实现强大的功能。即使你使用自己开发的爬虫工具,webmagic的Selector仍然值得一试。 +* public Site getSite() + + **Site**对象定义了爬虫的域名、起始地址、抓取间隔、编码等信息。 -例如,我已经下载了一个页面,现在要抽取某个区域的所有包含"blog"的链接,我可以这样写: +**Selector**是webmagic为了简化页面抽取开发的独立模块,是webmagic-core的主要着力点。这里整合了CSS Selector、XPath和正则表达式,并可以进行链式的抽取。 //content是用别的爬虫工具抽取到的正文 - String content = "blabla"; - List links = Html.create(content) + List links = page.getHtml() .$("div.title") //css 选择,Java里虽然很少有$符号出现,不过貌似$作为方法名是合法的 .xpath("//@href") //提取链接 .regex(".*blog.*") //正则匹配过滤 .all(); //转换为string列表 +webmagic包括一个对于页面正文的自动抽取的类**SmartContentSelector**。相信用过Evernote Clearly都会对其自动抽取正文的技术印象深刻。这个技术又叫**Readability**。当然webmagic对Readability的实现还比较粗略,但是仍有一些学习价值。 -另外,webmagic的抓取链接需要显示的调用`Page.addTargetRequests()`去添加,这也是为了灵活性考虑的(很多时候,下一步的URL不是单纯的页面href链接,可能会根据页面模块进行抽取,甚至可能是自己拼凑出来的)。 +基于Saxon,webmagic提供了XPath2.0语法的支持。XPath2.0语法支持内部函数、逻辑控制等,是一门完整的语言,如果你熟悉XPath2.0语法,倒是不妨一试(需要引入**webmagic-saxon**包)。 -webmagic包括一个对于页面正文的自动抽取的功能**SmartContentSelector**。相信用过Evernote Clearly都会对其自动抽取正文的技术印象深刻。这个技术又叫**Readability**。当然webmagic对Readability的实现还比较粗略,但是仍有一些学习价值。 +**webmagic-samples**包里有一些为某个站点定制的PageProcessor,供学习之用。 -基于Saxon,webmagic提供了XPath2.0语法的支持。XPath2.0语法支持内部函数、逻辑控制等,是一门完整的语言,如果你熟悉语法,倒是不妨一试(需要引入webmagic-saxon包)。 +#### Downloader(页面下载) -#### Scheduler(URL管理) +**Downloader**是webmagic中下载页面的接口,主要方法: + +* public Page download(Request request, Task task) + + **Request**对象封装了待抓取的URL及其他信息,而Page则包含了页面下载后的Html及其他信息。Task是一个包装了任务对应的Site信息的抽象接口。 + +* public void setThread(int thread) + + 因为Downloader一般会涉及连接池等功能,而这些功能与多线程密切相关,所以定义了此方法。 + +目前有几个Downloader的实现: + +* HttpClientDownloader + + 集成了**Apache HttpClient**的Downloader。Apache HttpClient(4.0后整合到HttpCompenent项目中)是强大的Java http下载器,它支持自定义HTTP头(对于爬虫比较有用的就是User-agent、cookie等)、自动redirect、连接复用、cookie保留、设置代理等诸多强大的功能。 +* SeleniumDownloader + + 对于一些Javascript动态加载的网页,仅仅使用http模拟下载工具,并不能取到页面的内容。这方面的思路有两种:一种是抽丝剥茧,分析js的逻辑,再用爬虫去重现它;另一种就是:内置一个浏览器,直接获取最后加载完的页面。**webmagic-selenium**包中整合了Selenium到SeleniumDownloader,可以直接进行动态加载页面的抓取。 -URL管理的问题可大可小。对于小规模的抓取,URL管理是很简单的。我们只需要将待抓取URL和未抓取URL分开保存,并进行去重即可。使用JDK内置的集合类型Set、List或者Queue都可以满足需要。如果我们要进行多线程抓取,则可以选择线程安全的容器,例如LinkedBlockingQueue以及ConcurrentHashMap。 +#### Scheduler(URL管理) -因为小规模的URL管理非常简单,很多框架都并不将其抽象为一个模块,而是直接融入到代码中。但是实际上,抽象出Scheduler模块,会使得框架的解耦程度上升一个档次,并非常容易进行横向扩展,这也是我从scrapy中学到的。 +**Scheduler**是webmagic的管理模块,通过实现Scheduler可以定制自己的URL管理器。Scheduler包括两个主要方法: -在webmagic的设计中,除了Scheduler模块,其他的处理-从下载、解析到持久化,每个任务都是互相独立的,因此可以通过多个Spider共用一个Scheduler来进行扩展。排除去重的因素,URL管理天生就是一个队列,我们可以很方便的用分布式的队列工具去扩展它,也可以基于mysql、redis或者mongodb这样的存储工具来构造一个队列,这样构建一个多线程乃至分布式的爬虫就轻而易举了。 +* public void push(Request request,Task task) + + 将待抓取URL加入Scheduler。Request对象是对URL的一个封装,还包括优先级、以及一个供存储数据的Map。Task仍然用于区分不同任务,在多个任务公用一个Scheduler时可以此进行区分。 -URL去重也是一个比较复杂的问题。如果数据量较少,则使用hash的方式就能很好解决。数据量较大的情况下,可以使用Bloom Filter或者更复杂的方式。 +* public Request poll(Task task) + + 从Scheduler里取出一条请求,并进行后续执行。 -webmagic目前有两个Scheduler的实现,**QueueScheduler**是一个简单的内存队列,速度较快,并且是线程安全的,**FileCacheQueueScheduler**则是一个文件队列,它可以用于耗时较长的下载任务,在任务中途停止后,下次执行仍然从中止的URL开始继续爬取。 +webmagic目前有三个Scheduler的实现: -webmagic有一个基于redis的Scheduler实现**RedisScheduler**。通过使用同一台redis服务器存储URL,webmagic可以很容易的在多机部署,从而达到分布式爬虫的效果。 +* QueueScheduler + + 一个简单的内存队列,速度较快,并且是线程安全的。 + +* FileCacheQueueScheduler + + 使用文件保存队列,它可以用于耗时较长的下载任务,在任务中途停止后(手动停止或者程序崩溃),下次执行仍然从中止的URL开始继续爬取。 + +* RedisScheduler + + 使用redis存储URL队列。通过使用同一台redis服务器存储URL,webmagic可以很容易的在多机部署,从而达到分布式爬虫的效果。 +#### Pipeline(后续处理和持久化) -#### Pipeline-离线处理和持久化 +**Pipeline**是最终抽取结果进行输出和持久化的接口。它只包括一个方法: +* public void process(ResultItems resultItems,Task task) + + **ResultItems**是集成了抽取结果的对象。通过ResultItems.get(key)可以获取抽取结果。Task同样是用于区分不同任务的对象。 + +webmagic包括以下几个Pipeline的实现: -Pipeline其实也是容易被忽略的一部分。大家都知道持久化的重要性,但是很多框架都选择直接在页面抽取的时候将持久化一起完成,例如crawer4j。但是Pipeline真正的好处是,将页面的在线分析和离线处理拆分开来,可以在一些线程里进行下载,另一些线程里进行处理和持久化。 +* ConsolePipeline + + 直接输出结果到控制台,测试时使用。 + +* FilePipeline + + 输出结果到文件,每个URL单独保存到一个页面,以URL的MD5结果作为文件名。通过构造函数`public FilePipeline(String path)`定义存储路径,**以下使用文件持久化的类,多数都使用此方法指定路径**。 + +* JsonFilePipeline + + 以JSON输出结果到文件(.json后缀),其他与FilePipeline相同。 -你可以扩展Pipeline来实现抽取结果的持久化,将其保存到你想要保存的地方-本地文件、数据库、mongodb等等。Pipeline的处理目前还是在线的,但是修改为离线的也并不困难。 +webmagic目前不支持持久化到数据库,但是结合其他工具,持久化到数据库也是很容易的。这里不妨看一下[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。因为JFinal目前还不支持maven,所以这段代码并没有放到webmagic-samples里来。 -webmagic目前只支持控制台输出和文件持久化,但是持久化到数据库也是很容易的。这里不妨看一下[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。因为JFinal目前还不支持maven,所以并没有放到webmagic-samples里来。 +
      ------- +## webmagic-extension + +webmagic-extension是为了开发爬虫更方便而实现的一些功能模块。这些功能完全基于webmagic-core的框架,包括注解形式编写爬虫、分页、分布式等功能。 -## 注解模块 +### 注解模块 webmagic-extension包括注解模块。为什么会有注解方式? @@ -251,53 +302,59 @@ webmagic-extension包括注解模块。为什么会有注解方式? 注解部分包括以下内容: -* ### TargetUrl +* #### TargetUrl - "TargetUrl"表示这个Model对应要抓取的URL,它包含两层意思:符合这个条件的URL会被加入抓取队列;符合这个条件的URL会被这个Model抓取。TargetUrl可以`sourceRegion`指定提取URL的区域(仅支持XPath)。 + "TargetUrl"表示这个Model对应要抓取的URL,它包含两层意思:符合这个条件的URL会被加入抓取队列;符合这个条件的URL会被这个Model抓取。TargetUrl可以**sourceRegion**指定提取URL的区域(仅支持XPath)。 TargetUrl使用了正则表达式,匹配 "http://my.oschina.net/flashsword/blog/150039" 格式的URL。webmagic对正则表达式进行了修改,"."仅表示字符"."而不代表任意字符,而"\*"则代表了".\*",例如"http://\*.oschina.net/\*"代表了oschina所有的二级域名下的URL。 - 与TargetUrl相似的还有`HelpUrl`,HelpUrl表示:仅仅抓取该URL用作链接提取,并不对它进行内容抽取。例如博客正文页对应TargetUrl,而列表页则对应HelpUrl。 + 与TargetUrl相似的还有**HelpUrl**,HelpUrl表示:仅仅抓取该URL用作链接提取,并不对它进行内容抽取。例如博客正文页对应TargetUrl,而列表页则对应HelpUrl。 -* ### ExtractBy +* #### ExtractBy - * #### 用于字段 + * ##### 用于字段 "ExtractBy"可用于类以及字段。用于字段时,定义了字段抽取的规则。抽取的规则默认使用[**XPath**](http://www.w3school.com.cn/xpath/),也可以选择使用CSS Selector、正则表达式(通过设置type)。 - ExtractBy还有几个扩展属性。`multi`表示是否抽取列表,当然,设置为multi时,你需要一个List字段去容纳它。`notnull`则表示,此字段不允许为null,若为null则放弃整个对象。 + ExtractBy还有几个扩展属性。**multi**表示是否抽取列表,当然,设置为multi时,你需要一个List字段去容纳它。**notnull**则表示,此字段不允许为null,若为null则放弃整个对象。 - * #### 用于类 + * ##### 用于类 "ExtractBy"用于类时,则限定了字段抽取的区域。用于类时仍支持multi,multi则表示一个页面可以抽取到多个对象。 - * #### ExtractByRaw & ExtractByUrl + * ##### ExtractByRaw & ExtractByUrl - 在类使用"ExtractBy"修饰后,字段的"ExtractBy"使用的是其抽取的结果,如果仍然想要抽取原HTML,可以使用"ExtractByRaw"。与此类似的还有"ExtractByUrl",表示从URL重抽取信息。ExtractByUrl只支持正则表达式。 + 在类使用"ExtractBy"修饰后,字段的"ExtractBy"使用的是其抽取的结果,如果仍然想要抽取原HTML,可以使用"ExtractByRaw"。与此类似的还有"ExtractByUrl",表示从URL中抽取信息。ExtractByUrl只支持正则表达式。 - * #### ExtractBy2 ExtractBy3 + * ##### ExtractBy2 ExtractBy3 "ExtractBy"、"ExtractByRaw"支持链式抽取,通过增加注解"ExtractBy2"、"ExtractBy3"实现。 -* ### AfterExtractor +* #### AfterExtractor - AfterExtractor接口是对注解方式抽取能力不足的补充。实现AfterExtractor接口后,会在**使用注解方式填充完字段后**调用`afterProcess()`方法,在这个方法中可以直接访问已抽取的字段、补充需要抽取的字段,甚至做一些简单的输出和持久化操作(并不是很建议这么做)。这部分可以参考[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。 + AfterExtractor接口是对注解方式抽取能力不足的补充。实现AfterExtractor接口后,会在**使用注解方式填充完字段后**调用**afterProcess()**方法,在这个方法中可以直接访问已抽取的字段、补充需要抽取的字段,甚至做一些简单的输出和持久化操作(并不是很建议这么做)。这部分可以参考[webmagic结合JFinal持久化到数据库的一段代码](http://www.oschina.net/code/snippet_190591_23456)。 -* ### OOSpider - OOSpider是注解式爬虫的入口,这里调用`create()`方法将OschinaBlog这个类加入到爬虫的抽取中,这里是可以传入多个类的,OOSpider会根据TargetUrl调用不同的Model进行解析。 +* #### OOSpider + OOSpider是注解式爬虫的入口,这里调用**create()**方法将OschinaBlog这个类加入到爬虫的抽取中,这里是可以传入多个类的,例如: + + OOSpider.create( + Site.me().addStartUrl("http://www.oschina.net"), + new ConsolePageModelPipeline(), + OschinaBlog.clas,OschinaAnswer.class).run(); + + OOSpider会根据TargetUrl调用不同的Model进行解析。 -* ### PageModelPipeline +* #### PageModelPipeline 可以通过定义PageModelPipeline来选择结果输出方式。这里new ConsolePageModelPipeline()是PageModelPipeline的一个实现,会将结果输出到控制台。 -* ### 分页 - 处理单项数据分页(例如单条新闻多个页面)是爬虫一个比较头疼的问题。webmagic有一个对于分页的实现,通过实现`PagedModel`接口即可。webmagic-samples里有一个抓取网易新闻的类:`us.codecraft.webmagic.model.samples.News163`。关于分页,这里有一篇对于webmagic分页实现的详细说明的文章[关于爬虫实现分页的一些思考](http://my.oschina.net/flashsword/blog/150039)。 - 目前分页功能还没有分布式实现。 +* #### 分页 --------- + 处理单项数据分页(例如单条新闻多个页面)是爬虫一个比较头疼的问题。webmagic目前对于分页的解决方案是:在注解模式下,Model通过实现**PagedModel**接口,并引入PagedPipeline作为第一个Pipeline来实现。具体可以参考webmagic-samples中抓取网易新闻的代码:**us.codecraft.webmagic.model.samples.News163**。 -## 分布式 - -webmagic-extension中,通过redis来管理URL,达到分布式的效果。具体实现方式只有一个类:`us.codecraft.webmagic.scheduler.RedisScheduler`。 + 关于分页,这里有一篇对于webmagic分页实现的详细说明的文章[关于爬虫实现分页的一些思考](http://my.oschina.net/flashsword/blog/150039)。 + 目前分页功能还没有分布式实现,如果实现RedisScheduler进行分布式爬取,请不要使用分页功能。 +### 分布式 +webmagic-extension中,通过redis来管理URL,达到分布式的效果。但是对于分布式爬虫,仅仅程序能够分布式运行,还满足不了大规模抓取的需要,webmagic可能后期会加入一些任务管理和监控的功能,也欢迎各位用户为webmagic提交代码,做出贡献。 diff --git "a/webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" "b/webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..3c234a8b7da970ded1412d81d56a8363d2f05e17 GIT binary patch literal 441895 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

    • #6U*WZJ> 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 Date: Fri, 9 Aug 2013 20:43:06 +0800 Subject: [PATCH 167/175] remove invalid @date --- .../src/main/java/us/codecraft/webmagic/ResultItems.java | 2 +- .../main/java/us/codecraft/webmagic/downloader/Destroyable.java | 2 +- .../main/java/us/codecraft/webmagic/selector/AndSelector.java | 2 +- .../main/java/us/codecraft/webmagic/selector/OrSelector.java | 2 +- .../src/main/java/us/codecraft/webmagic/PagedModel.java | 2 +- .../main/java/us/codecraft/webmagic/model/AfterExtractor.java | 2 +- .../us/codecraft/webmagic/model/ConsolePageModelPipeline.java | 2 +- .../src/main/java/us/codecraft/webmagic/model/Extractor.java | 2 +- .../main/java/us/codecraft/webmagic/model/FieldExtractor.java | 2 +- .../java/us/codecraft/webmagic/model/ModelPageProcessor.java | 2 +- .../main/java/us/codecraft/webmagic/model/ModelPipeline.java | 2 +- .../src/main/java/us/codecraft/webmagic/model/OOSpider.java | 2 +- .../java/us/codecraft/webmagic/model/PageModelExtractor.java | 2 +- .../java/us/codecraft/webmagic/model/PageModelPipeline.java | 2 +- .../java/us/codecraft/webmagic/model/annotation/ExtractBy.java | 2 +- .../java/us/codecraft/webmagic/model/annotation/ExtractBy2.java | 2 +- .../java/us/codecraft/webmagic/model/annotation/ExtractBy3.java | 2 +- .../us/codecraft/webmagic/model/annotation/ExtractByRaw.java | 2 +- .../us/codecraft/webmagic/model/annotation/ExtractByUrl.java | 2 +- .../java/us/codecraft/webmagic/model/annotation/HelpUrl.java | 2 +- .../java/us/codecraft/webmagic/model/annotation/TargetUrl.java | 2 +- .../main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java | 2 +- .../java/us/codecraft/webmagic/scheduler/RedisScheduler.java | 2 +- .../src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java | 2 +- .../main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java | 2 +- .../us/codecraft/webmagic/scheduler/RedisSchedulerTest.java | 2 +- .../java/us/codecraft/webmagic/pipeline/LucenePipeline.java | 2 +- .../test/java/us/codecraft/webmagic/lucene/OschinaBlog.java | 2 +- .../src/main/java/us/codecraft/webmagic/main/QuickStarter.java | 2 +- .../src/main/java/us/codecraft/webmagic/model/samples/Blog.java | 2 +- .../java/us/codecraft/webmagic/model/samples/IteyeBlog.java | 2 +- .../main/java/us/codecraft/webmagic/model/samples/News163.java | 2 +- .../java/us/codecraft/webmagic/model/samples/OschinaAnswer.java | 2 +- .../java/us/codecraft/webmagic/model/samples/OschinaBlog.java | 2 +- .../java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java | 2 +- .../webmagic/downloader/selenium/SeleniumDownloader.java | 2 +- .../codecraft/webmagic/downloader/selenium/WebDriverPool.java | 2 +- .../java/us/codecraft/webmagic/downloader/SeleniumTest.java | 2 +- .../webmagic/downloader/selenium/SeleniumDownloaderTest.java | 2 +- .../webmagic/downloader/selenium/WebDriverPoolTest.java | 2 +- .../java/us/codecraft/webmagic/samples/HuabanProcessor.java | 2 +- 41 files changed, 41 insertions(+), 41 deletions(-) diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java b/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java index c91a2701a..7a8e5c39f 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/ResultItems.java @@ -6,7 +6,7 @@ /** * 保存抽取结果的类,由PageProcessor处理得到,传递给{@link us.codecraft.webmagic.pipeline.Pipeline}进行持久化。
      * @author code4crafter@gmail.com
      - * @date: 13-7-25
      + * Date: 13-7-25
      * Time: 下午12:20
      */ public class ResultItems { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java index 2b040fa03..6dcbde1b3 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/Destroyable.java @@ -3,7 +3,7 @@ /** * 比较占用资源的服务可以实现该接口,Spider会在结束时调用destroy()释放资源。
      * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午3:10
      */ public interface Destroyable { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java index e6bbbb80c..997b6cf19 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/AndSelector.java @@ -5,7 +5,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 下午5:29
      */ public class AndSelector implements Selector { diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java index dca1b343e..48f9fb93e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/selector/OrSelector.java @@ -5,7 +5,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 下午5:29
      */ public class OrSelector implements Selector { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/PagedModel.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/PagedModel.java index 95e1a8338..7d46cc213 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/PagedModel.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/PagedModel.java @@ -4,7 +4,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-4
      + * Date: 13-8-4
      * Time: 下午5:18
      */ public interface PagedModel { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java index 01170811c..3927d116e 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/AfterExtractor.java @@ -6,7 +6,7 @@ * 实现这个接口即可在抽取后进行后处理。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 上午9:42
      */ public interface AfterExtractor { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java index e5485a194..c841f10d4 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ConsolePageModelPipeline.java @@ -5,7 +5,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 下午3:41
      */ public class ConsolePageModelPipeline implements PageModelPipeline { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/Extractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/Extractor.java index 82c7dbb6b..04940766c 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/Extractor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/Extractor.java @@ -4,7 +4,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午9:48
      */ class Extractor { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java index 17a55c83e..4ec1bbce0 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/FieldExtractor.java @@ -7,7 +7,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午9:48
      */ class FieldExtractor extends Extractor{ diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java index 84563ce95..af762ece0 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPageProcessor.java @@ -16,7 +16,7 @@ /** * 基于PageProcessor的扩展点。
      * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:46
      */ class ModelPageProcessor implements PageProcessor { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java index efb724e42..07d6c5a27 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/ModelPipeline.java @@ -14,7 +14,7 @@ * 基于Pipeline的扩展点,用于实现注解格式的Pipeline。
      * 与PageModelPipeline是一对多的关系(原谅作者没有更好的名字了)。
      * @author code4crafter@gmail.com
      - * @date: 13-8-2
      + * Date: 13-8-2
      * Time: 上午10:47
      */ class ModelPipeline implements Pipeline { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/OOSpider.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/OOSpider.java index 8a3739d1c..e5a41e1d0 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/OOSpider.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/OOSpider.java @@ -6,7 +6,7 @@ /** * 基于Model的Spider,封装后的入口类。
      * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 上午9:51
      */ public class OOSpider extends Spider { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java index 158e74d11..2f9004b5e 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelExtractor.java @@ -17,7 +17,7 @@ * Model主要逻辑类。将一个带注解的POJO转换为一个PageModelExtractor。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午9:33
      */ class PageModelExtractor { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java index bd3aa95ae..a70137f80 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/PageModelPipeline.java @@ -4,7 +4,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 上午9:34
      */ public interface PageModelPipeline { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java index 168387bc4..8c12ce1fe 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy.java @@ -8,7 +8,7 @@ * 定义类或者字段的抽取规则。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java index 99ebd7634..2a4f0802c 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy2.java @@ -8,7 +8,7 @@ * 定义类或者字段的抽取规则,只能在Extract、ExtractByRaw之后使用。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java index 77910f812..741682d42 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractBy3.java @@ -7,7 +7,7 @@ /** * 定义类或者字段的抽取规则,只能在Extract、ExtractByRaw之后使用。
      * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java index caa87de07..a3ae3e5c5 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByRaw.java @@ -8,7 +8,7 @@ * 对于在Class级别就使用过ExtractBy的类,在字段中想抽取全部内容可使用此方法。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java index 401e4694d..51b5f0dff 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/ExtractByUrl.java @@ -7,7 +7,7 @@ /** * 定义类或者字段的抽取规则(从url中抽取,只支持正则表达式)。
      * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java index 0b2a2ec8a..9a0cce4f6 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/HelpUrl.java @@ -7,7 +7,7 @@ /** * 定义辅助爬取的url。
      * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java index 0caf190cb..e12fca396 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/TargetUrl.java @@ -8,7 +8,7 @@ * 定义某个类抽取的范围和来源,sourceRegion可以用xpath语法限定抽取区域。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-1
      + * Date: 13-8-1
      * Time: 下午8:40
      */ @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java index 175384240..beda66734 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/pipeline/PagedPipeline.java @@ -13,7 +13,7 @@ * 在使用redis做分布式爬虫时,请不要使用此功能。
      * * @author code4crafter@gmail.com
      - * @date: 13-8-4
      + * Date: 13-8-4
      * Time: 下午5:15
      */ public class PagedPipeline implements Pipeline { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index c9992db8d..e26ed9d6c 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -13,7 +13,7 @@ * 使用redis管理url,构建一个分布式的爬虫。
      * * @author code4crafter@gmail.com
      - * @date: 13-7-25
      + * Date: 13-7-25
      * Time: 上午7:07
      */ public class RedisScheduler implements Scheduler { diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java index a8345280b..b4a477fa4 100755 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java @@ -4,7 +4,7 @@ /** * @author code4crafter@gmail.com - * @date Dec 14, 2012 + * Date Dec 14, 2012 */ public class DoubleKeyMap extends MultiKeyMapBase { private Map> map; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java index 256097a7c..89fdc9ab0 100755 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/MultiKeyMapBase.java @@ -2,7 +2,7 @@ /** * @author code4crafter@gmail.com - * @date Dec 14, 2012 + * Date Dec 14, 2012 */ import java.util.HashMap; diff --git a/webmagic-extension/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java b/webmagic-extension/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java index f0cbb3d7f..0819e437d 100644 --- a/webmagic-extension/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java +++ b/webmagic-extension/src/test/java/us/codecraft/webmagic/scheduler/RedisSchedulerTest.java @@ -9,7 +9,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-7-25
      + * Date: 13-7-25
      * Time: 上午7:51
      */ public class RedisSchedulerTest { diff --git a/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java b/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java index 724ac7eb8..6fe270210 100644 --- a/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java +++ b/webmagic-lucene/src/main/java/us/codecraft/webmagic/pipeline/LucenePipeline.java @@ -26,7 +26,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-5
      + * Date: 13-8-5
      * Time: 下午2:11
      */ public class LucenePipeline implements Pipeline { diff --git a/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java b/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java index 4480f0bee..b35037024 100644 --- a/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java +++ b/webmagic-lucene/src/main/test/java/us/codecraft/webmagic/lucene/OschinaBlog.java @@ -13,7 +13,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-2
      + * Date: 13-8-2
      * Time: 上午7:52
      */ @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java index 65940e0c4..52be27210 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/main/QuickStarter.java @@ -14,7 +14,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-7
      + * Date: 13-8-7
      * Time: 下午9:24
      */ public class QuickStarter { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java index 484861b9a..509aaf9f0 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/Blog.java @@ -2,7 +2,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-2
      + * Date: 13-8-2
      * Time: 上午8:10
      */ public interface Blog { diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java index 38b698038..ae9452526 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/IteyeBlog.java @@ -7,7 +7,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-2
      + * Date: 13-8-2
      * Time: 上午7:52
      */ @TargetUrl("http://*.iteye.com/blog/*") diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java index 6baa8ae78..8c0e32dce 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/News163.java @@ -16,7 +16,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-4
      + * Date: 13-8-4
      * Time: 下午8:17
      */ @TargetUrl("http://news.163.com/\\d+/\\d+/\\d+/\\w+*.html") diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java index 02b8a9c55..e878633b6 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaAnswer.java @@ -9,7 +9,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-3
      + * Date: 13-8-3
      * Time: 下午8:25
      */ @TargetUrl("http://www.oschina.net/question/\\d+_\\d+*") diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java index 95a789157..c1e3ea340 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/model/samples/OschinaBlog.java @@ -10,7 +10,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-8-2
      + * Date: 13-8-2
      * Time: 上午7:52
      */ @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") diff --git a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java index da846e8c8..c0b3f7316 100644 --- a/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java +++ b/webmagic-samples/src/main/java/us/codecraft/webmagic/samples/IteyeBlogProcessor.java @@ -8,7 +8,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 上午7:31
      */ public class IteyeBlogProcessor implements PageProcessor { diff --git a/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java b/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java index e95f27c4d..0fa0eea5e 100644 --- a/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java +++ b/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloader.java @@ -22,7 +22,7 @@ * 需要下载Selenium driver支持。
      * * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午1:37
      */ public class SeleniumDownloader implements Downloader, Destroyable { diff --git a/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java b/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java index c763a99a7..71ba290e1 100644 --- a/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java +++ b/webmagic-selenium/src/main/java/us/codecraft/webmagic/downloader/selenium/WebDriverPool.java @@ -12,7 +12,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午1:41
      */ class WebDriverPool { diff --git a/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java index 2c190336d..b7bcd80b3 100644 --- a/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java +++ b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/SeleniumTest.java @@ -14,7 +14,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午12:27
      */ public class SeleniumTest { diff --git a/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java index fe98e8f58..2b8c24711 100644 --- a/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java +++ b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/SeleniumDownloaderTest.java @@ -9,7 +9,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午2:46
      */ public class SeleniumDownloaderTest { diff --git a/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java index 4d5d2755b..a711a19a8 100644 --- a/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java +++ b/webmagic-selenium/src/test/java/us/codecraft/webmagic/downloader/selenium/WebDriverPoolTest.java @@ -6,7 +6,7 @@ /** * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午2:12
      */ public class WebDriverPoolTest { diff --git a/webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java b/webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java index 6b3d8a071..1696a3f95 100644 --- a/webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java +++ b/webmagic-selenium/src/test/java/us/codecraft/webmagic/samples/HuabanProcessor.java @@ -11,7 +11,7 @@ * 花瓣网抽取器。
      * 使用Selenium做页面动态渲染。
      * @author code4crafter@gmail.com
      - * @date: 13-7-26
      + * Date: 13-7-26
      * Time: 下午4:08
      */ public class HuabanProcessor implements PageProcessor { From e856e1ef5168542b1065e6e865a85163b89a184c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 20:56:33 +0800 Subject: [PATCH 168/175] complete docs --- .../src/main/java/us/codecraft/webmagic/Spider.java | 4 ++-- .../webmagic/{schedular => scheduler}/QueueScheduler.java | 2 +- .../webmagic/{schedular => scheduler}/Scheduler.java | 2 +- .../codecraft/webmagic/{schedular => scheduler}/package.html | 0 .../java/us/codecraft/webmagic/model/annotation/package.html | 5 +++++ .../webmagic/scheduler/FileCacheQueueScheduler.java | 1 - .../java/us/codecraft/webmagic/scheduler/RedisScheduler.java | 1 - .../main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java | 4 ++-- 8 files changed, 11 insertions(+), 8 deletions(-) rename webmagic-core/src/main/java/us/codecraft/webmagic/{schedular => scheduler}/QueueScheduler.java (96%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{schedular => scheduler}/Scheduler.java (95%) rename webmagic-core/src/main/java/us/codecraft/webmagic/{schedular => scheduler}/package.html (100%) create mode 100644 webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/package.html diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java index 878c63e38..cf627967c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Spider.java @@ -8,8 +8,8 @@ import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.pipeline.Pipeline; import us.codecraft.webmagic.processor.PageProcessor; -import us.codecraft.webmagic.schedular.QueueScheduler; -import us.codecraft.webmagic.schedular.Scheduler; +import us.codecraft.webmagic.scheduler.QueueScheduler; +import us.codecraft.webmagic.scheduler.Scheduler; import us.codecraft.webmagic.utils.ThreadUtils; import java.util.ArrayList; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/QueueScheduler.java similarity index 96% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/QueueScheduler.java index 613e4062c..723b5f93c 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/QueueScheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/QueueScheduler.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.schedular; +package us.codecraft.webmagic.scheduler; import org.apache.log4j.Logger; import us.codecraft.webmagic.Request; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java b/webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/Scheduler.java similarity index 95% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java rename to webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/Scheduler.java index 8d9649be1..fc39b450e 100644 --- a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/Scheduler.java +++ b/webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/Scheduler.java @@ -1,4 +1,4 @@ -package us.codecraft.webmagic.schedular; +package us.codecraft.webmagic.scheduler; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Task; diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html b/webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/package.html similarity index 100% rename from webmagic-core/src/main/java/us/codecraft/webmagic/schedular/package.html rename to webmagic-core/src/main/java/us/codecraft/webmagic/scheduler/package.html diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/package.html b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/package.html new file mode 100644 index 000000000..1e3004fbe --- /dev/null +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/model/annotation/package.html @@ -0,0 +1,5 @@ + + +webmagic注解抓取方式所定义的注解。 + + diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java index c294f090a..a8dc23a54 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/FileCacheQueueScheduler.java @@ -4,7 +4,6 @@ import org.apache.log4j.Logger; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Task; -import us.codecraft.webmagic.schedular.Scheduler; import java.io.*; import java.util.LinkedHashSet; diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java index e26ed9d6c..e7c5bcd42 100644 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/scheduler/RedisScheduler.java @@ -7,7 +7,6 @@ import redis.clients.jedis.JedisPoolConfig; import us.codecraft.webmagic.Request; import us.codecraft.webmagic.Task; -import us.codecraft.webmagic.schedular.Scheduler; /** * 使用redis管理url,构建一个分布式的爬虫。
      diff --git a/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java index b4a477fa4..b284a1574 100755 --- a/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java +++ b/webmagic-extension/src/main/java/us/codecraft/webmagic/utils/DoubleKeyMap.java @@ -42,7 +42,7 @@ public DoubleKeyMap(Map> map, Class protoMapClass) /** * @param key - * @return + * @return map */ public Map get(K1 key) { return map.get(key); @@ -51,7 +51,7 @@ public Map get(K1 key) { /** * @param key1 * @param key2 - * @return + * @return value */ public V get(K1 key1, K2 key2) { if (get(key1) == null) { From d32d883c9d15b009eb3120f5b54f3a2b3f6b4e76 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 21:44:47 +0800 Subject: [PATCH 169/175] release-note --- release-note.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/release-note.md b/release-note.md index e9c8d9927..845308c82 100755 --- a/release-note.md +++ b/release-note.md @@ -1,5 +1,42 @@ Release Notes ---- +*2012-8-9* `version:0.2.0` + +此次更新的主题是"方便"(之前的主题是"灵活")。 + +增加了webmagic-extension模块。 + +增加了注解方式支持,可以通过POJO+注解的方式编写一个爬虫,更符合Java开发习惯。 + + @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") + public class OschinaBlog { + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) + private String content; + + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List tags; + + public static void main(String[] args) { + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog") + ,new ConsolePageModelPipeline(), OschinaBlog.class).run(); + } + + } + +增加基于redis的分布式支持。 + +增加XPath2.0语法支持(webmagic-saxon模块)。 + +增加基于Selenium的浏览器渲染支持,用于抓取动态加载内容(webmagic-selenium模块)。 + +修复一些bug。 + +补充了大量的文档。 + *2012-7-25* `version:0.1.0` 第一个稳定版本。 From 9ad87f637c51accbafb716c00099f83049b9c873 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 21:54:24 +0800 Subject: [PATCH 170/175] release note --- release-note.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/release-note.md b/release-note.md index 845308c82..1fc33ce09 100755 --- a/release-note.md +++ b/release-note.md @@ -6,7 +6,7 @@ Release Notes 增加了webmagic-extension模块。 -增加了注解方式支持,可以通过POJO+注解的方式编写一个爬虫,更符合Java开发习惯。 +增加了注解方式支持,可以通过POJO+注解的方式编写一个爬虫,更符合Java开发习惯。以下是抓取一个博客的完整代码: @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") public class OschinaBlog { @@ -33,9 +33,9 @@ Release Notes 增加基于Selenium的浏览器渲染支持,用于抓取动态加载内容(webmagic-selenium模块)。 -修复一些bug。 +修复一些已有bug。 -补充了大量的文档。 +补充了文档:[webmagic-0.2.0用户手册](http://code4craft.github.io/webmagic/)。 *2012-7-25* `version:0.1.0` From c8e5a40eaf41d608a098cd1c1f227caf1d9e1b3c Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 22:19:38 +0800 Subject: [PATCH 171/175] update docs --- webmagic manual.md | 21 +++++++++++++++++- ...7\347\224\250\346\226\207\346\241\243.pdf" | Bin 441895 -> 444139 bytes 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/webmagic manual.md b/webmagic manual.md index 0c681c551..cecc25a88 100644 --- a/webmagic manual.md +++ b/webmagic manual.md @@ -298,7 +298,26 @@ webmagic-extension包括注解模块。为什么会有注解方式? 注解的核心是Model类,本身是一个POJO,这个Model类用于传递、保存页面最终抓取结果数据。注解方式直接将抽取与数据绑定,以便于编写和维护。 -注解方式其实也是通过一个PageProcessor的实现--ModelPageProcessor完成,因此对webmagic-core代码没有任何影响。 +注解方式其实也是通过一个PageProcessor的实现--ModelPageProcessor完成,因此对webmagic-core代码没有任何影响。仍然以抓取OschinaBlog的程序为例: + + @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") + public class OschinaBlog { + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) + private String content; + + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List tags; + + public static void main(String[] args) { + OOSpider.create( + Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), + new ConsolePageModelPipeline(), OschinaBlog.class).run(); + } + } 注解部分包括以下内容: diff --git "a/webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" "b/webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" index 3c234a8b7da970ded1412d81d56a8363d2f05e17..543884e563a7dcc00eef19c9b95ef3b11f83506f 100644 GIT binary patch delta 281189 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�gG59Tikof_ zStUB9=zX2r`^yeqok~gt3^@2KrZIcF}k~6{0*y-RQZcL!g540{BH`99O$o z>#$j&MMvy=<({S6SVw2El&seQV){k(d%NdiT!gzP;7d^O5)4uUksrI}Y1j%=X93y{ zsnY{^2#&uEEkhFLFBIeTxj&ta6N6q+yW`l*3pRuwM$8*aH#=%x={_ingWxgbAA}WB zBHplQ=C81D>BNe?p1qrKRDj=BVKn+43t|?8Eeo&7C0K@NivKsoPb{A+^tTDyE?0sg zm;X%AcF6cz6enX6vwhkMDMv=JQ@nImncW|z9*G3F6$7)J6z`P6U}In(6xrLTmR)3V z8?(+S)?kJF&AI~`x+o76FQDu06hltvee~QW$>p#BwmCwu&1#$|0^xQ^ z5e{QIa={&PaQ5e|@F|*;vo)a+*pu<4LXrxeBSa&(vMJToEz*F!=vc%&5fruKZ!G6r zNF=uReuOezAjE^1Cw@{D>b|WAr$05c(c=Q{i&->Ywm%u%7vpHVimk-A(*9suhLRg9 zm#rfs8JwTXqMnpOy!ck*QqfZj(zLM`pS<`{gO(5ZS`dYnqR26KYx79QKiEvR{i09= z?HSxUtB@5-K>b4lubxH;O@T37igp%JMsB@6QC=*&fX|#5{aj!*8(|QuUxO%yR+wTW zV?f*}YYod$F}E3qG5DV3)OU!7kubaUu-`U&{{VGY{jQv2NxFom08@>9jBd@gU3f!u zIMi*qN{Q<$0r1+pFIQDn;r{;Q9Xx+qJ6(io1gXEG#o?_%c{4s;e_EYcvgFm`+js@T z>9d>-^L0axbjB@7jReN>A4|T21V+KMVzni6=DlNtBF@4~mYS0dC*o~nyMSBwPo%0X zH}7UqIOEW|!s3{GP?h6D=dcCkcaN9~#`H+Da9NgFErx;Gd4rv%*46XJ#(0E)GS23P zso^yZyDW;_5QC_IQjD;6y?xSJog@cR7X z4NTo>D@c39ca{i%W`eMBDhoPKVf`)HIo;H$N^HTr&v;d%<>Xd*D&>F{(#tT#2i8yh zbVuU3HyBP;u*XPPUt_r*3P25miu2j7k*qVA|!<3ir_|l&E!GFQpv%Vql;o9oW+H7f#IJbq?oR7r)|^1 zUHGyCQc=XSK+R!uZdkhiVcn3>LXV#{wSAo;gj5k2iL!AB#uVccK{M1bo7S{0x{2U@ z@;K!|fNy!g@RrpW{U01glL=Q7JFS$d5Wa zVJ3^(J-%zR?{{q35A^qE>THA!*ZAw!B zlk|nNNygd%S1wG5oLr1m)qehZtGUu>Ya7m~9$FSSp**HM9ygxzdiNR`^MhoTaGr#N zxPf>9IO;2Esb#QAw%q-w&Yc1$2qqrq@@dkLO6fOXw-2lG7#yu!bKe|Y?@>ay1U`Oj z`{KWyvEgf9&$K^wyxp{~0t(EYjaSg~?XOJp*h@IJP~Wh5uWhHo{&qcwmg9(BB0-Q( z`RYyi27l4gC z&$e<43mJYXu|0cqWwgXLsipVX&7ws=n5XNoKel$`aaT9r#nR^u%>!@UaF)*e@Od z;EV*^D3M}mMjNzaXlB_kwZA1=nevk5%>`Ksu32J42tAO&cOy}7w>iK%@GgITffbEF zxccnkrVnECN;UwUq)ekRc%p?6;2k=RoqW8fZDp;v9RBGEpN38B(8bMO+0<_^DP7<0 z;KHAXX8T5>UN@DAEYW*6Pa=3dH$Wojn*9ma(%k;{>gKYjq20G*IcS~wlFPstIY9pj zavDgF0ugp#w=s#>St|sl=4Nx#9J<8TN7}J|KZr15AGPp^?P!F+Xax&RGNk$^S3HzH zHloSzFx3ofs1l7m`dNUM)h>u0MU`ohmK7%MO*kpZG4Ah7}8S!khcTs2dj$ zr7FDI>GD*w&T*ftq_I3eLT1TnL<%S!)@=knYCBJ%-6wAn9;n4UR-|2bxKee2JM5g& zNw)3VlAd;t0w7+LY#)S0aKa{DVECQ36J=jVr2}byRXF3(U&AljD<*g2uf?It-0J9J z3(V3e=%Yko{fR#S)nl?Q) zGiS68lifhmbBfNL+tc0^8Hyy~f%sK!0kOefg8}8&06lXVly@0hwGfgw7)Je7xFU{OSZlX z+IMB#C0p75i;Kev^u2C_0gO=mOI`G#<7yNyQarn>(^GBp1|^H;(}#N@MRBKQ_4?xz z5LsFii%@~$@AVDWR|>P%`H?$U_$V;NdC1IC^=m*4TuHE1_(FspIguxh9gKt zU_#P?gEWrJvn>GNZRuObiS31T~&8F+xO|FtY&`{yLfC;TH-hQ}O6pn#I| z>Yot)3X59EG73avVdNZAC7F_>qMwV%wMdZ7=j2BZ+W^s}0reQ_5665p(gB?fRv^9= zd2R7vn)T%jAbxX}tEpQI6A{a1gPakrV?jxoo>+SF*oX{03}z+Tjf)sa=^u(IrjIBj zxMCvJDU~2j&o=FC+)5Vt!FyEa%)sFIPhfdC5L_hg%cy$N6II8FKOW72nb}}I8&;>c z_j?1Qd*aAy+l^4{k%eS&S-O346(lw5ufMg=xRoCUq+1X{%9M8zvaKg>5h$a|;F^H3 z@Ag@w5N#kvOQZ!>|+(t62M6#@2P)TbNF%e`Qy$$(K)Ku zn2$68X!?leYzRJAI$*s%JZqiFU5nqFaK=u$EMvF7XvW*29hB3@NCv8`8;tDaNGF$^ z^kBCO?%R6#WYFQm4Y)M&o5@8^LRlBB?7|%gE{KzNdqAHv2lZSyC~_Z1JOyU{Vk8~T ztMxw0sp9+1IEG=?O%{?g+N-}^7H7(89B8ft^thW0aeG19tnhA?B2(7FFA|WU*umNa zQF-wd*$doUY%3!@b70pL<0s#Wak2=>ATLrcC9yf`foTOi8OK))xKeBhg5cSBqZj9l z3ci?i#iaB-Ca?su8uubL+F`*6Wo{jz6X!xdp_-hUG7w)3 zazv1Ppql(!vGv4jHDLg`G7esvx_g3q`E45h;LtI6ql)d$J}NdU-Z9EW3(W}CSc}bC z)&`K@t2ln_JyOkB7NE5ZCs+?HV0*0t(=BEgw)Af;xnI=IKw?$-QvZ6cVdZ&k14SJuCrbT0OL>XH#T5m= zH>EiXTSFd#w5`G;E8)2Oup%gF2w=Y4$yeyjvi1HoJ% zhM#m6oS?BGDUSh$6~=lxI#V|=X_Wy+6etP5Y&SV;`7&{Ak#zd9ulTF1GL(F{{tcf3!`!hSpmxr(DY)tT** zfLJnY#g6P{K`Ft|GRnkm07mm9AWTq-y~&p{Yx63FDit3zX({XTklBQf^7NYW3;KV@Y0=@{0Q&JuQJDtG}QCw8G@ zMnWxif#vMtbiA0$_FJ@=iPIYo^@4ZzGX+XB{P^;e&HZ@L)Nmr-Z>Wy|f&PtIi(mvs1stP4S=KY^vVZojdXKU@O86 z;A=!{8T{~uVABylsZn2%mEoVp!3=skKUCiiP+nJ*_!x4-_V|6W${+>%zy74-A$fD< z%^L`=%3y|Q?8I$ttGynt=DDKPhv^vopv@e2h*A3ZCg`y3IXf7Wm5J+q4wRf$YP`=Lj329p)wROJQY5U$#JAr6d61$@THjfK(plEO@B?1*ld^^D^<^ znH>r#OerJDG+UUwVt=5VkkO2iX6xW@6P%3=Eo?3#;@nvK<+OF0{-QuJGe(TJp+EZT zt_baTnquY|?RWw0xSC=H*pj_D=yDhcDv68o<{nDOHDdC7h6f3f?R9QI#7-2WLzAXSU{RBo2jU2Tzgi(T;l1qg8b zC*^;bt~nZw!k~ZC0ZTzSCf1Vqi}jQGa~%!`a}8r7&9#Nq`dorpq|U@s5whSQoLqgd zsseS8BghgI44MbgfUkmkgG+%Gf*pdllLmqPg7E-{2GMnKcd>Vgc3E}(0iA=|K@=cW z&@D(GRR&BPvJC_wjAck@h;K+{$gw5U<<_O&h1T`8%TpL&zAHdId96x1omAE0YE1kC z8?Oozf4zF9b1_M%tf708mYF4xE#NN9V=w%JN5ymYT>^529wwe1HXiHGZoz9QOr0hQ z?IIE_{lTWfW9{bTrhH`x_&yrs2nB4s6cTL=o-#3CHou*)=Nrgr7v!`Gx`_whFNPeM zg^5q_^qjSORV116I|SWCg72q5j?}`&Cw!VX%-&uSPYJpUdv1Vk-oW>vAx9n&X_*O? zJN_k2gKl=f_g`V+t7T+|J|WQW3XA`@ar}>M|3971`i~RB^WQKBo}@T+2-2ij78qs& zj{oq;zw5y>iyAqb{>N2M$}BA>rTtxsUR6!n)Y8RLRg6*I(%j--x|+SZou!HWPg7D> zj{o8B|F4w)F}&RW=Ro zokPEa?x`(srLRtp!`St2EX6OvqLz)cVgViN?!Of$vB=YoXJ@A{v+lhfbH@4hs z&Gt0>wkrt)%nu9}jAIY!kCpgadN*$E8A#g{uQ$0{b18wx)5o{7n_6ojEFp3~95hKx zal5x(1EbRf36hP*7G<_}o;rs{oLoJQ_NJ zy?)Ne^H~Y_uEviZ)dm)EV%N!8rS=Tb?5FE z3NSjQEdW{^+!bs@%(c;~^J~UQzDxKcWH^Wgv{Q@(U#yD*I?4X{?v2$&m<>Gz(*!5{ z-i$2ls+=hR(gU-K8JYH(ZktLjV%Y8lk#$jKBWBl`XiFcnGpi-e6ziY#8g<=+S*5*f zAQr(ALQTCWZ(1l=`0#*51^TJJvnL8c*+43{0yN;5o#0bQ*}V8*Y7gv&2%sIy@)DEW zO#*O{EhFB)im4PmrFEjagpg-2%6KRA zQNcU3WzlgKfdfje-wC5)R`Q$tz{&}tY%zsz8&HIIwNOY`^1reBS!LbKEEOrr{(Yuu z0fch4F=uqY>*Lc$rM<|JMg4gZHp#vT!a!Agry}Leaa8q7rLc-wDey>b)B`JtIfyuc z1E&=lXPcL>=0?nJfdDHBJ%}HWH7#O^k!@mD~tHOET|DC~QdtW)*ml44mY=e6iqX$6+7DRPxQ?pW{m9I)Sa1a%}>S zPuls{wQ4l=5+;Rjm{Og^0wpmgWFM;enj=!3min{?B%qT5?$pW?UX9hfO>rG|#Q>|6 zlQrcucKdh@BFF?PL19Ps4)rd)E|GJt`;>#2g_skHR8M?iYq2{C*Y8q{Pmp-jee`ixL&O@>g&w9Sx-!PWV>L zH`~LiQ5&{iN!a(30rVoeZ)saZG6$Rx>=z1%zW?>iX(v5NneVm>R+6;?S6MKdKBcR&Y3ZZJ)vqFCA!q@7$B+8t z?2bgjN1wWiO9_gBJbI(ac`R?#2vSNWVcZS6x?I{Q7T46woC^2iy?d zZ-zmLFO2fA*+5B9Y4(#dm_rz)S(mv(j}REg7T$mhiim!wmUYmYtq3uF7fj0fHKoao zY9tR@OKg_7!K6v#GpYY8LH73`@J%BIh!lYr2$SkcVLyYAx9FxwlA6~^vV&cBfgYGW zTmDfkjH^Vn0qtqGRaIqrz^_XS_T zwG@$r`}$&z>pk4P#5KLp827L)h3mb~7wJoK4DfU>p`_uxqU`_yEd~6&Q5Xf|#q1%o89Ogz4UH!KE6Lwd3Jo2_}g8TF9Krmut1i8UX zPt#ZoUXqyZ$CqR7Nb3_L-CO8^`nPmPTfcz>i2+v|Q(Z1#5l7;?71n>%`Ff2cx8_JIOI6c zPGTzb>w_QoK;0F5gV@c~oop&peo$>>xu`{m^nT$O@I^MwlxokCdP5L0U&B$kOnQra z{kGE)e#7j>a&bEJSWbic`0eDSmVK8gr&FlNWX&L_Ba8IXV3OrRz3y2Ra#tS%@A0vc z?Se#Q@)Tr{ea@wFusC#E`R~3EVdN{3pFu~T#|5B2AjcNTRq<`Z%CK$sFwz~|2Nsv) z1%4M}5HG8SMX)yE+Le6wmYJo)BlDVSuRPmk5Hj*I)6i#=K9aN1Q4Q}Tv(!k{_;w}oY(cAVV%SQ|M zZVXUq{uX8NxEF&5$Pw(?1CiJ6*%z()#&7Lx|1=XPe2rsIu&}tFs4HHZlX##0IJlos zekK*qF@il$G|Vg?CY7uo7__g)?7Kn{FIjeGZ?)vRLX9I&hkjj8lP1I;U(OAxSUyH+ zUk9bVuc3B3r+c65J0_kk`MaKkBvOQ=^ngv^*EKLd@RZdy^wcTR`RNvPE#w`14SZtn z8lbR!;NbSA72BQb-ggP2n?XF{V+66uPZ601pf%ZZ?Us< zM@_jiW4wX3;HZN-dxMt#$V&@$2aTao&j}1bU2)`~b*7ORLo5he02y!@kn%^OfY&4y z_1$JqP!0);QCSq6Dl+w0rg;zf%Id#$M20NW9_+d5_Gmc1w3I3W*K-}i9`HOOWVUVG zn~f_(47+f)ZH+qMgiW6N78Bz_g5dEp5$;m_li0@}4uykd+m{@Jn5RDog@J9`5fVc% zlApx;HyjBN0jHERR;cngiy`kJjqU1tAwkU#gunqV{%{6sy+O?HAUFfbjmq3|93uIr z0S#&&1jkK@l}CNko=25I6a(WPB?kGYuUqwn$ybjw$yd%o7$3#aNl(TQgn(hsrCIV7 z_6f*WVy~k|94*H$A?yH;dId?|Mc+905mp}2FCnj9Cw|QR(FEwZT zKwqL}%F+W21|LoG(y955ApwRIFy0piL#;?=cOXMOLG~${9u^^FwiCi8uj>a2)A34f zdS|7+fI8!u?0dI3ol=$O2VM{{?2in0!ajfQFpkUf2ftkS1c$k^QE%KjQ+M=E_Bo%X zJQ3G@3U0;d8t(kHqZSN#5p)R;Q}PK7BN6$C0YbvEd;-F1J}41pC?GvA7Ac2E$~2q-}_Oc{M$9%@}}@# z0=(Tt1ZqPst$SG!{P;Kbl+k1sjY&Bnk53n^w71h8h)VwVz z8XE?b9HbVAJrAP!pk{SG1xGiXo^Q<^u^){VP8=>p2+6(Kjc=#9DoKV z8@#1-`cjr9(_{W5WJIhr1G5}uQHo}(1~yj!xh3M=UZ##GhTV>4=;q9AIO&D;-kg_o z`t#rTrdAL^ZpsF3(edKeY6u+&?dS-E-@DdVPY@bJ`HTV+pe+n;TI zTWRN?xp?G4DMv)MA+~xD(n{TQT7B40Ypi5W;H=na^Lw?`Ie1oW`vwakG={+cq2pbI z&no_<-{(gfO%AUSL;(VQi_89>p4aCrLylVpz&(zNY|f~jl{az(?u$u-&#!_Xvc`Rh za^s9Cxv{0<&?K6Abci{kV!zk*4N79HaawxzFSdOOjGVIB+Bo@KeZ&A--iF-^#hUzB;vNRzVY%j|7*8FI7Ej}8x?Fa7!D z0Gm7Vh?>Y65LJ-M@^TpQEUy+=T}O>*S`}07puZdrSu=Gq^fFUTZpbt(cVs{>tqXiR zmG&qul;)OAdIvA+GWAhh)R$}VO+LAFJ zZIqHUi806oy_w^ef(@9TPiw6MY1qWLz*Yxc_+NH95qvBOr3ugH&C|h}=4r2s+2G~l z<2EiEdb@RRV?-0e)*F>=6Hzw$T0G?TwZ&iL6{*nXB{N6_4GF+nBaK_HyxFbaC$6DSedLNK|mQoj;a+Tyr+jjukI!T4&(t zc}@=EnJMSEt}CqWmcq0`6%W?n0T$f%GkQqA=$)aylA8@i*Jt*eB`5r79%@>ryvV_bx ziQ-I`+O5a*2HP_@%mB85U&=(YKm8__Af*0u_rVg68z#j`pL7WLD6Rt0sjAndX@<>@ zlvH%%6U;KPh}NzbmP8r(trqPH-}*Y2rQ^pqnai!`N8yoCCo|JRi-Zs7y!-aU%6G* z7a9!5%y1ZL7Hwn>e-|jhpwFMYnHiYd1MG7P(@6_J^%B;W0<~s=WmSrI%mg)TTMl!_ zrr{sT%Df03Ag)-5roWLR)yC_uDtd0m(auOin;}O-t9WfUj_Xld{(e}!nTV-fk2Kcy z28E%Jc>BLNdh=(T3$e^03e@00OWF6{?;@p)+ZC&Au2iF8yzO&La@2v$|0c-(d965t ziROp$6YeMdkg3!XoL#R(L&o{{#8292Ir0PeGYrgsm2(TiS#o1wLUV>Tf+Dkp>M`ju z>9V|@?V2UcH;XT)4Pq-YGPIQ5488M}&ieTpzwYjzA$*2tY>wIr$4H{?mP=e6isp@b zPYmrx_~f`1|LV21XnnqZM`zJQhx2=^foPsvczN!+H{3^>!H|!Q{{PT*j=`0@QMaFo zZA@%Cnb@{%+s;I1V%xTD+qRPv+n(eklRN)g?}uCU*6rHW)z!5>byasiwf3{tZ$(Aj z8>1{f)aeI_d){CbK)>!J6-5_{9ogo%Vr#8*hS*+}A@o8itZda2Kf5as{HOZDdJSo2 zV*lYP9awJ6kk@}FsnYR#Sz$|TA*y5@rWK#oIiVbp# zYHVrn!i|$QsI&$fq9~a#x|t_SwDu;D;er6mIg;Y8dkM>(eFs&e$9f*@M55r$qH}C`m`|xcYYKrhJJvfH!vLN*!T^5mehBZ8tzua&_Ycn;Zk?}GJGGlg>J`bGyqSl& z@h6NpJ@slXxdPehHslCd6-str=!mUWS11iDk_G>y=mAFZuP2e}32QJs&lH05C*_GU zdT=7PvwrPW9MDsO{#Wra`k_v-8y3*PWKuXC^_lAmP748rZ` zT(C#YfIPl_JQNNRyTN2gVhDDct-#*+ zcDpIq!CfJ&S_wHdmH?3}GmIbtgaB2ZbnJM@Im42_b#q?jZZyzOC8^ z0nk7s@c@XsEwz${a9A1>TFDe?Wn|;QG8Dm;;9t2SCer(6;^w*5y=52|v&;33p#`)x zxNsn4aY30R2cAkR{mkA%nE;kpa?yEqY6FUQYI)ATvgLwP3gZ!#jMtZkO69bU4|y}w zrK}at=Pf}40a`2qg#P)5%M0!t(o8axfF|jANL_57UsZZIb6xHpbHP+mqb!BGAQ*M*1))V}ZU!9$d#fG&#x zP7C5wJ`#jR3A=Ox>;}vF`gMwCGASCW&e?drwa5&(?`Y|^M9ZRu=an==u`Q({$s3^} z0wpN4Lg^!pyn_1XxW7@rF`kK)WI~`pc-aC_%EF^m9>E}zpqeBXbHyb-p4_y zFRD0(JZpRYCg1n1q9j4@u}=U$fct&1BE?6x#D@dBkZmTWq=RdhTuL;N`XKHuE}I%D z@?bNo@FyiK*x&GM*?1__pC{OjZzmfFp;Ha?Zo75Dx97qBWvs!Z66flr2c%XVqUgZ$U{k-DySc_)d&+WS%Wm4~z=U^4& z**0a64=@6Cx>5vR%m0Ei@c084lFyJit~Xi|ksxwdPvaL|mdq4wWp$H5rR+ZxyfVr7 z3G8zjeVnd2N0V!~*gI0D7Ojo)xrYmK$stI41$X>*1-Fldf9OHODj>kE$p zr)zPg{@U)(7Oqh60_3oOrJldGC3Gum2W;UtQ~Q3omf7E(wRVV&-Q;x9LMh&z^sO)c zWanAk3&-)z;pZ2YIhgCHE&;RcfqFOtCcjlxOyM^soh1@bS zHaeO_aQUw5cN5PK0LfgI>T@zhHdZt`KFSSe99;yy>G=^W1NtC5(dVG*J{s<53SfP@ z6&t7{)58YYJ!p9vbTDkQN7?PO71M^pBb#p`Prfe_CrSBWJfu~c2N5UJkSI*L4g{R2 z>}X|o&DtG$^t|4=Sq5<~Y2QeN6&`QNBag%9nAr@cM$^XWZ`S zZssA@0$qsu0A<#_0{VUHZf}0I8k|fS_=H`Ct!-E;e@Epbo`6GLsyr};f2gDesq-qg z{%)sQE##w%w{KX@0pNXlkpn+!u-6@8IywrT6Sr?hC0|tL(sg}dKZYf}~9neMo$Y0MOhEl_*_+6SY42FEm`=T^BoQ2jyVSvPuT4Zsr zF8urZHS~)YO^V)TJIM|(t@%=)r7xRCKG`C7tHG~|DM^ltpyQlU8R1Be)saohKR?ON zp=`OyFtkn#Q^>!u zbKwem9i$E2Y_F`>mVvj369Z+f)|ipj_C5{+OEBx$S#<2zAwV~+q#z8_uQ7eo{s6g; z@j%_lrGu2bDRs5vN?KZbjS&Kb)9|4r2rCU1Gnj2b9;#RTX=Xe zqUf)=pIsLX?{cG4b_gFp8>MI=Qz zcJyuTYV8eqcyik;ww_RrDc_e9tBeDjP*A`RhF~g=Zg~JWh^2a+#t*0pquW8VkeZ=cCacc zmZ1=uF`f9Fo^Q;i{EbTd;XwO*Km?dYIywCJ>4DO-L9vNz)*oVvlp59@r1;GxV-7%T zdo9jUyz87H8r9A^$MU~>=v15to?>uAuFzPVz}AMTp}bRq8Qs%W?;z{E4ERwqaK|`M zN8LM|{4s_eWT8U3CJbg!sCzza^RMsC74HpKSH?F>%crg~uMq#NdNXiP0C6)iqYA`) zSu+15`ydQO_Ej)2X3~{NC9$*l!Eb}Ee?Ex^p%c;`rUTDb_g{JB#FF{PS83RlcgWRL z)}!kKu*ks4)CnvE4#FS^Csq+4yj(Q1exXwAt+Q!&E?RV}H+*Y$1On zw9ri^fy&RGSBjbUqP81|1}IsX-`$g#-O($pmr?K8ERoWZZ)kkKcFSnDV%wJLGp%{1tP+Dh!3UVNkC z6Y!d>SK`5ivZX4rlD(;MGyrdncTO5vE8564akQ?kL`?#$5R5OM09+a)6&h6XAAkQW ziC1_EyRLwHzE(Fc&$87lgs{`%65~3yLzC$~FB81>JB$JD?i=2YyKiAPHtq5WXAR{v zj$2gOKaJ|+H7*(YoZfgQH`oV1Z0NW3_6ehi1~r^1!SGt|dAkUMwzdo?2d(bvSR{4<#Nc z{?V5}edc|B7voo;{hkn{gnsnyMSdM(A|$9ccq0cpF8 zd|jZ5W)XqyMn@0PM}v<+p-GuoopcU8{@aY&0!?5>Fl4Ec5CBA1ZzAsE+JIusuShTC zRPSlJD>fRD`XH`j*r(j1OwrY#(nKv@rqPULWQ~Vk+JCbLZEe0dW+8`Rw_d9@w9IvX z&7EGZ-SYM*G)%45;q%Pg4&RHmQpbLzN8;T*I7?@i|4k>3qG`RFPf>))JNQD?`+RS+ z4KDsbAvu*I17Ix3^8cPa<&rS96jtiBK{HKaU)>f< zE9fZUG|p)Mbz7?EumsGa`ZITL5;uMrM_m2MCgP9L52)iOn1(QGAajV96DC>{{mD`} z9W)L%AJa!`R`1V!HTc^2)j56>IF;4u)jIf5GFRUopCQ=^W09#>(O1Wiwq#oBhsnl=h<}l(>em3biMNW2ak2*M%@s?Az z#suv3AxX;Eb+_4hAgEf(xSWc+z1iRa;vje^0vyh_KgB?&X-K7Z%4s2<+N3*OC*qnM zE8OXg;iKMREbE;P^{na4iFxa$s56v@x;y-Yb5^$21Y(O+{wrg;)3K@L#P5d+O=cYD zWc)0`Pn0`YIU82A=-McL(Frt=lEweXSkmi!pUnYc30vEIxryKwK{2NY1uplLQA>qO zfVT(hD#`JdVEIHgg40dhu)y)jji=7|M&?UTx9 zD8=aEzRhl-X908|Y%YSaqY~KxFw!7Gz&Mq`Na@dLGwbSKGr>s{w3}7ECkdoM-?YKW z*@Xwe7B|sQsU2w5`$g$lNwe+}Iy4D=U+G+3>$*V$nkTEZw%d6#HBU!sdK@IM@~p=hkih@&MTyXx+>?@aQIKPVo&DMRCEv7-sr=K8sCtKF?nR4hb(ZSJAaaKI6um3W7R%)LA>!#0J zZ?CI=axaw@2TgzK(-cIhi$-WVXw`qyFg69*mes|{p7?xW*Ki=^b6$#?B%R2|1I)yw zHq52Lr>pWIgEV+b1k4ApStat3{*mg%j((_=j)6}R$e@#eUu01|h`(Ud0;c*WnDcF3 zX$i%;ZJuja6V@(>t7O@0b%(5o)R-uZn7(ON|6K=P2itW1md7w1q+F2MbfV;D`p>X6 zDY3V!`EizGVVG}uJ6d6OYBG$|hIxah5RKsWD|_Po1t52PQ}egJgbTQWd&g-(`rfkU zmY}z^8QsTz1Ot7^iH(k!*rm`qvD!Rx#fB`~=}J%r_2J)CRpHug{K!N&7JC-514Vj2 zFy_EN&+T4p6a#@qkh6na>}d$lb-au~m+Va-h~+gGa51ZRZG~dnj&mRzMYp@x2Nqv_ zTRdPTB8P-G$iq@?RH7w1nyYAkLtBLjk|jXjfr~(C^>c$kWTB9zLvw0AxIuOg1l)@u3pUAEl#Wip6v zsm6J**AtnaVC04GADB_`7xz^Dut5Z6o;?TFP8)+RCLE^7?bY2>q+487W**`_d(PX^ z3&$P~nN5&>Z@HuGGe#UR=%x*+t-Yh6y(+SLfZKbnk3cl-ojzFE{BB+3!FKg zGTr3TzJ)Xd4X>_W@q~971f$~-8CH&x${bmcgmQC<%jtxMzNd=VlmZR2HY*fkrPx^_ zK~=A}%&{Uv5I&fYr;D=$Eb}XOH|McJ1z=R|Oyoo5I<)PZAW3v$_E-%(R`K^q*S#!% zfR!lO)n_vTGi5n&iP0)lABD9O!|~D&sqr_D@XW&s{80#0`Fld|5iWoMh+r)FDfO0~#>8`>=oD|do@xSt7|X6;&C0-c{i zuk!ho*M_fey8hk)6Y-NQ053pv0IOLu4!Px2YX^ATZexoAk*6cz?P_m9UpMPoVCd*o zq0YxUu3uMv)a`R-OY(*(t&m{H??P{^)>p|3=cNjw3y{i439bpS%UtcN);2m}DmE5>q{=Ub`84h81|>uLSe0v^Y)& zT;mT^cZJyE;nPNRpx~8T`?P=DfN^@F+lQgdiB-wKl?>Jg<$Y2hGg%~Z1{flZPj3l- zykpE{yNb2vrrE)5O`BUQvUzpcv8U+m!RNDrHlQA72Kk&EFlvr|O?kt_=gtW4)}wc+ z#Ik0P=az*~2-8y4ailPnhRx+TRz?HSzk*W(Xe|kYV)F)HRPgwV= z3n`w}B*vRb?@^>+6|(aUnh!b4PcoMmi|ECT(Suw*SvFOy@4jMPa=&PV9V1BX7ol0O zAK-)h#To0shUp3-Xjtpqn>ZChmMy3xgXAp);f?LLycQJ|{WapG&Fe}%3u0F#_`HHj zH>R6KqGinABL2{jOHD_7>J#3&I5Eu4$(W3LIyrz*N<0J+LTRlT; zxd?aZFss##?C+=Kscz-Y9Ln`8m~gR3N&;e9zQGlMy66_Q-B=7?CQsm9R+Q9#Q5c)Gg->#BN%7>|fN z0|CuVZ0VT8PcJ_Z(S|lhWTGJ5763BKY#C>%BG;5ZC_tpZJSHv4!gct@WvH`%<#doR z=-3g#Away#2YRVvTF6uL<6*A!me3tET~c(K+gIYHkCQaZ8$Gyw<(@}SmyK^f{hU12 zb<}N#jN{j|vn^7Z{D6nZcgykgTu1QNcu@9KUS*-fTS~#Wue1NfH1dq&0N_8Zzapi? zzMP=92-6Xaj~p|JkQ7cJBv*;G6#nBN8e?%=HG_pA8$4<=|F|2*GgT+b0}FED3}v;n zJiPjdL&<{lZ0&xf6ycNQO0#;am(iUYN@`>d7w@9 z*(l&5r?Qewy(?E`k58RV9gsq$(GsHe?9pCHT#oR3Spb#Ce&I^BLBF^TfZc|pWGoJ}vkj@4M?dY%vKk?p|F^#ehO1>qew zgMWF3|HdRkJ^Mxv3KitWHH%Ho)KZ%z{ZF-;U|hvg(?$+4!EKQLzonBRUl=c67zwaT z6u++b5SAZm(m>o&8fvvp_r|<|$w@aeE%o{PBq4QQ8075)(WEa!p@KNIS}%f#S7F@5 zZYPSkRccHdvIi8ojtGWSH({qVAC~DQoKI43NDQ+4$jxe3KhIos`UwJ#cmeoK}D`9bN9dRQ#D09Y~zz zp6jN2@&K_QDUv5^-(k8Xwu$vKc(e|5_bd_6w1GI#VmL9fiWS#XvP=))o(Jd=amp0N zWbt`Z8oz=}`G+1EO5W}lvdM}SXB~NYtXd(0W#kxjKWlv3De2hj zg9mfVJB`&Ob5Bu&VS^v*%K+-`@s&@mF)8A%-uv3>E4>=ebj$b%^Nh)|W19@MdKw*m zUp+=?b6EW~m3I2`1h2e^H{o_^`6oVX%2Hh0f~^clt=>KMLGUGua+(W=bcnUL_}lAS zXYSZMr7|TW0~~d2Edc$FHz795#+^r|ECi3F8DiZ_lU0{Y(AKoxJm7qhdr7|M4MHI? zeTDR{QK8;U!iVv8l8DAt!NoF0cx`XhfJ6}rVKLJ@Qx8{9mjNfP5TTIwC_a#;Y|hTL zzq0!D*=hBlcd5*2w*twQ>o+g+SpC?zpy;jRUAtk&t%M>*l~#UeiLI6>BHc=TEG~!E z5T)&UcBp=p<}#9oJfI3iZ|#O`Gp?mcv(lkj=O27&(t5_Z?22%e=;E>-Q7xUYn9z!1Bg+>p}( zm~Q@s;I3L!3EPD%Rc2nv8CV#Qu{o zGe922AoK@>J6=orRKcJK3CibvmiXq zt5(MVHo)VIOX1dW{P!USEz9=jba1<)J!syK)4jb%#SD}|rP)vcYBlvA_ww)5PW z?%LvrgI5vc5cH_&e~3@&gX_GnhvcKk7=2$vNP3NPcwOwQy#1}75uuknC5MO(OUz41xt=cjm1A10Ki?ZR}vQR=<<8N$hC2SwN{`q=O-m$)a-Zx&VRqOGV2+plYPT2ZGT<-EhnnYNN(>7OWP>{AksrIZJtEORP2sb$saB{GZ>IUHhB%kvV_1X4cSXpO`Nc z0+<|jJWbR*e!R!t=pPf-vC4OEt9P7c8Z1lm^hlphu2;KnXsJ@3A3c*v9Kvva+@Vce z-HqriXl**iwMxK6ytKxe4dm?Y+U;<0COw8u7hG~+oiBzQG1uR zC4J=dJg{tYUj?-7L1^2>35#g>N_92J0G<|EqumSDFN~vP%7JwnHCyVAJlfsjS4a=N zOBs@$5NF<6xFjVD`e<-f7H&KaE1*yteoS$dT$8R8^g4(W`pNr^5uCkB2D%)jhWL-A0@Ukm#?ZXEqZ^ag)8P_0PRTk zn6B0JoO5r-?`3V;^bVhra*6C7^HG-hhAk&y0;T?EeHnn?q8FCt8o9P+?tg z=WY21c4* zrGw5I!BR0>49rxEHO?|MgpcY6i^(_TE`AZq4(jM+Aefzgf8d#0Cqr!c91g7HPK8Al zV2i2inbDO;el^nEmDNNMW0FRfi>m{`Wx0xXhk$`av`z0R+|x*#i^~U@ESB@bR*H%r z^R<7|FPAcEglWw5=;I$b?s7)L^&dDzGGb4vbtg|+ENA=nNQ(N1S(ltU*CEm~_ly~b zoTeC^CzOdZNW#s9(JqRz$slVfn~;DIAm@eW&57v2sK)9M4$7W_Q5CW@_Wg3p8bkdV z_OS7;WNOm`++pMe=Wvuw=%PrD@WvPoHPmLmMdtM8&+(JLUxe4&@#6ua- zt-lq?L(ktjaw0MdDX)jV;WlCH_RyTG*jYgr24AWArm*)STlqc2iOK1ou&Rg;@WSUp z&Q3=RV}`d-5$PdE=r;~dXAqO`8JB32UOPPb#%?WAgkh0fC#)ydxA^CC*O5dmtCVhK zr4&{(tCW|qC$mwj+*lkjNd6ml7-NFD@Q7u=99Wr;D_y^)RIZhxmrG_-U7W$IP|}b( zr$C0vHoVd+t(S&gNn<8$ISW%K06eMOWembuu)zL$!XSW&Ag_k#objz8RHVGdwY=7$ zzKJ22b94LR7+Q2kz_lMU@5i~z0cMRn2j}o8d5)1A$4~Z-HUFclGn*D383J?8G*?b` zcCL;-(5&ZQ>TIXIYUrUxNibWydw2*LtO=<-yfns{pG=bYgsx_55laND07iu=?}|Fb zec@XYO+J`py!>soP%o8>Nl9YG7vVmlKtC6zA$Se-zA>GIWkt=v9<91~N=U|mPPxkw zVxvV{rOtmKBjPvfI%6yI$n>>;DY=eI%~Ejr1T|-KiIvJ#AcBO-TKDIN_$sUdLZJ&R ztmd2#L{A#47%vysAbCnpfE?1BJBQ*jFIewic1Hn%%Z@TGK6GBWU05WZ8lH=9;6!>@9ZB$W)RVJ8FEpugn77BaPAd zsC6r|h69yJ>Z+pl;5asQEA5sR=)1O)qXB({9VBo9KV3t3S-cYmFbxUrp`kY7>w|p# z{l__n{Ct$6!n{%7hn1aOr|vyj1Puts@sB!r`F{RHFGgG{wM2dvA3lCXv!(oT*isRwQo8ib*cIm-y zmz39BmB8qO<_ot&z${pH@42uS8dr&GN)*f~O5#^Kqu!5suAT3yCC_suK2+EPW@xsFmf=Tm~mH~ zXV^YO+}ujSc)oEp z;}lc$Tp_*??O^Rx#*XM}fiG;>giXG>mC4|C%<|=>xq8W1-dwzc(P6!p@YPp}1_B=me>^MYA z(B}j&Sz27&Zcm~qww#~F8){pSWzZOD+jf*00lN#KX)Em_gU%q`hb7c)OL!pjQrD(c z;{%El}#9&`e2^pNSYwv`Oc8#h^g-4k4 z2PzoKzMv{fL9^h@Dwf#pd(2{>=e{TQcp3H#7p9KB7#+hTYa5CFFXP7W$g{}59A@-F zd}#R!!S{*DB5cF@HrvtDD-y7E95S3Iq-kn>H2dnx#ow}@ax9i*?-}}O>_pc~-K_9* z)p&kJV=X7yp{4Dlg8cv(l&fMGY{$&e%rT{5Ls@dPcVw# z{gM8coc1MvisMLMm-VBj3NJ@X^F~LILl3(yxca=n18C>S81|Hwcb^jIGMtvl&?&-L zbr#W%&kWMe`Hn*ve0-#I;uuK532eUOLhp-KwT-sz9PAO}3)ch)U>A|%d;YTgdCB4w z(7q*vz1pGK1aG}j1b?%ceQwRrPLeI-(M2wqrINVShsL&^gOst zB4_y=y%BD`BXu86N8N2*^gt~hQ((JO{4~#o`FzM%?6HXUOlDq^${LZ*PfoFz(r4Un zP_4ECjv)>bLu~|{cvuD7i1xV?mt&e!*yEOR$ncprrb?JecGMoDN17;E#~ftQY7yDF z*mFbv@vQast~J3e`xf=*_Fd-LmzBa&rB#c5VRz%gqy3lTwmI`40uv5BQWVg^cWNnJ zQI{Sk8+Y#dT5tB0)BT2br@N)g*7cGguo-EsPr%CA=L0FtB^?YMfQY4Ry_?{{{WKf9 z(9!wFY0}~3=??~mqZ<`iYdPZO4Dv!=+`)Aq`2iE30Q_4>>w`+D&(d|IxG7_nZ2bsc z=jG)q7DN3e$gO)JPtmZ|=8|DRGvEIDq%?Y%$__;sttjf z2wDxpDBBui@c$GH-3sF^b_Cv@cM|*%gzy#7L`@8Fmz()kg^D?_7Tb%G3s1(oWB5b^ zwY=|)Qff}m0kcRW^2L?eHagFDdmf>1s=8*b%N3kX-aQlmeEcI|<5A}3M@&2al9eF{ zJIQK7{>kZH#c{BB=-6$8q1Oy%c#+X(H07MO^ctAIgrLH%gMT9bdXp1N@7Aghyr^gb zvGtmWj-K3K?vTW()}PxktK#x$;M3>^`o3l;B&D#WN8_(8*Dn(h;t<6Qe~2EMlH3Ff zbJWTEm^c7j{buQPJ``pJ`+zaBd86ozd_qs!^c5X5&>&35hFnhXMO0=q*in_P3j+m3Biwj9!@KWc07&JG4TV{HN6=*y4j*XOlSj{onyO=qmt*rs}q z?2vzb)dXHF-{A_ABJn?i;rq`w4-uRQoN_{|peM!SJG9?~k}`|Xxp`Xf`TKo@{JY{s zd#*erhL$sLMc@5&=x!m0el@4^9JKcfD5%MCdY|cBvi`oR5l0C5v+6hRPVUy*wJE^9@pLg zCwTf(ba%BuhFObnhoj$pCn8OcYbW0+$*h4u*u&*hLbEVn?HOA~ZJNEi`t z9>mPFcC3PBbqq8aQxaIxrS%G5IXKDZ25z`;!_uC1l_N*S%t z8Xkzh>nV>Lq_Jj-G?pzCcC2xlq8@e8KBFI58mYf4T$@QB_F2=H2Z z(po)SX2(yLdHEAL^C>?Tn%Tw?>^?DJUWn)P)k&8Z_MtUO(9SFu*jBH)Ju?g?UDZDB z5Cjz7ucw^txC3#7*nHwb1rW&cLshT_u~v?B$`1WoqpK3bCdztHu9mKuhMJk^?g59R}kP3A=F%>1Dw7buFsW|uI3uRWXgu(-q*_5FAnvDzt^0lQ{4APB=!It7S zpUWy`C60Gj()y(|3Bfeyz-NHxRkU-CQ!$*qg8|#Ix$i=fB|B{%lUMbUr93nHMzv)f zz?{hS_Li-K=f<&~X5Qb(4TCQx)v^Qc5x2Cz2YvrcBRaMojUC)K_%>I}|ERpo(#pvN zasvUH*z`wuLow*i+dAEpmrxZ`IxmK}zd9vE3lB4F! z(?0iaTOz~uW#;JQ|PgxWQP>&@yinNAg?a-624fg4|!!{vNI0l|Nk|{#YE(!kcDcniz+} z2551R;dd6}>QSe4`aU73&iq2X6;Ve>mcfu|Gb&}D?DoDK`ORPIZH>lWU2S|(vP5DR zIn&Ziz57O`7i5ByW>TB7~^7wT< zv=y4kPhfEieNyWP=dO7B10Tq{g%0P=2&^}I*4}ou5=h+e(xu+#_VO@$K`C=Km;-n@3R%$)?-YxNuBy}Oba^!yWDptA1*2jM!AFpf!v6jtsD zlg$ED{TF0nnecj>2@MQe`lJPuOuPK*mV+P|Ih%MI%(uR{W=5U)RnMlS+qePX+EfLNUXObxTa z9p@B^1lsMeN||1)Jsu@&>E2+xfF)0Cx&E4dieOe4vcUHyIDM5` zsN(q*v&ssYtl&6Of24g35fjB=CNM(?X+mMd3(3{mrF!@)h2lJscbX%L55m3IZ)F@( zLi|-L1>;EMOi8PrC@JbjS%v$69Cd*hc_2v&`jTgcReNQ1^mRz2l@wC28BSqj&W~6; z0Y-I`7waETfj@D7&_ET9H}#~RN+EXDre@Vz@5(tc373_4Y_kqfArZ5BK3-Q;rHaT` zm$S}P;+0QQ_Ml`H5Zh>wb44m?+UJ!&8LkrczE4I*^}Ndq7A&V86G7Vo-Vf@y{&t+^ z0eTFC%xTQjIq~Q8N0lCcU+esO{(@mqY{h& zH5#$aP6^x+C1So-U%TlWlrB#urd9J=-QSQOqW?xV8Sj7eRDpWCh7O1eW#9KJajQ?; zJx642{6Hc#0e+6xTWiVyJq6yNP;fz>lD4})hFWL;EH{$UFr(PWchczMq+tX4!htmc zA)Lr%wX%qy_~{l#OM8FLXjzstAZB={E4aU-5H`W9ha_u3s}ORA3goVwjjfHu#I0?C z51sP*P#@ji4LJQbNv`d@-MS72u50yBL!W#x7rKOCB6v!ZUu7tOS<-AsoD5|PjRG5) zlGjj@;ge>q#(2#oQz<5r9(WS%NjhS&K~TVJ(R8eiLgg1vBJSCgC-k@CEkv4FRo3A0 zRvP676A>&43-C(fB$|DT`5bUozMVQ{({ZIdA6+@ZHyTGWk$1`}nCwmo6WJEq;Hn_C zLu{p~LJjygtraZ58B|JSKAo>v|X&5pDI^8TNhcZ-J;g? z;L*g_#F_vyd>ZxMpjp=%nui;}V{Ws~FU6>RXN=p!&xX*^f0J-iwihp+g5cus{*Bak z6==KKLWV?IvCgp1Zly_u5Pkn3_7&F6>|GVdp|ac_(% z89EvO~#zMS$@w7pWeqD$1iF&bZNaRlPWc> zJ?F+o8Wg)>@d?|^@)EpyJSUX;hjoatc}2=k1fxcv(g{gm)bFU@H0=>`Qt~(&tzqhb zCpy93d+yQNW9d7;J;8u9L!j@fsr#y4n>kvL&CY!D?pZK7NhC&e8M~M+w4s0X4d(*F zE0O+8(`|a6-4!H_7`nfF+`I&g2=`HO zdb^l@UYXS0mNTsBSO-obgV7xW@aC!BW53qP`0@ZD_B$=nVw6tg)C+; zVts#lzrJj5r1PudF@;%_ZM71KVKuS^Ec+Fh0YD>k;);!*RU-nHs2WTwk%dCgmTtDi6 zeb&@68BH3Dox-P!K*ktAf3P^!IGW(@4*yK7-Iq^DUqIaqoIsGO|CT-&Y900R`|-1x z53OBJCot>o{s7E#d}Bn(UvAnOAm;7&?_)n-4|n}9`J2{FFXTq0fR6U*H(ZZmNUnN; z;?(??j&3~GCzhJHrWk@jYM)H1$d5*G*+4OL>1xsl+FBK9br5l)^4V;0`L}zKMQ&1; zL3xGQt*ZL(fKMh#V-Dg`}5;WVU(LMwNr@aDma?sYRk>Te)fp?iwHX&hj7$|6>U+A4-0|`*opfw02CHYaF^r|lcf)G_Ka^3;R=F#tZDmw* zk}})@Y|ciGF-&8N-+<{oiJ$WOXybsGKgZrvrhBc^3(M(UcqJ zk~-zar3o%Ujrv&`AVLV+DH}ojgb7AG>{6dnnr;%<|d8kALaHLfj3M15oErC*beQG*{XR0TDLTW zo|R|(+PiPFz6Sg+fe6MaHWae(tMlvtQVESSV;t$XTWXJI0H9=!EH)Rve`Mf*n8lJq z+jR$#`xRw&4DN&(ZQ$fLaZjYB{u0=MZC~~kWzwfi;}&)t0%s(p=Qb|VqeRx4@bu&y z{ph+A)1{O8yNJ?jNdoCBr1BQ0{H8$6XbQ3Yu4U&~k@7OO(<0Fiub2TsyV&V43Cm%O1JwEl(+Th2w8YdaZi06Sm&hXJupOsk*YJlBO} ze5pXY^M@Xh2JGn`eSwXJimo6erV(G_v-Zzgz5f0of=qrG$ovG;V9oq55D^E2oy>b* z9nE{+Ecm~S^4rP}R+nz#?_CO1R}$E)v}}2e?exx70J>u*Gm`kbY0MaL%eamXu|YzF zV2JhTQ7H(N5eP6`JoAEdWOK!qzzy?^?j12a0^iXv>t zE8`aeep@tA2nO(M%MxNF-W>@D^H-3JU8y~3odM@mQ%PQwd3ucW~XVJ0S zPu1!l-0#c|H(N;!mu!233ww_A^c>k<47zF&4eQNi^IqnkQ-cWy>X1aLleO-fAoe0n zpI&1N7ovaIW6m}1*i$}G*?fFIa=AeXgPdBqNWzI!S&T=o31&=KawEKEAJ{6_##HBV zuv%c>h>7C3Q4&KgX0~d?YC*3T1z!F(*A4ab3{);3V;+0E>qXg+aZF~v&w!#63Pdo7 zS}nex5y__kBdJ0b*=Q7~C__-xVv1&gYlnfyH8_7aNI^Bj>c~sD{xK1CE@5(~F>)4X zNa3u?5xNEu*-5mwpq)m0E80tFC5_A5T~DibjG$MvNfPCM8lNgYF99ECpzEebUy*$* z5E3kYKQ8|?ZP!a(Pm7P@!6gE?0mbQd0ghlPW#psey(5jIAEZFTDzqU(_z^ghBmnwB zq_clMj#j~9f~7~7`mf*)_o>%-M1~}d3~054))H?fhakw7NhF;n@f0kYNV_GSq!%Qd zr@XMTlh_R^YZ=$o{}U_Ox|m2dKXg@gqjwX+c_x zSK~FoUJh$4?x-iezm;T6Jk8igM#zK6+m8ODGwZa61f=;c_-$^hp7jQuRxK8VOU!t} z8WJl-l+;-L!#nkQPV3-M$E0ZVSXj2fveRd_*9twWA!ok0p7HgRQs$z~zpD{xwI_e_ z!uYYeXK>}@f2B9auBZbUi9QN>JAM^vI9Mf-R&++>q`123$aS zM1qw^Bq>{YM1qw^q{kv_{}g1R=fpL)fgZ)`NwBmJki(udg49w9bQpJM#j}5&!N_|^ za|zOZgB!b~%TWp>QV6q0r^wif%2G_@DksG5OT#lhc`a2tF;3U7f$R7$<#gq87zSaR zb9TPP477s9YP*5K6*0(>)VC;`reZbZrcgJ3+42^8IFgr3Ai9sftU|IAUAU>&k|KGgNTuFtZl0{Y3Wr$hug ziq$}fRFsw9OERKu;k)EXM=m8)I+Ojb6mvmtBYO2{5eQ(zQEHuNZD_q15x8MQ0_PTR zgm@ZlK-3V%aU9 zO{n@**Q$8M6KdaC{8EyA-i8Cba`b)``iKlkcl#WzMcREng3l^Gq*3}5ZlQ%&Fug9= zzrtM=W3C)c7+y5HTn^4;>i?+1K8 ze%n)c_It&%o>9;GpbWu>tuGm7VQm#f6GpYhlJFxXUQz@b?0eX`NHIYMIQ%d1cC@L9 zDhYCPy|&|_S6qMQoV3N#c=0=O?5c@AK|QE!1#y;&M(z42F4;oJ4gc_mugsoGMs^M6 zYkq$%&uJj&BP!mI?)G}S)3zv*Ygv79Cu28sXDxo~_})b3<~46E`b4rBLRP}@AC5tO z$$HE|Pj+~){S$u)p%|vQV9{pu2?mRfOQxKzg4>^R=?#B2vp1CRmWxB)&hOfz4&=GC zCo?&>H>7h%1kEZzm)s?nxTf{U#$_rg+Q`oso8nUSq?*$H|DFj z1fNMKgbRN$W`O6~q?r?@5^o^gXu@46&ZJI+s{t3xm?^}Z*ADc+2#yE@gcY~TSC?t0 zWZ;YW8SZOb8yg<-EeAjg2*nwwDF~GVKt9U5LgEChihb8c%W+bYLP@Q_4d z5(nz>*c?uSrP4p(Xa0vRnyEyJm685trtNnyzt(xdA9Lsop+?DNV(TL*izQOeFgNL! zZr^{N86Jq6s5C`t?c}4|oCXn9#V}`#4%E~AmAu#P(CS@qdO?_!&=?*Kx*YLTF_;n462{j8q%f=1lSJlh-gb8HnYTR(^wz2$Uw z(CA7!jNa1h;NW!H^cmJQcxsp4@7j5?kcxiS9|E?7V;P z?b(&zf3|+}1oNKQXf!i)&v4$Eb!j_)gs2(b;P1}bZCrN?;p|=#Hg)?RIy@Ee#7wUG z>TSDFl+hD)GQL=PZ%I@vjuuk><*WueMt&T5pBVTQz0CbOSBEv`QzW)XK14|%Hm#3- zSzqTzzm#R0ct9fRPP8W|L%ARG62gCnvc9%usmCERmqj_og#(49Wkst=f~24Z+9gQ# zp$n3nEmb#E#_qz^+Bi!(wijb)13qz`EUpUTWKzD)9TMah(;_OM6h=y2fgW`-uVpY$ zxU9Z^6!H#BFwnCSMaBvJeav(PDys>OXFd&XhaCt1#CHDB8MN#5{!%K$m-~Wxoii3-R`tR6#8xMbX;bI3ZL^n#iCE#brps`wXh! z;C-U9l9+}r!)CQ|J|5=#wy0OoSzU3r-fDB0!}AC3m^WCBChY@XoeqEH6?4Ef^Wd39 z_TEy-W^yqs(zg|>1KGWwcs`3&}$=N5$6%R9`9@PuL5Kom({3QPKy|@qqvp zS0w<_2lK=1aDQJUzLe8@os|=ZR=xhX$EJ72Og3nOtfk$@?^?3E^sAQ+@5tHflk3%R zb9ABFUTD_h(eB>ydSk9H@A2gO<{E29=Z1^r+4ZwKcb;9JEf;^Mmyazp7yI*WPoc5U zWRS>}V+XxOm)B#m)!M_s2xZ_kSy|4>v-bLq$tJQhc(W5zD|L5sXgmflOyd0!yUV^p z>LdF8RniSjC`uv`pf1tDhmfGFAGL`-&*?yu$1qD&n}~e;7V*hrHjTjQMUj%kR4A@O z{VFsrL*VIT$5MZVo02m#DycI>Vo!n?UOh2oB0&em_sGJTxFb-xG4}UPeBk6%cg)T^ z?N*O3=osJa@h2QMt0^WptF@Yk`G|io)3T zkCI!=gWP{&9x=CA6<4DLgxR5RfIiF&#W71#LlUjDa4lE?l<_`KnNh@9tEx~_h9uR) z5JrZuPH1g;&@Rz>A$lZRB}8)0B|TPFN{&%MiF>RXF#u7XIh3}QTrE(S9HFxEI-!tR zx(b^r_Zx+fD;zY~eW}p=gW161o+DKtD9@eQ{ak;e@!ams_}sqR7c<7i+xN~yoTFP8 zrt|^#@|{~P+u*VH_67SVHU?3&0upOw-^Q#jI5)OPj2ruJp72rsM{^yE2c!jCb1^jfFHSKceC%%P3Pi|YX=WkbK@ z89_a9ywW^cl25Z}Y15_tG+OG@AGg zuil5wKSA>33b0{6J_qs9W9E0^Aqgw8$mD-cZ4o>%wJBMA=$#h46@Ty#I%$MZgn%y=@Wlu z=ji-wz!p#M+r8j21mW|@{9a&w$9giB+TJzq{88s2<{srUoF0$I$I}Ccb1!%PwDZR= z{$KxG3d{1xF4@Ju8#kVK!5dr-C=x#L4@+|4|yO**pe z-dY%Yd2VfS!iRjMRxR^G-`Ib`jzTiBvSTrL6?RO{nrUxO-u_ew`F4(vFZ|WxllR?v zI2~WVz{O^>q>-Z}bCF$()DyC2)$t{gZ3)BtaJJL-2{fNg)S>jxw|>&1W9=fhWejd3wr zM$(@tYFe5f6J8uSs1Ph|2%t%T!{`r-n}c3-EtNbDC9I*+UUOYOkuXf+KID2TowY!- zY{BL1_)xvfysRyz(0$r>Ot`cGmnP1aU>{&=rQ1o5(GB7?4E>QLZcfS&Y~ex(!BX(j z6FhZFM@zDIb@mpHR;;>_$ zhkDeeXZ8MCnY5(do7Xxw#mXUzH;xp8wt$mOCC8$H$)%N4F*<)UHxpfdX~XH(m5yGx ze-3^aRB!h;*nbjrqU8B}j2R?1cZqRURC-m+BE7T)ydYwjHE2ntN8jlsa%jzH8MGF( zbli@X`f1;w{yywDC0vKRHn8x}GlG=|nVU2`34e?N{M#?b|Jyts1^e@})5 zqU4L1*PyI@JSKmmSykRaEZ}YEk?BTVxGam7(2c%p(OS?N(dyBXg}{!M9`zX7EN)!_ zPf4r`J)#8RfpKgeW2hyvLf4WWQyPI4F4cDvB!^{%xlqEKCGMP1L=iW|Y^Ji>AH~IC zCg!fySd=O*)mh))|NYSajlUtZ<2P+DC(}C)-9EeHj=g{L>E!gr&2vM0XPNeF5Q(Hvz^az?^2w>uV&I5nF3^Jo9~vB#L|Notz+B~myR|0UGM8$b;J-Ta8W(ZI09`HItB)vMUI0z* zM+A}m&r^TsI7+Nz%_}()tst#Z$PStJBfy9nMv%o8?!2^Oo#-ZibczP@0UPOLseTe^ zeD{gpWAMAAnf2lATY)G7W`gQ0)!-rE6fZS|BMR-MEn)^END|uzc#Y_=;-V;)zjjL2 z7TLvw7jp?=HA{q=0*$ExCXwM`mKM95T3?=1Hc@|M*ypPE?%jU2T6_QY-g~PbzxvQn zd}QavjqN*k4g|0M31iBxOf_t*hSzbtw|Don#u=F1tT<2-3Bq{iZ~GVfvw}{KvIb!f z0>n@S`Ddke)~h%AvIC`mIfYUPa00;}bN>gP`!41~l$HLEA7Gl;-s4-do>&e^(|s8? zZ2o@{Z*XE_*h6yC=AAnmPL4BKb;&%40y~5cXtM@>S1-fws*ZQ-g=yee*MBEtG;Mfe zRPU#aSm3r23*1I5a2tfPjR0CIbJm7cp$!MpHo~;phy`xLQK*er;5K4`+lU250W8D< zxABrC6}|+w@bW3TcLx0jNkS)$Db;!>qTYX!Lnn`j3RW_vgk|liMTMd=B+YmVmpdZg zqJp-L@1z=R0j7DTV@qfWJ9c6n?^4gE(FaLhxNZy1%9=dt6PZ1kdjm%&3kC=XP$|49 zTwj-PhbTISR1}Cz>}O)mo}Pl)77Rz4m6XX8kH=U0^4&X&44nKY4vzZsv*#T?!^ol8UZ zVtads525JM<&CYp+5NHde5w?iuXcVmeCpudDtum-HV?I+RiA`*y%*V$U}PI34S4xL z6RIP|YT}&Pb{WQGw)58_Qr-HIhB<#MN&h8Hoi90q4W>P->r4$Q!X>!$5G_weF!quQN~FMB`F++vilKfs>|XDkA5kM zqh5w2vBs=^qqLA+cmW=~Eoy%QXvwHXXqyDQiI%pMb-b`aT$M6%W23p5Gkp&#d zL)9Vehjol^pqIF1+K!}n2?<_AKV5GR+C6jyz{hE3=!SF|#oL6(MjsGo!Yo6QRGq@Q z$*Vo|xGnUIsH6ADkgTh^-fNcXmqN#?t{LogH+&WIx`6x&5Q&sQI7NSS{E&z&s+i)4 zTv8aK6Z5;(V_OplBjETz+6tE?$G>x2AnQT~P?PbWk;Ol0x9IeG9cbLgwwNe~GQcjg zMh~}(iO&1`j_p|r(I%EkTT##nzI4p{DP5Si=ziH(av7266}bcBU;A-%(MM^41+6w@ z@BG8(BPBP|V8V++ABlgxH(d51PssZ|icSjHHR+6@?}Y1Nh)z5w6y2}-a%L0D*tNXd z`*|RSw(Ib_U*R4BPnARH!6-B)XW>tSIwx+KMM=sk5XCeRKz~x4Zx3EIF&~3+53!%p zF>-iQpbZteQ-$u8AxTa00L}JZ%=RIC$ZIWwSqHDzwO5{P1qy$teS<1AEJHXOkFyE% zlO$()1nE2py|%wg8LQsLW}sZ{UKv8%E9mKsXyF#p#Lvj{3i*ayeI%`m6dp@Uo)kGy zsM%l$!+wh%F-p8YE+zyN9U??Ur(%CetL0N9Ii0D+K~*h062SR#aJ zg@=}oPOYAt?F)BCqC2Xo(#`^Nv%#wKSY7k=Y-pgKF_=98?8O=;uvz}A^n#Caep`7< zqI0K(sbt0iKqGioyUm?nE3W!mZ#Z(9gt>$g)(Pi<{G5N+jtk9H1t)VSqcdFY+~N$N zUWzj=aEv+NW*$6`iw%K{=CX0ly^B?Fs8Hp?!MT_nK}7dtS63Qf?KJcZeF%KWpAPEdwpX6ZBzEr&4)jFC7i z>Xq~>k`aGY2YezbpxURAa9N(WerH_SXpu&ol6omNF>#J*=Y$!7xwW_y2tRbkf%m23 ztWepQVNKqNWhgcLoxfzm<7ZZlVeiKIvB12Au>=yK@u``FHR5X=ULSS2lBgu^H#Ils z$CLfJ#l;oou!cjW1&yZjtT*Mia;~UH!`Wd7;pczvI<;LCy!!0o)>-DySvzlP*Nz?7 zOt{>9?&yUplXiROy{4GEuyyLe4foN<_6}efLw*=TEZl2c5Ucn|*RPYiwv@P;iZjux zO5$Zuab0R-cvY0VyNEF{aV__uw~gL4v?Mg}Xh~)#5n8BwpDu&JQXxF0SgL3hhv#T{0w7YLuiD`Bs`GSweLt zZ`g6gQYy3%uW76(vjms_c^?7MPn7mcS&tPCZn9lzThZEq%k3s(12v$5MT-y_hKifSOJMs zBG#3dBI24VfGhIo4-vJd>>b2LU8c;avKB$5fTGP3x}gSsjT$3>a_%{vH{}+`8MDwBO&F<)n$G2R zYD0glXEl_bo6klq+}{TprGh1qOjv%?36f?B#tpo|6f;=@k(946T8Ze5DTh0gh}bgg znNV-N4vV%eSV!b|Fr|fRDQo79neI9QPoe#A747h&)KVh#&m`u(+Q59`v#fv7=HPg( z*>rU*SqfMwAk1XaH6Pr{thrb%o->9bQA?-K z-8VFbylbpotB<*SxqQJtJFjmJxP6+wb_n(BHs?d-H1drGZ3cg`Co%bJ`{1X{BT*~~ zOo^$nh7;~7jM=UalxKR)te$@dE}9CPtJ7qET7=%@CB$y|fHSAMeor#tk+O*chMdL> zXEDPRRviNEH9@g0;XxKh5;#JdP!2HhgQR?PfyhdxMlx?Gyf(oKrqJk{2vbO3Ng4cz z&!$tG&`%IEIt2?3wWOzX$rM3?u!G~|p6^NuQ6ff^;e4k$ZodkhkRgBIppvVFxHM9A zDdchhM z5BKC3a?$Kc%o{U*&pUtJ2&UI=;{3e(YCKs9nmKRWt79x-AA1@$Gy}M_r*+QGSFPDX zUJwfTto7egvtqUti(jnLgMSFKit|Z43$yp>Tenwc)Aod+aA7?&6f6ctqt){h?OVqq zhN*88?ch;w@}r;~{h-z@ywQtY_mZ5z$u6l|Fk91<1TmD_UKoEgsFi9*fRbQZESL^b zR0aWi0aI{Z0Vn@DR#Oo*y*+)?8EGgyPU?o$qYRV_&&ljve8g|SBI!c zdmFc$=vonPUqFA4|_8nHCV=8n`h9KVwqHar4a!Y%VNaG@G6v!o2?(x(_Jt`yy z!Y|Z{0f209ic_ql4TFW1{N6ysRGKy{p&^bqWm3reUFRoA%Ev*}wI!;frNT%xjSTV7 zSTXxSZjeyTkwkiLJythn`8zt!n3^4CES`Ehin=@Ah~Iz0T>Udtae~f9tFgp-SKGQk zaCrAn0)Z16PDnc~{0s5z$(Vn*UAMl@2Cx3PC6P*6m`q`J83Uky(Qu^$>CT^6lBtBn z8a+1fmqIoZH)B6CA!x$T`Hf(!w`gJS)wqSL$wV<=^u|HmOfDPyU<;;RJeTb!`dE13 z#B{+@ni_u@&wKoO|H$&e!RXlhR#OA1#c=gK)y?jLQ0?ia+zdSIxS!;n=aQfTD^Q!> z-SsTP5#CX0UaEWexY!;?pdB$4I?ORK6BX1)*NE-7tq$~w`pA22&Ol7YhNp}ZKacNaY31E}r zi={BAGCSL#GE&5+igJc>Fv6t&zoXvdk76|pQ*IYy zf)IZ#4po3HyU%5_7kBFdrO~n}>MxB|B8D9oVyWBK^q)%&Cwpz-NZi5voz=vf1ErM3 zY4^keZj-~$ELe2mR*f?`vK23=XgX!(-w~+dUDbsDRd z3)^k2=|zw@B#|I;S6Ya3Ji-oocg#+tEiQj!1a-r!Vj#j8b6;$>JLAcwlE{K8Xjo%x zsMloD2Fs;#&}LgeR9knV;5V}Vh+EGYeJ=KZ9MyIcqS{`+7S+ZWm9RG8>LU2+7dd2X zKzP9*R2uJL9=sNL5C`56QjCc9Lox~1M4TnAi4^!6AP+?qSOJq3nP3-SQSAgc0yuwy z{t>_>z$GABH?BqbnkfmlRrIfxj!)t^G2HVQI|Y~oqGfdi-Ej-OTj)Kg_7ZX)L+>&4 z-lz7`zWzAjI4NXEwxZiA#fOy$g`J4Wq~%9sU->BnD?h~#SotXgOFxAkztq(bAD^P$ z2!d`C$9H`fAMxRoV64wacUM10Z)LysMx9n8{RL*S*|`8o z+t?PEz+5&v!-Rm~&PdLW@;)h-0EzQ%C2QLw!0+F>hTngypmzsOd2HuLp`72$xMHZY z8uk57^T5{5vdyK<%`R>lf0V#~>*y24Eo*N71!I$X~+5-v(SCds49h#vGR@+kRjY{*9_vxYK;c+B?^7E8RP zq{O_v>#}(JHVwn${LlO)dDtnOCf$Zi@RMMJ+kofATPYmrzW<5S1Qvf{)Hx9ol~MQq z|Kma>$2lOa zc+=`E_lFH2vRMiHSoV4%+Y!rC+iaEQP=xplcN)Bl+0s56jh=0{FZLpU_oKhq%Xu4D zCMF7lZdNcD9WJjuUUz@Z9*-0rJb3t0p>T0uZmq)P-QA&TeLd5scOr-%_~-W}ymsiL zeLBwI7T6Oqfqf7N_=ndJ@Q+jkL`FjmI}5RmiI!p>Jh2IZ!&^MOi}+UzZi^kU&gDQc z!`?;{MUn9xKcMv}qIgXz6qVwTcFxpB5e#9TVANJKfnqzzAksFlPgrY=G1R)o7_Y@+WxhObUhY+#cO{Qza ztgt4dzA%5#T?_<@-2;Wyo4dQuu5doqZo29X999>|kq%slLuPcJPF`^sSCK~@KqVXTc z7xKN^2cLe0u74c(OBd01Nl;0J22^NNhLD8|m!f)sx2ea-AR(RkxC%Y3LLX3}56RFC zdWL^%DPcv@{Y&%=is@GMz7^xDK^qugRrim(5ow( z@7bH|^X_;nUGMHmWE+jizWQW;Gg}-OULAi$**t_p`4NTV_SwGViCY~Zt3^wvMFys~ z2CRNZqOYeX5`M1-1zJo7XSq^1?~ElfzGSF~@^_pSyFnpV2nt$v(yd{wFl?L@`4Pwc zz~Hy8Z3h3QYz9~VD%4Z$4!HeR_ukp+p%J@7$J;fiXFSjy8w)q$OUzYL@J(XJ0D^x4 zKt5)V349UbH3)$~*r^W>XYA0VqK2L$n4g-MEjnC!dj#pc!Y0*M3e#&b-wF{|6}t*MJHwlZHmzM~IHEepiaRya0F`kNTiIuG)Vid7u%s zmc0g%Cr(PQEUD~3z^`N4Rr(*1*mlY0D%fw(mThT4zwC~1On*IpzoLY$kB0E7^&Pw6NNQvu-U^?TNT5^;i zEL1okg7fIlqklKxalm92dK&N)w*RAO$s6Dnv{%ql|9jBB2V-dUJVSU&{L3kP+`v)d zS={1+$*a&26*{9r7gT@fE*S!CmUVCnOCW1C6zU8MuB;dqy`mJWtn(T-O_8i(R0^qn zfkY9JxdzD<6)VX5a|6GjQ04wU`3iA`G3P#})fi*#98H}xzBM|%zm zJDZie`p^D}Y$86L{pp+E3`Xx=UcL~p1q&8Kw0~o`&^uvU&cVm-64wo9tItw(2LYHSYJpMs4_`C*H1L_mXA_^}_}q@qBltXr&ujSnCw#tz zk7eH&-}M6ke~Axifr+P3w1NWQ0Pre6m5IqCkFx0Ga94jqY!kH3lB+FAc#{8}B<;Cy z3dxRisQ{=|LmnyOlDOA$WL(7m;uLdrQ4avTAayQn+p_(bs8v6b`f-9S@$Bt7i_K|0 z{^63%#~=GZQYeq_8{>GLD-%Y2NK}U8+4Z~k3_9Gbt-8I)x?EH16%^}X18etnpZ@g~ zqs?sKOCNtbpMC_o-w857Zr>CpC9PG@Ig9gDM2_p&yW1&Z3|%PI)2K4KBhA3EmBJ&meSh53~@Z(K*O_Uz8A`);q5=5_*{d85#?k{Dy zSj6}(aC8kwPg~;hq_Q2-S(FoLAFX3z1Et!Hl4pOq2~R~gB>OL2mRdzel!Y^rUA$=* zdduRwmwL#ZM1h7?Xigo!gz?*I+!@5@|5%|}QRQHIoT?^=#{_99NRosLz}Lm76SL1= zjF%H3n-GeZ5~4obpLGcuE6<}$-_HA!K^7|a5zg%D9f%lM-`m>6=;0YtI5K%+I@9?^ zaif2PTzG@W4(zM(7E{lja(#C&dZg7l9r3SrvjLz5JX4{g>0jtg+H~-LwwpE1;#>=k zZO(i%?bdn|0UhHiB$-b<{I#cUX*xZIP0% zP}R|dkVTm0l>%0%>@O)(sMdqjJB^-AwTG^MCxp(m{1g#ge2A7z>s82UC6R+^oUn*l}(qYpSn~);zA-_+|?pQh|tIV$2rH z^1LtV@ zUjF7ZM)Gm-FjMWPZ=iPfsNwV6kq5HzeS8$2PAtqH&u&CIov^ zF4T1~3jr(V^oOjTzJxE)>q;ykeG&Y3o=1#x1@n3ghOaMB@FDG&(u#j1KUO!UE$-yej3};DW@|(X9wK zq$AVlX`*LA?jc;0j!~8&38Fny_DYs`ai%V3g%;NxN2P&o*e>~NjF+g!MC_`ZDG{?z z=plMI4|6xVzq5bDdTM{`BmVsKR?W$HYvqj5ze?`nV4^KrE3emZ)8~9P#*&>M;jH%F zk)(;SUcFr38O~gop1qJspPjTtq6rsc&JESd^NB&;r2Ev=u7u8K@%j9AiwhOg*w}&A zz`+>)9Xt?Ya}WRKbC+6vSM}znzH*t&v{M?sccwdR0ui>GG`4@#SU<11`X{-1%%KgW z+&p7LE&D&c8&)hH5(NG!EzQptk{g@x=_i+CLQ?P>UFK4Vu||4xiN0d;uZin|#Y+QW z6FQbxxsP%MtmL__OUw*W-XU?C=Ex%s)3rks)`%4D62Dt;d=Aq`<{Jg7$q>{Xn7DaN z=`OSfG7 zqA}-GEVAG-gq9Ap4xE_+>;z2l5(JY0m&D)}SPDO`)e_I7Ba$#d(Gkk^XxuQy593^d zX93RwUIV-nFtud%B2k)t;svzF&{CZf>N^8o;ac%31vP(FN(G#y{os01#oiEMp*YYZ z#T8P$DZD;VREe#C2l2H)3pevqbI;Bz+Xjz+Gj&u z_Kq>Z!wQ9^Vb1EUP83|M_3YK-L&4!a_wLzq@9vS{Uo2gzRIV%y{tOvKe>pPl2(8qR5`PiHs|>UamT*s_Sj z_y+eCnB65{Bkfw+RN=l5qqUQ*>3A}IyFTa0@R+=;-FiqJzWG{Mmq5Z9B_)hn?>A|sy*m% zq7EmTaiR^d4X_`u;!2PNEb*q`VF8~2X6A6+6XLC@r}|xd$lHy=X+fRH+DJ@?>>`eu zknn#ICO0-o#SFaCQe|T>C>11~kcpWrRuZ@$qsjZ$YeV|b>_XW z{*9J)9*V)OgZB-leikaE&YV9QEcPQ(&KC37!o|_r_8*+dbO+$}#sUld8Goa<>IfE1 zLe_4DU#|h=j5*fc2tiGt!Bm3jgcEA-FtLBdAY{M$7IPrf43P~HiH92D1OBFi4bBoMB@z8yYDAH@44Gf-!Ca6zWe5cPhOwTg-PzsO3g$MlCOghXS`Cy}=6HWO zeD3xBTyMgIl9ObHEv9#UW*24xHK)M0d>uB!I4l%jf^Gm)K%u8c@p2V8&Wx9Arhb3) zB`^g7CNUvSfykAjXGHCxF=P>^Rv`)rz-tt>Loy&mS&^JUxX=ZjR1nckr$QwaYN^nO z3eBp}4jH1{-|`M8&9Nj0O36}{R7gr9mZ59>j^qj??t(CITyKHEI$TR79G zx%?KMQX@sQrFP1$^OiH85A=nFpvB@x(K+Vcd>z@dQ6G$tcstK0+9NX+i(7whKu*4h za|D@oNXEbE-5+t6*}s6eiR`D0oMUH9mOgWsG2&sIm>GrnC)oR4$pWwdp9Bh1#+;FL ziWE%bGi=4&v5?$p?n1K1U|HOAB=0~%m@!<2!VhYY+R2DO{K-I984$(1()toJi)bkl zPLdNO2Lb9;66ai>28qI&Bo==)`zCYg@m~!HL;D}t{Pfq!xegfK+I@Lr^MU)l^Q`ycLZ%EJ@L%ju-RL>GTAzJ8~;er|d9 zcevZ}p3{i@K19W93AH71B@rhHZsFCmNDo4O9V8oM@TuZ`&cnP;?{ip=5a*zOp`DlZ zU8cYcF8_0$&w%za}Ik2n#!V$|{BX!l00=j>c@lxv?< z&%RlPfCCCu!{mQkIZE&*k~PsKL8c*Z`T%58E@QkkGp} zToDAn#lr}Cr&VXuQx57^Y#wAB^cLb42cPW;8g!m)Y}*mDCVYssxXYgmdSDe`7z=Nz zJe=BzMQ*SNq3}Ss^9n^)E#kxO^)E*)sdUP`7v4IHi0vy3dW;;4@&*P+f_Z4FiG)ST z@#)nb3%q}Z>^jcrHF->(n+rGfk*+@S?(4`UO_Be7pm+~3S>m0XA}WlFZ1*)!NFAn+ za(9xyzYQ=^Q#)D`?!!2T0$pItK@T}5R>5sadi-(poW$6ZK({)^ofOe(Q9Vw~^j@5C zKt2XJ5s>agTf!XuU}3p%D^s4Zh#9V0nWV zrQ0bcJrGe>BwM2S6g-lwl(-hNC3%UHu848N@18K3Fk0f$Bu(!R@@=1YD9`Z=8cnY4 z^R<5|xe4ckmO*3E>i#hmMxobqFc!{t8(kshPjoJi-_mFF`@M$F3y2s>)Fz6igllq7 z!^379*|6Ch%=G6q8c*D3p%(&qFJv`x&k#H$pzlIvCid8EhcbY_OVD zD)Okj1sw(Dq^0}|n_c?}PpzQ6jw$W%_Zoqt{RS$n_3a=Bw8}Q zl6rJO9lJw@Kux7I3y3f+vhKPQ6jOgP_*3kmBuG%vBKwZJ@29B~FRP44@srmG)~1r*YQJ_+1o2E-5GO!5yxs z*P-$EW8D4n{T~2K=RPR6kDz@-e*VV+)APR1^Q*r;|R5{$nAe8(0&4E(Um>} znC|igS{oEHk;G>VpHJY?UP0j(dgc4&D$LJg@1gHy*x;z8+O*VGP;-k~uIscM{M(01 z(v*<%10_E70j55h5{lS-0WiIw*Ktf)!rkcWL0=gyEn#}$y=Vu}_M@fqX-U)Sqg6!~ zg;xNRFa41C`WL!h7hiuQ_0oDHcj)HZ-Sey#w`Hy16t>~rp z4z%QPOlMsJOdiJs-z`qnBce=!S~KXODR>0!6KKhwjqdpYz#jli&-7VnnQpFYiD;k(CGIJOJi+@-9)lqf#h(I|$q9IG@5X4Z!5X|WWD!^Z73d) zSIEf=LT*Ngjt6pKNVFPGJErA2huzsiHPTuuFfTJa2OBDLYwx1}H$=3Ax=6t33mle0$6gxg@PUQ7g&jCM|_4!^{=Tn&JJ?wcr95VhCmPVRW}m=( z>nhtiT4fEbJglC7K?sU01}Jv-2kvMj;e(slJ-p2>=v)D($>odtn2!f@g4qG@u>dN| zATPMhLVWc)c$N=vFoI(TYQZf2J<0$a5$CUp7fNJp8G3bUl}NXKygml6jCc$UTKdkT zrPrE5o5J*e5N$00F34~Va1B#Nac@#I+zyP`L@%+i!+=FAIh{(UEMsUEG9KM_x9pUx zuuq&wg(Z5ZT(%z%nG(5=0i2Z;p=r5K(n<=@Oma7xP_W=d8)=1=rng@#9S1g}$RG_M zgfhtmOAfAvZ9*heA_olZCiC^qRfeNaITNW=HYzQDYfSiht`*R^%_bxRBdud#dur-z zkW`4;z()B~%g5Lh@_eR7ds&;K+6d}?gF@Wd@LFGOlQlicj6c@d>hTwPPETe~0(MP+ zi92dFdBd3i^DmY}JZj=~I^G3+@hwa+!3O{zkZ1oPTGzC*kl*$L z_>k_pPt{pVzS{~02+-DCk{?2W{Boa!7dc#i`Z8{D{5tle2oD;GJ)xbni4jfQV@$o) zl6r+n9AC$e-BNq#4C!&H%z|`J39n!diNl#%)&q$s1uCGVn7lzxB&x)v>V&j^k-wB2 z5GmyeQyloxP#eV+b(===2^4c>aOTcM<_YohrinFKJQl}j(HuskO<&$%^)ufKbk|yc zsbqYh(TH^NDAwUf>W!RL@3UN9J0#Wx=DFaRL$nX^7FWJEVrs57q5XkIJInT3>+5%{ zcYYPPYVjuh-iSAn57~Hzv$Xa-w6%44vu0%;JNonEoqyp44exXY7fNmv66k3S_^h^X z2TS>!uj0<;O98eLflD~*YC3hAWPsy;sDP&HbY|M6;XA&l%gA_gHoZpYwEZn@j;@jN z>0G~G1Mh2=x$@N~Pi?LDSPX1wY4gm7zVjqD9sJQAGy3kEu>VFOp&ajem?9Pmz*i6p zObl_ZD`+Q3w@s|-5I$KEe`wI#P_{~`el}zzHv<0$MEr@UP*jE_{2}g%F1><(b`$ME zv>RxNYg$EnT(p}>;_;0R%#ehy3pn{DVJyV5DEo*SxTrX2a+=%TxO+z{Ck|B&Czf{Dz@(uU+S#v>YG;X5J1Ri5M$?rN)$>bLbe&8MQ~z9>w?(z{dcS4V2*1IQM4t+}l*>Q5AZR48c|^uk>pHq}Vznt)8;< zvmO_Tq>@GiJgFxOWg+% z${f1;L;Exy*V#|L=R&`KE^+{7d}n6-8|Qhyt$pd-(VWS*$7Ho8yrEias?3Khhu#>p z4Z(?a>!}O76QfUzCngtmR_!irbKmN8{I$UB){$P5PdN1A4lEUL5bU zu@-~B=xFaxm_t^Z9mPLF<2mMXZLAy}YSo-|Z|qljGspS^$#%VeV7JCC$WgjEYzpq; zEz!oFj1V)KQoWNUoBM#)DhRGE>$r_c8P>$~xh;jxq_Y%Sb>J-7W|pN3E{Oh29D)<5*X z>Fo5GypW2tui*DFsQvXaa(w4K7pE8eV1AnTH>SQfF-7lez7!Ciq@9SS-^2gZp3>~6oT1n3PB=evawf3ig3{aq9U>! zh=KQ)6i;z~G7ll~WPW&~W%Y;GZf`4B^d#ZZuF0S+uYsp0@&zJ-m3a zOmc;PjO1B&yhfVXYg3?_qPQ&clqpfH2On;9;*2d`PeqEW6WDv12fqFM>9`QH=mlY> zJ^bihM*_^g`*!DVS)6%&%Nj5o|JdlzlN-9IbL&IxP;Vt`W8N-qE|2>zePQjrci++q z8aMvs!|8?DF_a`TyKUJR%nm#X{ODm4{iODP!LQBM`i-W%KR8#bE};gR-aA%~EN|`a zrgzLCuH;t`SCR&0b)tItqj-O$nItVlujmm;^xQ1IM;CPHREUHyTY-`)l)-2zkw#wb zlTt&E;ce17pF_KZR>EPDCX{O&Q=yYGg!e2Xtn|LGRb?WIP6VE`l9FM&POzw_;KcNQ z^rF~+36Pk)UpfzL$C}FK93^)tmoj$_nsYsk;Q7AJL$$jWZ4uY_shwl~3zdcgUV7<1 zV=iyvti0I~aDT-aFy+&Bja_H4d+k4*I#*??=cayY@LGOn>|EK~-8&d>zj(qLG#q`Y z-FoqaCG0x=@ey~Wlw((&xopBx7Bbm?l&$lpo<_6Zw|Tj+{$RuA)@Qd*-8p48JHrBh z+fh5mShTD)HQs37HsgU`yii&g((2}UO|TWvu=S0(k#N4(YRr1PGu`>6j4NmkPvo4{ zMnC3Ki#kgm=f1}ND`vF^6r=?M$!XGi_X6c>77OqQf3&0)Hvyq22dDvQHuZA&b7B?(I_upDw!uJeEY<~IjD8NrfmF4hhl@!I{4P$LMdMz|l*@fvmsnu8;(Rqv?= z-u>n`-!MA#nd8lYwX{8!F8DJiryM@r*xpR)@Px_hS~#8Yq{8l!R`5lC9iDW^rF$lI zKl2!JOOQE{QcS>v$e|3aHD*L+jAFJ`NjXCM=cC;rYXN19Ip+1JpYDF~#Sb#fAlOH4 z&xfv@E?0NtEFo8ESG9hy*Xc6l54Te%?tXN-amTrX(el>e^OHo6-+cESZh-wF@GI8! zpyUQYI;1#WyrN`{5k6sm5{TH6E`rB#g3W-*XNI;sKgK867 z2{Y&D_aMsnvkuPOr&u_dy1qP~D!tmEv@u6B^*tTPQJne!FLPi^ix zHBs>5wQDAEQKRaNz>-q-4V-&@^ksaq|z)KY8T zr5Q;xnibUuhEKTv+$X!|{Q8_zr>g7x&hPxrZ^d^j+JAX04U*qmC4DCajbadc zlN-2h1LM+L-K9v`DEJ2DU{Ru9D8Z0Oj6-Xx3+FM4Plc6-%epZHl{J(#TsaMR5DRr! z?nSp`{plV4?;=!C%t?mHGN&PXmoUMw>RloqpIe+@YJ0eUA5Z!EXZMabHs)Iq2vUW} z$o$4&W5@gmz6tF=>+C=H;e!UR=he5oV|!)>!_mgfzA24H7f5?MH3pMOyK-W&KNJyM z<+Vx9>>ivg*aav5>RW?^-XvZNZ!N*+NBy=~DsBJ6p+nm@Wj#S#<>^Dm9VkH&$|pW}Z54y_;Zhbgl6n#SuI$0tIwiq}W8 zO|Q=anAp}%l$|IosACvFgsoGyml&2I)=uFXBIq|mv&e85VpUvByf4W-rXoX%$emB58UQ&#~)&SAtf~lz8>5#CBIs6tI4TbiA** zGBUQMS%sAr&&LMGHxEp%4fVt|P~zU{;9Qn~+f#40BBqcxxog{`$pHaJaAILO-M{iw z>$~j*?yDTq8{$tuB3%xr0XKbvs;xKB{%N3hpWdzEU0z?Uuj=&%jppISP4L%h|0Ffj z>T_3r>UT8x*W1st^>zXB>+?bu*gOU65_kt8mx_emE!o(_E3tBv!i0>3uIkH(-6nA) z6Fq8Wh*2J89g^~sGKU7$enV=%IkZh&W)Tc#P}1U&vK`QD5osbR#(->#J||hgFsl_d zYjpET*}xf6Psv4v)Xmc!1Jartz;JySmSQx25lq^nA;`JY*e6KW-{(+_(4}C6{c2n| zg_My*>MEhT8ogO^ByqvZgugAn=+;HTKJeW3yd~r_{a;#bAtdS$d{+x~s`kpKCP+RI zUP@;+g(0Wbj6H|HKhk+D37-|G>8vm6wZdD07lLM2`}R0&>PEtd?PfD+Le48UCUz8m zyLKeL^aEr_=DtZOl0i{ve)lCO;s+2KZ0Ra5i8E0M`@=kCK8nhMLoX_bOi{#hnm1wy z>D6gaDmw?EvlDe>icK&({y}RBIDmSZqdE?YlNgId^=qPLk=7Q41f+L6hFL1(&U7n^ zmrrF36Hd3J1AyxJC2c15@`zTY15J1&hQI>yekDcfB=Z>h{~Af)zaswvydfR!QP1F|I`1p2_H{2jIXmQx z9SYRLe`oah;3G{8mtgJ<|7ED`pW-6_zhMHPNfugIDo?%3EYq-eTxF-r_2ItZ*E} zxvXEt2NSdbtpXy3>Rf0tVG^w$`ZtG+2WPhHe!a1C>2B_SRufq zKhIny(?f;pxMtrXZ4NVkdeVibB21B;B4s2lSR}L(uji*pPYXvDX`V#1GVYo5K%(qGOmi9mQR|jfa3GMVk@R|T z%q7_?kYxo$Q)3)|H96`q8I?^wBGP(PSayPyvl&HAYf85sLv0nwgJ z{|w3X>3GHS|3XuYuUu0C@DE56=CliE@7JaHdofJjE-s2Uj+aa;dN*E;vdjISpO1+9 z(aPqDX&GXFc#^~Gr!dz|wVfDDX2`gq_M~MhdBW1kKywWa49jN;5CIAG=n$je0Kx3Y zMjj^`S<+Khp>Y+OQlVKDBA*u~8`_W|@IIi{DvtCo2VYw!i$j*mBcY~_pfsjuIgFh2bHSa#d7+ZVMyNB!*SW2M6A z?|$`Gf6o8It0?mhj*5faPqS-<>dJ+}?u^x{N$j65G!sU%#%R$dyAhz0-+F(sP6wb6^l=6z;@3J#VWXeIEg{XR%;!w@{k0x8-W(6a|3FP`D2P3 z0u&8QnK`#fZV(c4C1|hW2Glx(oJ>HJlos4Sr#9`swAAVLX7}t_k9%VX<>pElow$|J z6yM*M9&EG<4yPeGGd?5+yK)&ZhV~ryN_%cx5cJX7@Je%k zcJD|QUL=~a_8kA_(Ee>J1&_~Y?HOGvges*jDb*^pu$}haW0^oE=rLMjerqC|cl)|Z zJwG8G0Y;*Ifn^Wo{^*_a{(}F{lP)4J{_yVuRUo9(blid5pf~V81;I~Y-#p&&W8$8e zT0H@#m0o!W2U03Ge#u_@D5H z#YE7)v5ME$xXfH+C<3~|RMGxk#`gl+3YaiIM7_Xw2!G0GiJ~@&S~$yGQ`>{u9vT-t zdI1Y4Yv2*4)Lv9Ghn6{9yQ0?8h-*Y2NUF2!APY?e8daew83JCwc!NyWC0}ZlMkqSt37w`VoIBSj?u~L6)Tw2|$?9 zYFy_0d_VChm5)abM(%dJ1P?8LT+E!`i$is>x zsU*W7j+17sCR6uWX>F4RmTpe7sFA&`JStR>A#5rbauGu>Vl=wV65yrl`Ms-L{8es` zc_mO(LrKg*3NzZsVV_6p`6M)EEG;L*)(>#EwjUT5c#W?xu(>t7R7)aY4gQ;KKkxz0 z5-LUV6zyk#>vv=CvV#+a_!pQXmoFli+%qoBzF0aE)j7J zuzC?gC=~cto9Oo1wsNl={N!E7%T_ybc-`{M4ZZUNMVA)lS~f@6YPQmWPH!@3A4l2~ zLik@gx08k9;G7tCW5HwDrttu_hlK^ zF(#T?H`5%^{7`r*GR-T4^3q%=9>SyyRpy3;QFGwAt_ESFm1x2_YZCFxK5+ZeeAZ|KAO{NbQ5ha zfA{nYTT`Wf9b1;;SH25l{m}5-di`fG;SaV}Z=5l@O^7n7)kGI|o|!P0KL3xc-+TFv z+|(ofL6Sac{R64HrgEd)p2oqe=IT*e1~-~a#Mv`Z@gOs@VcJd*+UsN)`W zOw|~s#xD`LHMO1i>*F-1Yj_BnSMthG&RI&dnWpR(`OA3h5@vBtBI%?VW4FV}4e%Il zO>!=pXX-&=v>Bw#xP0#VuXt)jtx9=Km`S#B=7#H#qO(%@G{k_Ec{Kiq?FsIU_5@fQ zC{pr&LmTtc+nZfJEKJP=S}cxWFzQOWVxh3(c(k03+1vk^Sq|9h)2oHjmgzoQ;Z&<< z?)!Hb{hqa#76M71RR`a1GiNoLYWt60oVD9^3wPYG@r^H>2Y>y|tNitA$T%~^2kd?i zVo{jAUcasVGfyg!_6R}~yEGOy461J(;Qn!c-{Yg+pee9#(w9x9JSGPmVYPyxx~Wxh zJHqbJ=-dh>N+ai;L#PU1P6eiG|4GV5w%EF%0-#04CWui_4hyS<3rV-hg!Z$LKWcEr ztW-mjXT@~{9+Yc2x;AL^z3+(>}(Z`L+KMYlKtL)x1XV z&vq3S0|-cW->o;*J8hcm=B<1BQoE0ytO}a;9^SJKuqS9zoD#wq?>gkX%{Nw7%1Rs<0;mE7-w{6XltR!3(2C zt2GesPKJiTMp;Vz!=cDfz2vBQW}8~gCXFV#XVM&ZXBH+Jp88yG!e&d=W~=;>w(p^Q zBf-5E84#hL(D(+z?d^$1ev;p(>*Ns(mN%FU9;-cN=rm%!1%v*p6qRa!3?Du%_H-BR z<=CeF_U|#5FU~ph*ow`qk8a(6LQ0D@Mtcj0^!j@*2_F{V7y&8tI&6q9aJyecikaQg zQo9kss%Xj0%1e=h^pw7bBwQgC(3CWNblRe&NaWoLSeZJ4U8pC=zH3ip9O@IOPXHyl zFea0-4xqLdwY2Gv;tni-n-QJJmDBxd$Nr99X{v8R?KaSnqiW3s)SSlEG|EMyBV=tm zix1u8knEgRl66)W5Lt%ZN`xbOuTjqAQYuvYu7K$V-vX++G2=s9N%Wkfc`;3|8h5~9-~tJEr&jN<@H?)IMCt=08E#u^ zM-t)L_$x0s!qJqE`#?IY>eMbK8}WVI@3ap9C6Gbzy^jgs=gFog3Tn~<>-g=CcX{L@ zO_)`yws5D9}&SsIaq4etQyCUM0)u3Sb* zL~@7x6cnnxQ`X_0P@$Vt=r;VqacLxah6ivp`5Y1vd<-x>Nplw=l}PfWHNpM*c3XCW-W;!G}*TK9cSh zeg%vmt*!)4!&L6WPok}b=rWmwkkljrm`BOu+ALr_V2brau<|+yX8Sf-XiUl>h4!KL zMy$mX*VWvF>u`Nb!-nM_%Eii4m@86u?p7bXNuUz|xwj z`w0LFvv93IS2~a&cn3QQLh1)WVZS8XMc4*O21J3al>BIti54!w|75@23j;u+9XQ^| z8ipi)Tnnq*O|QH%65LU#Oa^Jg;6oFY$_AY9h*voIwXd~8+bfl+FnvSYG_?Wbgx2e? zU->c=4J5X4BwPlkd(*}BhU37e8^bT3ve^YO>~T9yUi<$ODhI-`zG$d_ce3w`N24?0 z=B?v?yF2MXpnEuhy*@!>AS!aM*yZ%re8Gx;udy>eZp$_{4|q#%SFw;mig)xJ{SEx_ z@4Qf@7%aw2A!jO$BES_T21+K)L!;mMbd~sSW4e$t7YE@o#tUdknDa~Rho9f(@QDHE z4rkJ#HELa6t1Xqudyuet98#^oP)euM!0{wq6eE_5HRg*6+HqvE_GQgJKPMKo@C+$` zZgvLz0gx+cpgmCT(_7#;gToXUiy~-6&Vz3}2X+6lGw2K0W8eQ2sL|b!TOZ^9Cv1v# zb?oDoC>jHkVtTQ@Xc4Sq8PFo=1QID?LxL5=p9I{xj1Lfv1jai6Q_L+3h#bY-8lyaH zUg^IK{;lIPjn6thNAS5Bp9k=H3ZEB$@c9jVzJre(f!B)&yk02+@3q?+!3o@lw#X8m zlk5m6UM#yK#Ghy%K|4L$EK1r=>Dg8RuL7o}xB-~z4iJ?XK_zus!e$N1e(Cw8zOK96e7Cq9joU7Jr%5sw8JRm1JQ-(?rpNU(4%aC?N zT~_dwBSxKZf7i%X83PFYxFgP8o;{k&ADiQ~+E4<~x6G8Ut!uJYaAj_pM*N@3RC6dZ zu<%K(MVH>zFr{PNn}&;KjjsK#){Zoyq1bBU3t3a@%8xy6lymq8}09=tNrfYQvY zqa-iJHI$U|JBBzobRZ%Va0RNW(1;AN+1!Nj*eqjKtMY6bWcE)kcofgfU_0BCz-lpF{Sn2vzku$!~6Iva97$`iq^z?_2`l4FX4C}2horXVWr z*eu)!g4lqcC#xYMpJd@6WqYD9Z6JT7K#8MG=HJ!WUL60?*+cpKq1nA3sh|Gd;g9t9 z-o9n@hJ4|`j85=mJZ8OrO{Z)B*~;Cu{)e{v&He;PoE<^g?44Y%C7P=y$S=gwel5^Q z^OTk&GGEpQLKmOsjv`vyBy7a~NvoYOYP1t1Mt5>LE%J(Rv-{jSsL%nh;y;T`WkWv0EE0Zy^Bv-QKM*bpgIFD( z?)Vp`^CYUW4PJ~?E@6YDa#%9=VHR5*m_rj@G{uT0OE6aJlP4$&?k0zpVX1|d8pRAI z4e8aI&FH%slYa@V_oDSdwRIb6h`ZQ=@=3IOTx}Uf&1Z=gd>j`N)3IMl2uQM2cEF_b zy0Y@wPEW4A9UUfr2{jjF2uwfv?YfK)xMn!nkeSghrd^U}8D6p1#fc`r7!tC|9847cj97dRh5|6!H(KLdSeL0F8u6*g(8>y9bO;a-1%|qi_yrNB zHMUM33F!p^+bYiwtTs|egg|MS-jphF3D7I~@s!!D-|^Y;;p@k*~z^ zewz;IL9icx2Rv6Y{}M!cgt^dPCEA||f;*Qsdq@xh#e_rTGvy!*f-xX(kN0J{JqEjR z49{fHWg5$UF~rOTW1!XejNj5(I-f0!c?6B!prt7V-WK2cq40)~fxG-^k~+kICxoY` zQAMx;r)F#=;s<)|$2w?g~CvfUXm0EwoFdQoVSxZFawWqrtmMCpARz2?xH z%6;g4NN!Pa6`>u=%z>Mw2$OIX^z0XL6{Ji~SdW;bjNOBux5U6*qXMqV@dz2ob5y_U z&%`5t_He6L!oq|bQMWAqY%FXG4OeqZNxoC>UOR9kr?)$kD@E=H8f`J^G`bDCXnrG^ z+{i~$p1yk3?XGP)yLr>G>5>~+>nk3OR*X3i?o_XTKlfKs&I+Aoc>72ih~?Jn!>`Fz z?bjVirz39HL~>RD`H0wGQGRY9afnWkw zfH|iy_c3Vd7=BP{0(MPJg=W=jR&WiAn6=(VRw!wkb+{k>mt~n5Q77=ptKb zQUFugx=di%wdCk<$|kCytRfH>x^l~Zn^%ja!p8R1gvNSTbi5}ODWnqOZ&*a1XtBpa zVm_O7cUrV|kP?I0xlCMqwz>T;?irBK z8hFa@JK>c!ZG%4h5w)`Yt0uqQnzbe?4u1?G<6+wl3epjSzvH{ek&%NW>1GZ*70Z)B zZun4K18aH6&d*BItwjw%EM*0Mh22qNf-?lkVVa2xC&H6NX+fC*!c?#*GSYQtQL}*S znrJ0+wFP`v_;G4mCl7NnX<5dn3|yTB3r`Q>kvX=TWO-Kyv}p^{Lm@h_3?U_i44G6Y zAVW-qOAlqmZF0cHirR7pHGOEg2_-!k@pa=U$z5O;FtMN1MteB*J&3D+kEvHv@3S~d z_t&MZTf(inlHoy=90{3IMOcc+lO)dzNgpnAd%$d_tgBw-1re?sRF-6D*SR#ia8RiB z|NHc$pf#QOTvg|=uPu~X{y?jX2vY`mu*_P+=C1A~?zA!0+B4zL&+H#f8pm!-XHHDQ zb#QQ>$CxVjhbXx&!XH?FA%r`Kw3pRuuHy5@m>`DaXTc|nLB zu|e25x-D*QhGkn7z2LvZsk7Du^amKRYP!E$r%i zaZf)^!yH1=JJUlYFcp0JZ@^(rXtm?}=Ldu4s3W_w^M*0bUb)nN_)Ee`Eo|<7TX+rr zp-P;$bKD9Mr;`#Y7=e+55)J7*%3O-+9Li%NG$`pTYDP)hpcN(6+c9MxT(6U`kXo{6 zp`ImRV*_Oc-$^*CU?%k$Lmgec9iJTBb8j*=dZY~RlT&H<)A^ni3t4@w$i044o^ z21>F7*bbPmmdO1Ml+?B#CG|aklCC|DlE%7$WIrs0mBf9TmS?nER?oyF)5 z7b2Ot(`G({@ZJ|-dN z6Cli^8tpxQgooqGo(}b=z}=(OjH2>M9T-vFV~`jl&K!^~4Ep#z*zu9CSheGWh_>(@ z?#5R;UdBm*rkjJ64wVW!whdkAy9VvsRBR(WByFM}FQ2LP7#u-8*?7E+`X?~?Uk0`8 zMs&3=OILmnwWH`U3N)Ki$D{tVTM!~F-FoXV9e^QPvo|xD7Q}9(T5z{AncW&Ne2TMShFS+O_qJv=PQ5Cm>y z$4JIRIZw^~)B4{m9E6Qts`UB`afqIJW{RrCT0n?+> zTBnmLJ?0AFgD5vpZeY~im=_j*HS7i%V(q8Vep+@lT?kJFR*+`^ri&wmDTLh z#X`J~_tw{Eh9j}j#of*3zReTS@W{-TTI)S~qTK;sN;qRSkH%tuN1G3~U*IVQo3HQm9`jxw;1DE8TZ(I2?u}50u+K?tc1!&hG5lJk}?cCi@Dm^1*6; zIg?q=>$Fft;8MMY+kmu!Qfo*QMFwutXofUGINIX|Vd3mr(KxLUhTy8wKl{qu+;d$O zc)E1zjV?4`ON`1X{RpCF$|lZa9RNC|YQjOroTJ%+^_qNtReFlt4FX zNheuF4_bkBz)isYfT7Op7kNt zjXl+?Nan6Q-;?P7VO&QlLV}+L{51UXH}t?1XC12$L;5kih?1nwS-FK+1J;LrkkWe&y|$w_1%0C*wHxqm z+j;z}**mU|A2%XPDIU?bqA^Tguw$5kpQ#&Ze^&d2e+gWp(I(wFr-F@MNO+9ky&&#oN6lfL{d0 z1FrO|Wp8&WYoj|E5>;=(SC3(vz|pDez2|YZDu4^z-SHT$U3S0@P=&ferm-^SuB#z} zJ_=M=rTvEt&dF(>Ov+QTZXCwY5*};e+Raiz8B{2sLRIu;&fJvLkM-LvLy$Nsd>l|q zjzpk;gnJR71=j1zJc)#)FzPJSB+$hL%U8)kp7=ckPKRC@d>$Olvj66cBG;BZ;Y_xA z69!+|Vbj##LTEn;-A4xvT!}0mF}s zh)8SpXOTG9WDZSDjRgi>mA<;4@2jp&kH#E-Ha>s${>SHxCY!0Vg}K}O{_}@Rg+?5y zp5so=nH?@7J!v%@_m(%RyPgb>-;|ks?S}Sq8-tO#68GoxC9rvRoj!0Wy0A1CE{4Y^ z#>nOaM~7~lIleAHpbUz;)^U>iETn>X-Q+uP3Uk1=YUY$lTRAc797-)pA|5`JWZpo3 zZF$UOCj@rPh}bJbtRK-@@+hdP?Ii1FJqOjgCG{G*#~xg>2V)a_1n?30K1Tr`mEn_s zN$i(LpVK6HqzgzLJcFAZkrg~AWefG1bd0Bb6FBdK4k{W}K{BIfKY}cp5*SQ_ALD?$ zdyj;u#JyC|LY#~jBm2NvFt6e$#y%;3^`WcMXiuZPOKtC0p+R{xQaG`3$*@I%mQ-jb zo{qU@9>It=V8k2nd$s^(R21iFFdh`EQlKzW3R{7*is~$hGl)zW>G+H;Oo*um+i|V0 zo08jv^ga@zGczhqa+ZJs5oX&7?$7D-7YFL?dt#G_3gF1L`pV+gC`6K)_@{1vKJ%G4 zqH}0tr<;EduKl0K&y{L>nlrz8CT70%E3?Thhi{$JdEK{ud%3h$>?-g2kvkfVd;QtT zi@9Ld%3DkU7x%{lQ?BGm?yF0`z1rTWu4TrPPSGHidKwADF7ApQLi%3ZL2&lw4<$rz_;p#=>HMGL;?THw9q9>kV4F?%(Q0BqXiYjUXPQ zG})j@>%jNNA%mnW|SZ0QaxY~NGTdtJ+4+8$~pdNV_z=x|@b z%#HNyEhW8<*6QBgAo6&BYBXX(BlH~HwG;?tBVLm?kpjtplU)uC3H+ir~| z;x>oV%lq7+Tg;==uD$LwIh8jD5D?x@YsU4#KiDO``Z%H2f=R%-_K`ri`D zpiyB+X)kp=#|@Kd5~EU|#!I(cW}5_=!4f43q9jU1Vg(DncLFAVyETHHfSrJUk$TZl z;1(dl{U8z=X^NkcAz%q<#Gb-u1RV~^F^q5Ncvzw$iYrGIQVpUiN{B3yf+-I{u<{Tj zeN!HSU`9fT_tJOp(v8WQV?%<*REQGAQ5`&IaLvc?0~PM;D4yqIQt#7h@B3BgaTR(F z{m2dzczBJqmCWaVDDgntUP>TLP8>2pP!gCDMImMkI9KnNHbjycljRg@Buxs_{wkzK z8G+$w8Wf4B48D=;4$>8?D}jYz<4PAV_B%(DsbLrK6_6k_Q^`>{zVX}(*&)}s6g2C*xa?kul4MGATxMjp!DkRMmk;uQ?SKl>}*;cEpWD@quUE7ef5Z0U?QNwTh zVBMcfgsq-`l*u+fP{@Y6xl_^Uk|Pq1ILuzXZ**!VuJ1&MLW3sPt>L$vs}we+K(VT^ zaMoQ4bU!6%uY56Ajk}G=K(6In#T55mVxoW)S;I5y173~;UxqZ>F^VBse(&4Dt3nR+ z2r`J2WFkJM?f4S_|9}s_8zxXj0DgS(_%!gD!-ouiz>ni|3qB9w^KpD$#OLey{1!eI zSTuK_WHu1AR!o=ik=G58!xZW=C^J|RJ#tU16pD630lONg_R6vXl9^D-WtO3rC0`~n z2wiSMNtP|7oTe6{k_v~e9K!2OQVKKt@_1zfCP9tA%Kf{0>cHKbY*FVof7ektd3cM@ zxAo|MsS3yWBBFyg8#_6D<>I-$e*f+>7pvZ-8y{NpMlB=f4yAL^tw+-q=+^e%bU$8>26@Oo2|a8Q&kiqD zSmBiL`^jqmS~-aerX#ASHv<)qFoiP=*E+UybJm+Qxthy= z`vyoIMDz!AWIB>E;e1vn-5F94?NNb*!d9gSB8T$W+N%Rc#T zB-vv3B_W&g1SDkJk6z?e#-3>&HRMN;CWSF3i{&0rq)7eJ;S%B>V#qMFHt05(vO~)x zMT%6oP7@5WipiJETuD_eA5{r$tVqBo#R{zV^FQrOPBwU_vx1cEvnTTT6SGf$J?H4D z*IcDjv$LnWOnJ|RspGla@u~K~!e$Eh*teG4-vlvwXlraHWAb=BrtGBK(;PHfI<=gq zV5O8}X1ggnP>7fvgXgt2r`zQ3@y+2R6Z4vpza1tqmY|y}3Z%uj`(s3|hiLiqYC`Ty zr@?Cpnnz-j8Iw<(oUNYfcDjUrl{=AdNvt;KOVEixOvI%|8ht^75xQm*EC6XhmcM!? zs>B66@D^wF4h)Y*>~ZJ&K9BXa_}-V0^SuG$5(U9J-0=oG1CZE*SYu^#RpP8^P-nQz zoS~wCJ=i3bjh4QXpo6CSD4i3gFbG9xjY7&q*kys}h{|!eS&`h5SOsOUt84?we=GxX zn4&b+`;KRj1KR{CE7dE2~2mcW1PjwsjBB zX7xVr!p)`RdcVyFSGdNk+q2v>e_J@S!|pISd5hL)vKUv6_>Asg;x2>T>9wTB!kG$k zc#WsIzfmoEc`o1I&L=10yZA!8bFi;$@VUZ00Z(IO1TM~|uEV2ZEtVJ>+f>IyL(tdU zRidn}8lA%^Si*fpLA!R(v8~*WL~Cri;K{nCe(emS55184{f2}ujlFQwJ@^+NBqwWk2YW=w63?=~cO0gcvz_W(AHOg}vf(D)DlrHbU zWmF0%1@tolRuG9`8|tZaqjaO4`Vx5}gHf7QAKteP%*f zG1Z;$nT5gyW7HKai;<|7--3Mu%6X1kuE*0$h=L^P>N)O<5EkDW$%6nr9(7GjSp(mRiLt@*my(B~7g{EPZ9#|&CZ(wlsb1LBR>c)$_Dj;?F~AfciAI|O zJc)7|CAB?7^ydT`w_^BN3_*0~IAo_()*%L_(g54L6Vgp=e<~DIp^ywg{)+*X8xyQN z_9nIOcD3(uwBL-~>K3(TA8PKDaFOAdR@r7G(`=vSZOqJ>%_UkYLhyY_wP=(tmB>a-V1-PwrV7kAnmR<|oOo#zHz zrAQ%K$`>Pbf2*(k5=F0ro5i`Y*69#b2;4;br<_Cj=wgFmtIzE2jwE(g5rnq2D>1Ml z7975q9|oee9)~rXMv^BDn0Z@k&aH9!qZ`(w7$|#_$RYPz$VF(>y2ExpS)ZJl3ft_E z8E6Ghq;#xq^!LV6(e6qkpY^1!{2Q#b!tS5DVA}}|f2uqEGsJZESe7~cA09_CVUyPp zsD=lQm#j`h>1eZD9e;9_&~ikhnZ2=w6=4B^t#n#`WBc24?6H6WpCPocRC^IqKpZ#n5ivvd* z;pWo8sm(`bYTgwf3xu3tzXaQf__0Sf6%+&JI3Do3gWg8ga2CU__J3b9GjJv z1>+jYZHjq{7-#`WtCKcqvJn&28e+6dsHv+pv>G?j>Knv+8V9)he<1R2IEru9NOog ze{&>GF)P1hB#+S%EwA>0QzS^87OQZTR}`=V&_b1_31O~0Ntk)_qNBJtD3~3Uk%Z;` zx0jaQzW=#DEpIOSN<+&7{Yyh7pB}89{-gJOYhm%N`xb2(Uw^XX+H`7DBQSd9NHZ|F za!wnFJGFce-tXGZfah(EZdRw6zQk#oe{AvwIDMx{dp;-CbHD9OIjWh#0A`i{Z?``3 zHmL_OZ#l$YeG~GvDje~CkC8cwvEPXwO!c;Tt%^wN;M>o zQ`(3`Ntwb(6TJ(UEx_EAC}aorcPfjrbk_+lA~IiP`?qq^qWwC7A+jjR&Z!7ke_paIN|`4yeEgSp-B}AX#um%g)Nq-%*b3EvVfSOT+GD#P`i>)u;P0jLv$Kbh7(IHV z{ry8v7E7NxX)xim>d)CgTr_5@e@%Df~xuEao&AY@LD&p+zB* zVX={KJJo(mc9iajHY4tk*}t?0QLi-})7W!AgE)3gytQK;=Q!;zTffZcf6;~4?!v?x zkUrq*TJ~cCf@%$|fxmS^fUyH%~vK8khd6j2DLfF2l?KmxA z$qX)2);Gb*y3YbmT*e0@5lki-U4W@i2{4@$Np0K%nAUw0eo_Wf7i8Z9K;}w?Gr0sItj>$siI0KX5MejEe`VzOMfeF+_Zx?~ixyABZR8vke}_>6LUB70^jS$> za3`ohgM9yZZb0k4m{(i4?@{d^f9{Ka1@x)hP;~&00y>Q|TJgG~!H}cm3Wp+4s;1*{ zcdmOfE$smZ-}}07zc2|>zoX+x^4D3G7d{iT&dJ`(S=5tykL{5aOoI)teF5bH5Mhhj zI)~bwgeTik-6@~e*8H?r;GiZ$bF z6;?w@4+1a~iRR7GMz`C=S4L7$le|0br2Ss^B_8yE(2}QS($sP)1gj>{#NWQi_)A^ts+GtQp8Sy4B^NV zGcETdlXi9uu^kH3P@y3iVpopf$}zQVMr|XiL0PaCf3B<9f~O)|MtZ3`0Pg@yJ$C}$ zN!E+kh!15FA#w3?Xsj$_x$&=hegrL%xOCQnZ`Uyv`o1(V7JM%^5gs2MaCye(=fc4* z*a$kDf&*DA4Ne1R?Z4QQS}z7##mPq&96s&rqw}ftW4F&6Lhk#1u=LO;!h?GQMcd$Q zHG}<|FLL{Vn_P>iL(ks40Y1xigDw`cM}Va*2pg9# zltRM^TShD`B!XRuuvyHQj9opAVsxccm~cC~0@>rU+(@t|m`#lq2-9EV?&aS121b?e zbR06;7a&9OW5YPm@yD-X*KkWn5CBt5$S^3of2PA?w zEm`wpl&x8J%bZ9>vVCKG2QfKDTxdl}X1Kcn+W^}DQ@tIy#x^|mU6Cy`&=x?y0Pd5* zeOl5ZP;DNyR4V%r!Ng;d<`OeMz<5GE;|cj*C6=`y8%WD8Qk1bU!b@N1 zf8ZvNwL_l+B1hS-T591g+vA}jtH~yCZ-7~BC&R;2?*}8sPxqR!^;`C6j$bTu& z6+_6jXv|IX^(J@!18-rv+UJIMPW6?Ge*v%08m!G6ULwJPmO}pUEsgN^o`6kf@MNP7 zn?Bj)@8o!$J00dsFCdhR76&ZqM&|}8XBc>orH+G~NK2h9dBtR86-ExU^u2hAv~X)^ zU&RX~&O(890|%H__ddA}tOfcXCS2H$dF;oV&p|9e=&~%^7>F_#s(5S?l~8EPe=^`T z%sZnifbrdanVsOMpCZF1m{cpo4lAb(;$6e2qv%dG2)bCH)Xg^DMMyLCe=(Gy6DMpr<-7V>pn7s+j zv2w~uVt(^-%d3#?us)Pve_rWL2u#@#PslZNl95mOihNO))(9kRhW-fwF`#&2|1;`> zOy4q?dI~oZ}=5JWsMNo5@NdO@46h=;n!3W@5|fRp0F4_ir}^+#{E6*obYp zxG|T_uN}H`i@~fF&7GBS&=2cV&gRgXx#;X;Yq49OC|vo=(#CKof7)9rhh~!72BVQu zE*B_#;8(k`-i4_vr^a=H;2GYyZOzx$@TISi`vp?;2weBt;&ehpuEOHTX2=9JtQL;E z+df*;`St!}WPj6{Za+1;zgV6;kmXilwLq86?+e=J!}U;?!{_rmeg-R(WI9rE-+NEF z5zg3&^(mK9p+TH&f3oj=LU;?f0&g}Dhnu+%l0m?6X^NDnU`m3WJ(4Lj6U1mR=YC89 zTgq(vCx+rU>Q0~}ao`@n3PzZY9=W1A7vYO$Q#)i~-H)PcTs{f3k-v;?3NIhh)A%2f*@G z;H|_wHwRRxsX{HeKj~Z8mBgJX(5edUl%cDO=7d@!Efrw&dASA{&Em{4GpOEQ77tt| zX@cZ^MCg6hIEtDinkTVEgzH`xf}LH1;ba#or5Ru-{!aTA?)~js#x+0@UvY4?)mp5k zeK4ceOtx?Ne`awh+G#*;Q~B7+nGbxv42vgz^vW@CK!V^K+qh+u*wYYGk3W2aFYkZ)YIMUV0ttUN z_e^ju)3vGK@@Q>1JfuXO7BX><->6?c8&7qa9U!mae{j^*Hx@_+9DR9LDU=!Fx{%(_ zUkF9=?tAVKvtfU)gyz{|Dgeto$}#=C@Fm2|@WbY&8#=MMj=LzznZi9?gvN!)(ivIB z@{8OPx%?=6)I}gl5EGR}jZ4Dhg4{;z@9iBIrMel6L^>R3bj8ar$CfFy!PQw04Ji-iMvOS!~-I$VKvkGmN_Kw58pP2%=N{Eq!jI?{pb_|6!E|5 zf9?tgDae|GIKbEMeZRy2YQDgG_-G&zig@FW;`SPR7qsS2It#^uv&&ZKD%vfPYANr* zj?c$--0w)cT|SF77%zllr4$^F9B}m0C#HsbEViI%i@ID<`?sxe``AJtZhO~C@%Mn& zqwhT{d|v2XB^t}StJR*cT zOtqpyB$yFJN^ALS$I}u%XJrU-E3{XE7Ni?W0;ZVRqqvVp>bFzvM{T>&k4)-sQ^)xn zo**Hui>J~45@Gm@7^sR)3RC+;$1~Eyt>c744=q6Y`l2+rS%m^Jbd~kZsx?nwf8bAm zW{<)9J?R$ru+D17RQ7}{T$#=f%PHy zIl#}6j|~LdWU4B=)%DjwgAv9-qN_0SA*1T6UsS|(Nt_2KrtAHL)5xnXiNN)wRss_O zq?a7ytXu-(7gdc;p-ITsl-UkRf00RO1nuM@6Ge*BQFaTi98#R$bXN5SrMbn1Vu z(YT|cXmR~qBe=7jE(_e7`QZbxxoWOwJ^a7Ew%6D1Yh<{Sreqc#?_J}mFX}w5N~HuV z?~s`fr;OhGWW!dd^mvkaL#S43#I!!UZ(?RT#KV}?X4Q0d>Nh@8c7!bEe@<&5fDEFm z7uH*$kt;JJ{?U!wx0pii0b8sWDyft>Z1XswYsJ%94W7;uw}mn!kLB#{z+=baITJPw z-mVXuKI94py14_@&G~G8XTi8@TdcIT_Bl&388K$UjpScIYl=U<(+6sA%vAy=GUexZ zo89bo*!9+kNw7FQrh76Of9R|@u2ZM8TOaAZbBEcX*C8ZxI^5XCogwD??MI*fT~h6e zc`@XnOiMyX3j4;lAs5nPg&pj8g(B%t%v3P6Kmh|#AdJ!sl%SH1wp1^jtVqV{0aj1Q zUMvPlyoZa>fuuB~^CBXzEHxh%YnOzrR7=bhm5St+t|H(2y4q_He>KDCMKan6z_Wm7 zalci$2l-dC5kZTAC3Ns%(te6(3UMvIGix4pN*0E=YjDd$?j+aiY=EZnFpLNTM;Q|H zwd7c|>1q|Z(eh9@I8rjD#`}4@qkAB1e5N@Su}4zn=rdZ4KjyY;O$Ni2zYoWaPbXSY zTP)w7OZ8^MHcK@Pf9|3g7*52Gj>29hGSaMjyS64P@kQ>Po{Qtr`o-bT37Rp?&Xu19 zlA=}X$$NCj*X-tg2F`*eZTAV0xNfsv>oc|Qnt5oMhZDW@clMoa&GS8l%AwxT505!S zI8x8A6@Gx5!QYEV17Tu{W^sXJSLGIf45`=%e0ney#5gCSyD+- zgB4LzR%`A-&0%1|048DplX4i}TY$-YpI}9ZPW>1^!0MNA4b`opFS*69t0R60wTDo9 zNFLz??spcg_ef|$*W7|u8v9O+;YRskqNjdzC!4Rc80-YjOhiLlvQO2AU>-^6OBX4e zFTsjT#|&8Vf2F@nXEyr5{*JPAI~Q6A8>!5oBz+-WnFUOmD1r-s$>@OKdjJ>dgYWdH zJ)p?r>S!(0kVty~y!EXUC27)Iy;tguKY0N;vwdOi1&)LJ5*IK`6; z8bY7{3cI;qz;0PDDXjt7D_Opp-1M!I6bX%hNw-fLf3WL3n6K$eca%rtKdlo(Fytor9Aug|kKWObqCik>pTts1{G-lh-_IP~z zQ2)`QhSLn)e(7|#VC!t0Z*YzESZp1t2myZ1QpehAIJ{b$I*==0SYN+T?mD^rRc~Wx z0HnRYe=+FiE=rlVu3Qlle!Iq9M*Kyy&&mCrRJ(c`SZaBtT=^HtcPcaF)gmo`U2pIX zNfn>z6wTIz)hPM{7Iy(2Vn#lJ&=XTyZMHuf=wzLZ;*DCWx=#vwrj;%PBanIT3D~y} zKmpc=!`>x$={?B}kw@VBBvf?B$?oXDWyCZ_e^6S09DcMzP!EooYI10aqRgYD?_DS< zJy%oiMZ7laPt2(TZN}I%25t39-2oLkF1ND7-bZPz5TAQDhMfmxrF8;6SXv*%H!GCc z-*LC(56Fmn6c0i~K8Z4ktEp!e7~CcIqDN%?Uq$dD1=^`X2UO^^3Y}A-iz@V>49WQI ze-$CbxQgDYf?dYFA$E{ctcoch9-*(KreQAok`NRew%WoBwJ@k+p$wkGg|nd?EKiP@ zjm4pe(fOvuA5Qyo%gt}}t=VjAedfaQIBX;8<0#D>W)?d^-1x{@4zV|V(Ij` zJ=w0FnDdZ9Curxif>!IyTkP7W{bRX&ZY{a!fjGYMkCZQw0Y z-(LyB2(O9vlx!4v%BnTEjsLH|nXuUnj-jdfxZR@BTJ@R$^4bV|ZMM-976*K8f6=Ki zJAID9TsmBdCMWXkS5gCA8K=!>w#B;|nF#kH!WCcH+qGCIEOzlTeXDNr`!%=!CcBzR z=N2eMBV=#=kf(e}fN=+QlQ{G!Pmq^y2f}g^awTPlRgElg-w9ey^^53EL|FhT(Tbpw zkS~c+(I)#b22L|d z2zCN?VjMsE8Kp)3C~9dxc?6}hmdb!>Z=rGsB}M3`e)I#V-vr7D)Db)jf0+24O%OJ+ zfZ%tbmTjWfOOH2DzYV>&q4zJ zTJ>_nSGJdtT}Dz}>~Wlce`#H-hG=mqbd2gLC(3$}AMvplkp8dn!VAmWi>9->u?3Ao zOjKe{%_sR-`{grlhNk1u;^vs|2jRNS9yNC&AZ{wNct>U6nf>{RMz2qc^pE~}Y~_e3 z9$D!utj=l;p4xcY(mw0$E*G8I#I8!r-5MV-`)*k0p8SvHJBLC2f3=n4%ln@hs6EPU zZM9x9J3BdHoIB5JU5RkCdpzv$7z{37$o?tLGe2Jt^NzAu^M&HmNfUgh%vu2=dZ<1S zeQTb$Hb;N#Gx0&VRB=rWKg4V9fgO+09Y@qSQ^|| z<8227XF?$83j1_|=D%D026rk`@EiTUC=vi86A-d7y!Ntlpf@?v~qbO>fs7pA@^_9nSU(s>7>R|$TdzrC97_H(xzQS}19=JFP^u})7?)U1z&YV~H?f#gU=#P@j)aYJBV4(c$D z9rPp)`7d>Rf3@Qc?yre3_#}d$(7K#N<6Z?j@Ss$G5Mq5I7-sY%H!%qRF$W&Z0huNf z90W}6H#xv*z-bvS0w(qMuzDqF#&@8WVkO^=L(f5Jyi2I1hzSp)M2Jq!3*zy|@pNmTDue7OUc9FfBhexc*D(!-vTf5j*~jJ=4;ktnbO7n5Q4X23+e zjew5;X50g)9$@8XodO&~pBVa3J^LvPE`zcRfJu5)!nk1-+Mz->$`Es9K8tbAVjOyg zbAZoDKYnw^5$PvV?fs~w@ zR{;Nte+<6__$AWM!|P7C<{T+mjj8fvQpV`q2t6c%J!VRms|<@3S1FHJTe)K!L%!2@6=et&yGw5Ea7w|dQcncTOCB|%)zyRsJ<}d6$iU` zBsD+4T`mFAv_+s@@Zc=UXE15+~0n({Y_ug)ydft ze|98S^tpb{^TC09VJu9iToO}+$MgAt0M8v2BHma{G&%L|M6NewGHbMsTk>OxWN55B z8p-=idS7?$56imbcX&o&d>-i z2U+rV#5egnX1YcT<1`RR1kxyWlN?~;VRBfTq(>qFH?48n_{jjc2%A?j0w4jN0*%QK zyK(_N$rfr&t)=VF(8?u?RyvuIeFAX@ao8afnGry*sO$yVpz=7Pe9#Ie?wvgZe;IJj z$_Yn?QLB)dQMr~59ITyg%pj}+$g?TPMjWA;fZ%#?+#{q_lruN$pi7iZCMA?6D`cQ> zn(^MWB4o@a6(!EGvOg8`s1fp4Ugsxg%%!2}OnWO(Asa%r@RV* z2dYE!mCF23H4uOsQ>8N3><#emoa!eW`^dYGo#;o7j^ym&$BuXJ*nI^1D-aj|RBD;= z_E(^EMhHUkpPL{nxv3Kk%TS{*d8Ssd#~r#(qe%y&7DKX-T>dU3c(_myf5zAdfY~2u;5VMCzlVPd;opv4j&-g zqF4+hix|hP4yt%{R(iY(f3kMQjO~Z;>H;oOkegt7WW9W217L#;(@!vAybyL!ip@ZJ zZw6u4z;z^Cud8iC*R|0ypgzkeDQU>M+IkkX%1UPMVhUEyd6z5{i4;A!Y7 z?*x3O4Abkl2QXcKFJQV}c_jq1U4^Xx2*BxR%9vOHMG`oo4uJtAf7!IExB-8Z^srN@ zdJvVOvP;W=RuA#I4E>p!5~J$-l3~8uM;8$7@1qsu6@}21H~F!{z4O`Zd~bfFC+qaA zRlY5bhr$_a6d?>P<$S0QN*%DB%kS^8B@%JV#b_?UFCCVbjBvKX? zAuHO}(Y68|bf4uQ+q#p3Y}vlk&-N!-7~KDL7yvpS$lmw5y1Kfj>(#4QFO}J1H*(=& zQDcE1<%;qFVdOwCP!|zZ?m})11|W(?ZzmG&sPWSIf3^p)CHwE;#HahiF?i@fL^IWZ=DV z|JTq&edC(xw9UvS*X+G->zc2gLSr;uSh3(sHC$-_;K75XlP8Jm_d^uEdGVgQmZ34! zkGv1>a2kxEe;lIqx;oxw12l&G5-~o}@r(q!6sMkLn6GIJ-Gl*0umk7Il9)jJIddH! zCi*Ax%m5|X4xFAPD#Z7MTU99zE+rD18R-1;7{3e;Sot0#5Jq3g9csyL}S)Cl< zz)4WK33c9~G3&<({fL890gs5Z$F00!<#yQH>65U~RS_)1$D82W(x;Pif2#9?1G9!- zdc885FXB=3N)y2fho}X^nkEX`eoi z{3QA$f9f-DL(RuflkQMI3E}ifs6`TJ396rlo+y6~b(X?TcK`J(C5<$#oRBJm!6mOZ zuetcr$a5>3+(}8LSa?=J%#xO?(!3{G60qcTD<%PHl`2nda5$(Zcsb1#-12AuOB-J) zq9UBYxxOo(VVB0eH?L{+F>nzM@d+<-(_1kWe_@+aTV?^X+`UUhj7F~Y<(FO>c>VQ( zfx8D7i!HkC<|Dfn+!m+VWV9J$Y5#n=Fj6Z)G-6m^se7bw?u7!YF~-OH8Iz;j2pC!? z4OU$~*lDY3?WQ#+H#U(i!JJvG{~5VvGECvY{rSOa(Mu_+eZ}fPp8ej&hK9TFyB|5( zf3TU^!qQFmZ_g}k**Bohhu(^iF8^R*VK?{$AGSfOsx>=IyxVLtYw+qi7NI6A%oX7n z?Ri~iHIAY9EnqVy))RzE)*A3Uv)*iW8T_faupa@62AjpCu_Te@O0(Mfk3=QB*%Xb1 z4B!KGc$9i$eqVyTF<^~a!T5iM>w*v6e;%w-4q+Rpk0OuAU(qfMXCwlCwBvaRs@vEG zC7qKjKWRZK6jDWNADQKo+MQQ~pWV2!jPb5cD?-QJ9cw}MG&P;+xF`((Qh?5&l^N7M zh`M#)v=#Cop8BX%cbjsT>=U#X*LUNdeF{7PcoFA^0S}{%M}a>8`~kG_O#9B~e^E;0 zP4Fc^x`Wng#A7}|qnmyN&7}P}$ba}aZtsvxHpJ}Y5q%ybh(`1w%-J+EljuoFjRn}{ zC@&HHEEOA6Fxg_E{=oCNLmkhAs~=`tyLKI=@=qcE9l15R4RuDP`>y>!wZ>kQUi<(D z-kn(1i@;w5eh4`I;Fo|O1pYGcf0t>^)iyFCzar<3DXS)o&ufX^GM=hr9!7Enb=A~1 zPD`#q*rAFnB&1dHR7rJ|krNq{`vqoO+ED6Ridc;CAgP2=AJ=ZEkNF4|gRIlU84zT{ zF&!F>D`XB>wMdfPy>RRD^6@o@7GQKj)MbH7u8v078P1NNdp;^g@_sXJe@|?yRMsSL z!H}52{_}hpCd2Q3_q(kB3jb%&*&KBz_R{8`yhYOfzC~2cKl{S_VwEWR&vByfVRV=O<9}FR*c4&C{)P|$p zn9qfMEjZRHcq87{{y++Df4)&sXL8#=`qZvno%{EHqcl6(g#VpZ9Nu(t?VTc=o=lLw zS(`@;2(9xX;)9(@m(CV&-~8;peO-I^f&ekcOkVwG?i1|$m_;_Ijt!t!9r}~(zT^!V z!V$$mvy&Npe7)B`(I}5TCruRL9^g?xk)~maa+Elzy7jvh+9-QJe}ctJwkWQ~{AhIl z;*dYMVfVrA?nArR2mP~~c2+i>+cF?_KD)8?qt#0l@A$3AMifqT0d|qe;cH6Og6(R#x9&lq_J9pQk%wX0^gFxYyuVKhM{Mr{aY0M0PMh| zK2W!JYBGFV2>|^=+u7n9{O}zIkDVLlSx?Mk5@NM=r`Fx`+`Jq7I6Z!3*q&y&Gv}oc{$G9-nyDBiUxD2o`1)qYtXI%y9eP51^@5m zXLGb^4ZhQUZbVNOd^hrjq3@-p(jJ!FeB=&^;D#D*C<2mCf(Q7N zw4)YgZcN9rf4iWPydg%$AJqc|Q#DwE4aA0_U*;5zCN7ga5M#gp#1B5Q)m{F|>C=4KG-AgGhIO$Yr*Su{ z)4^b$3b+0-RQ2y~{UjHr!Ns!Ha3zWSg86}r8@}-Pe~+;RiZQ0EHZJYY;4-p7WMW~k z_w^;@VJTtyg3fURTv+Kd)D-fe6m@jof%1Nd)r)N`1#E*fm!<7RgMF&1BF;Qexl#TSSx0dyP6T z$z*k2N}xByG51aEnd|ii`qv&>;Jq5LZZSh;6!(3lcXb+pEtj_ap?9+I2k00$ktBi! z-KNLKSU#Fkp=Ej_& zIXSm(8}WpW<*Og%o`uf_2Y;9Q8SFrR4pIa4HG}Dw;C@(u3C>Yp7MS4t{{sKT<$-)IX~WP1Q0XKh3i90{e5ejwJ>>j20I&* zl^?i=;`PLEV5cK*LmoDr;Xtxxv&C$7?0scJwCC{c$>x=MpQAB6!MuOy5h8ZJAj}5R zK8MzobwQi!ajm>1k@Z`@3!YN-#&fs=ZQsP72AhBzTc7j`4>B`(rA!3O!wgu z5rYQja!zO;I*3FJf<(_OU>1-8>;ys7fRl$OmG`2{Y3p@HVpWq$8=yOqe_bX)a~fsP zbwZY=$Iv>MXsr`BGiZoGJsJe`K$_f~3Z%(Tz%>qKZs274A>0d`?)3rsP)4{q0CT|U zg{iCrNb$?mru@S6qDd)x5onEUu2{Bm;EsrJuS(t%*9@x&@*wG#U+bH3E$Cpqlt!b-xy8zUn#8>;Z7;M|PH0_FwZg6Fy4L@byQf6Q!K$EV4&Ru(5o z4G_SmAZwWoeb)h;knm_uaNC_X~)rCeoLPr|qB+f!- zh)QyvY+0v>ev_s*e^NP6Tn=>^bHo)-W_^Xya-xT^wtmjI%kvFWRP0|U2~22wY{2Us z7#k0H8{HMBd*$?V8|&lH?+F%%hL3e6jy#yopBM~HObmOy!xIxBilSAHgEaEJM z=F_cD{!8o6hxTq<%sYMN`1st$Iwmq^hNP8$p($;GR{xWSe=-i2P6HikBaUq! z{{`Y8JA23_OoW$v@wIHIkOcKoKSdnRc(g|B}MpXMMw(LsFh5*Dc` z=>w-wI)qY6%{ir%Qby_Pudm|zDq5kXp_EI4LJJlkG0@nvV9*mpvO{SM(ty_C29gy? zD5r5k1VIm3e*m0PAaQ=mIIxN`B8&}^jqk>V209MiBk^y2rblwLQ&WA^c~v&S@R532 zfofP5bWa*``qz+xm;L*1HDfj%r<$`Y`5E;Uvux#=*|Imej>c&Dfyexs(b4le`^aCYhmW_n$`iZL%SFeB4tk! zBM*XW&*pnsFGQ9BiLJt3G054%l@zDfq{*1^W!Lf6KOyI?p7A7nW`kZ7m=0puL&Ry_ zWwGc8+L(x#kGCxQMHyTqHj^Z|+r2A4lv zYkUCjAV8whO@K@IXk(~9)viVMc9~9Pn%$0?#1M&o_oDU=oRh_7FV5+Q61)xYHl@x< z;1qB}^+{@>r`#cZ2=$H5;}=rrfP2YyXjOkI6EP#FIwQvpT1K_a9h?+_bxk0b}n)b~^>d+P5CJ(+KEoDlRlG!~t4^+YUs+iG=X&2%z3 zGPOEDOMOZ{HMxKNbUL$k)86Ld-ews2e^BhfL?`=A4KzTY>X&}}*8RhFK^vRgcE|?q7)O%jLUPZJ zbQQ90ccxH{&`=sd`|L?pYtY7hoHaQP>Vgb$^=SlDlJb&ZDTUQ9c$(sS1t>>vDADQgJcxzcx;A2NFDyS-3XZQFo0_?K?LaWR zwDVw3Y-+G*@MMg3&ZgyKwX9HBe`^Y-^PX;BXEtp7%lK-o66~v{O#w&LU$=RX(s1+b z^I41k?xU?aD3Tq)Y=Dmlx!xdSvs9MvPGiQAmR8b&iYBDS()*OPAojxj3<^BCOoVuTn;5%(I}FmfOm~?+`&)YfAi{6e~!0n^G81Q z^Uq+egT{w!Oikpy`80T11oFT%7Fg%WPHTY8ou-$&6?^TxVpH;?T;5hN*v6u5tPIQ` z4fC#c*%0oO?-)f}cS~2Nl``4vNHWSIy6SFp8O0~xgw8#n)Rjwb!PR?k^*FAaR9cqr zy%$&JapitmAB8|M#LH-je=qM?eHogpQHg5wsHE~N;!1ur6$F3Pkz?%T+ zzSF3G0QdpaJ&p52zz+eR0e&1fm8m?9?!Oyl_bAV}m-Ia{@41dvf3a&9_?F~~;A-dV zR0HHOdn;b;lA#AR$)Kya*k{1q60&HZGA`5)OUp2dcal#ep6Av=3TMZjeM9u$acire zW3(n`z-fz$v5bQ=`9JrjFEu1YM{fROvx__a@!{ULj_X{uoiEQ7XA|MFHG9{N)n^O2 z9lr>Ucco|Id~&{!f1k=nmj*ID*@#0-B~qf8Or*TvNkY^C9~ zbM|*=Z#wSeZ$5Hp%leX;H*`PzrJui|)ufV9v36y1&1xyx9OYE3&kco$A(l$4!rc)2 zwreztCq7i3jr$iXOkATGL`IoMFkD#XQCh7HVvw*1MJ2Zge~V7*DMb1#sA1B>A!=nS zMfoPLzRvwNSBKp9UdI504lo^Wdw=B@5ME$|2S}h7ZvzXz>ne@wfPe8mlXWtz^UvlK&tM$HpSOx{jK%FHTKz$U~T5<7TEacy2ueq<+B3{i)|IHEJ$?+l>4E0!}ayJPBQ8y;MdRnTT#9h z2g%4!m21+dpgT?jo<=Qdi9RBIhz9{50(=CJ{Nf%5fBq=&M}a>9{8`}7D)>coz;if% z4(AtfjXoy9R{>vD>bwU0H3g@SOzpj`z;^-P#Wi}~XMlf3!QTT;Qpo23={>&yxBy6< zLht%zte?p74WkM}5PwO$21dGWsccyBeN(gR!G8kAS;*=v*=UgsMbpm1r|8EKE+C67 za zLO`s?x-7*2FKB1|6@fMALkWIyfbWB^MKCS~GeM8#neDvSq_a5$Yx3ypKmEAP%-r?m zN3pvpGc~g-7&3e2U3)4-PvpKysg|Uhx=uC2cqR;8-*!eg-q$xJod`-m@LW2Q*gH+O9;cX{*&Vd_AO6_Gu>W|-I;PRtdS4pn5SvKFD+~& ze@$qOu(Y5>L$cqg;f!Xz+1O9hvU{+=aeW#_jD>>IzC~Lg6KS|jH0@$30lmU#B08Q$ zRfe*DFqRAP4fKpGt&kpv(`AO->L zIH##71(*VPQJpGqT60qQ0C2J@&^=?cf9fZxomPfqm5SiVWAu$F`J{Ao0~)4>kUC)i z=PYnm!7aeaq(SBMV47jafIEPbg)0Eu1KgwFN#IGeUn1WMjBdFGy&l!91CkDcTIeH< zL0l56CAR~bZg`dY+VLsvOv3Uuz)Y=??(qnq>l)9j9NMzxtz#26Els8K^X1e?f3rUv z?rV;wqy&OL(?@z&2FwBf;HJKae(}-akq@oYAVLf}w4btX>PE4QN1zmT+x<(DRiWqx z9sE+()G+$BXZNj^c#l50X6r4;5;v~VoOmMT99p}%%ut#)^jp`}7vKw-B5z&>Kaw1( z=5UY{Lz6lgs`mjBYn?;cI6kq=f0{@**{9?WFt#y^g5gfoUW3{>+?~VS<2dgFPUU+5 ziD9n+PRkwga--I7kt8FzRrI$N#k5RZhkh_ZQYIeVhaRU1$%pDBKUrv-l36N>qS!S}6S1i4_BIEXi(QN8!x{7Z^xoNq zxBuG@TT`BXA;V9e*gh8-{*zae+sB!2h&5k+U|*)o9B{M_r<f8MNuoe*ak0xC^N%Enb>OVLt=I1F6w-Z%y3%~w#j_e1%J?jHHn;insYL4>Sm7uX z66}T0Y$7omy3klR+U<8B#eJ$eQNcAd!*os9wXlxc%!YioE1QZKf2Gvw25d1xHk5&@ zZ*gyP1MnuvLactCl0Z>xGX;y1?L>}gcA?8Co23~Ox}3y|CTbt3kaSpEfy>lLu2X7_ zVU+d~cPZn>UNlFI#uNjL9~ZM9$U0lPl`5-jiEx_B3GN2mO*$y0|EY6z*Xi;5SgZ^X?M~ zjm^?HULDvNOKqQ=+?k9l)c**5qQOEP!Ic_>PV9ZCvwUF>qc__P!I`*AwClN0(h|Ua zvJ*G?br!Rp{odL=qeZW`Ho0ShJ(nH~r{a^rEALq%E@#APe~!juW-%#fc{4L2g-p^P z4f8ksb0xnS+gEbY%5Yq#!@iUgN0vu@%R2?L-kwW`b@f4?&X#?0w>Y@rC=|);B!_fj z;5R2>13k&*Ve?(=I7`ZStJHfMd_+Ayq8iF>k0upvA>#lm{ey z!jO@PWD(jJgsb&L^%-R5!>qX1pkuZ3AYH946mvRtt#>s@w;%uLdFQ{1$sl~fG&-YR z>zlmm0BaK-dE8~TGQZ5#M5~i=D6(pN5(H}-|PN(GVa z>RA(}uvc>^Jh!kW#s-#-h-_-E#z>}4(+;T8ssFRg{U zuD-#2k^L1$&3f3ywsc%%v9J18#EH{~TaQ&S!3>sz1f$^N1U)FHY;5urNFEXfd@wCO zs1~1|e{gjQ^#GSgnrxu=qK+4Jq9|7dWWp0Dr@cM5;0aNwy==N03h9oLpnXFcEsKssLmqzD#xvm z%(vnTY?TbGw*x+e<0Cj;!|??i-^O9xj!k=he*oksI9SA7?N^>h?osEJOi<6a-+|uw z5>e#icz>9ISzRG1G$Zi0_6`%A8oATaeQj}Xfg&JI_j@OJ^H}QfExj62}kWb1o#l% ze|;AKWI&t0-f1_^_v3s&e#dR?yU(KZZj_Q>zyN;?_+yG~lu0zY$^VLY8SMs7rca5l zA&Z^ldI=v(a6BF2x)58FfV2&^C~-(xJEcr`416x@Sa{bUlBdeBoyayv)wQ}4F*TzK&I6l*kepPzj0xj(vivE?;~OTz_gaBQf{gxC@APQJ8m44#{f zNo=rb4vq{|tY)*NQ19~_N@KOW+vblIW8qxbXEPeuuin>M@JIO0a*^ueoXC(MiMj+w07pO?3wVeqjb;I* zQcho0E*Eh*rO0V@j6tG&E5;!~2NYhi9NoZeO*BUFvc&3#G1w`1hOSccG6o(kvE^Eo z0#DsMEfN);U6lnfTB6m+>?~EPTgvQfxxNU?+4NeEvGr4}&XMC=U+dnKoriUeq#1^Jlh#fU$k9p6 zThwi18Xfjtw))L_?3QlLEsVJB*?;lAuD|Qslk6;QZ=n0|X;YBLzs3F=n6U>@8s8_a z@^m(QH zrPCQ{!zI~)lWB|2QV%N|d_yeukk&xz%uHJ9PvE3i;4*6ZcQA%)hP+tYEc>jlTEMC5nRjgcEOY76uiZ26DP25s^kPA)sV?~(eY+mp8%`{55$qm|RfnCH z{CqGJ7uUSCiT9XiZr!>jZhuTn4{~;Fq8K)Ae`L>yTNs|62{D(>ynS}9Kd|=9+h>?# z7SSJeR>#WIF41OcjE%w9l8@|#<w&s8*xZgzJgVV+Br%?=y*T&zg|OYcODYJ&V)g zbh+(=tB{1<$&rzX?6*>#A-hgU!qLKoZ9Vpo{-`dw=!nYp~x{-~^q9 zFT-serx^^KoiN%`CvKGJMRvVk0-acJz9bE;U>mC{n5=}N{kV66K866d15N?bBtbiB z--K3oN_QVnFbrH=BbuUnP6Ev)J41X;Y7XcTEih(ZyC!I9mJMhW}+ILe4y(qz>fJae_?!FB;!Be2f zloHsiYOKPDa+89e$*v{S-*wT@3Pn;HEyWvATJ0{y-qVL+JDl#x3f}@n0=l@=M&f) z)W%%NMC+d1U27KZ%!z$bUosMMIzrL3SEF6fYMy3nL2MWn7f1Wq@*om8M^oPB(|@OR zK=TxvK9IKg?b+uKIEBB4J9Vs_j=2LupwS#jxjbfrl?ku`SD>?y_t;&=+J$MPZ#6i2 zk-rEoAoQp8V}H=yIIZ4VzbY)3O6#$Y*vy@Wcb05|X5hOYf<6g64%&!t>&HwOJj~ot zK+N1%ImqeI%|yVc8b}(k3&xT=J3iU*W#$iQc_qjE+$AOWp$u?Q5Qr>6s&iBf9mJrc z$Q|cp;2Pi>;3O7Vfs=B8%00kIX+yXVIJw}^z4B5(Zhtd`a!TS`!E;`gcqX;-BubxD z?z{y25^5ancv4Ekb{TnCWK4eIhjIPGO5In0zk<5&;qC8|$oUIOT}Xwb*)8EXj|wiu zyMa^kPsBSOmBv93YZ4j{FW^HEd=C*k1ZgibIq_({jg7UjY1|c*9=F=Y4z;fyZDS9# zu_xQuhkx7HB?Xhi7(R)g@}5K13KM)C=da`K-v<5$@HZ6vUErh*raGSi{u%tbFDNZx zrk3JLCB3fV{iZtV3Z4{vXz2Ql;|$qblwk&O@c%i^1d2u_o-gT=Y2#iw`y#wLZj9xI z^5y?}Fe!@_3y|t(Es35C^N+0`GMWDLp6Tfw8Gn#Am)Jcsy(bN%^$L^0wOs4Zm^AZE zJ5&)7fBzG^4SsR{_RYgWL}QD1V%2gbVhp$&%cB*6_q)tY+M49WLb(<;2RsMPMjd{) z?aDbzD8$$NW`VD44LSXGcmzAcVGQ#8aN>_m;odT1wxx=qK3dHsc=+#W5_{+!$dxa? zaeqLwa<0<-*sfiVbyx0L(K#%A7M}fYLm$ChqK)(y^8;bZUlAP07Y9B4t>4`q(b{#| zXngKi$>z0rN0+vD$NroJAF5G>m0kBL9g4A4;CXCA%B2P(FFv`vPeVsJR*%)cURco<)s%8`yI}v zm-5OuuxklC66ufCZ42;eEbDWaqrT1+k@lbf?tix9>vCEWa_YVVM5K=LBJd&1QsfLi zB#lgxNhzsU7_2;}lwO7%Rlbf9Mm~5s(BFy@e0vo9o<>g%wo8JPL_Q~t6CFxw5`SiF zmn9VpkHv$EAIP%<$)G#hb&j{O+Z2rUtXJufWD=4uDNL;Hg8P@08AYYzUk{*e@8_i2 z9$m`Jz)2<%DJ()Ve4tqn`k#tT?A<6Fcp{HnKJk#j>5Yj~TJ9dR&6AC;&zOUb{9IpJ z$9tLVnw#>SCpMQR`Z~StLbaKy%zse^@aE*EzW&X#gW*vB_+qW$Z%%Kh={=s6`}Zxx z{=92au-ArXl8bkSi?iABGxc)M9n5imPt@kNjJ>_t>eTU8jV+LiT=|FGOo9Dx8iCVx z=Qk!C9)oXutm(4bul#SME18x9s;5B??7tIHKm&nQ2>!^(&)nH;UgZ5&ynoGxhE_9$ zQN|)4*WO%eE?MtfPclpizMo%#3}ZyU-2{96%Z#1u^!G_!xDKIW)Rj(2*(0Z%Frkb5 zxbBpwB!bSP6oZ9!NjFMp~%y}q94dL5`ZLEn@~n_atW{iSU?#GOmo2L6=@~D z9+2Dv$T^yJO`lqe1fD99ovD$YHk ztSVN`WRjX0UOW=yWLAiX8#sZ$Xb#5NrfW&u=7^{vZb&>A=>ZfGh=1sv_1l7>n5&o= z4*ky1BF`@lSz-fK&TPw+{f6(Hj`4GY-{CZc6wkofn0a&lP%?RFo>r!wG*4yvrG4r2 z(V1QM_k?>!*Y_NFejr$D&Qw~z(CJvco-;b*Az`j$cJuMsV76kgiL=vMPN;;;SPG=# zF_*(H@CLz+a45UhVt;qT#VDPKIWx)W%-={!cm5-o7ESJ;sADZb@1N;l>neA|hbei!IEclG1k*Fe`C=6~o7h?2dBag#{8EYWiw zNgIi-XK&0 z(S{tKxT$@|mVY+3y^WnwFvtwZK&8b2W2CamBVxqzP^LXB^Adayq-mm0%DyaXY1Lr+ z5Q9rFo`e}Sd7LbnU&oiRkAh0u^aSQ#m`dvdrm`+oOT)WXv|995orv9Uy~S!@((N;i z>`FVLL9c%QXZ42H197V}Dqv=|cQ!|3vGHcbhUFaRh<}yGtEO-(h+K&V(R1Ljyv;{k z+U1LR!KLrDVH4f!*|fvUe)0VI&z?Hf`kFTpj<}rxqrt-Hy@f=i7!TTQQ6aOrD)bJG zMOv?I=Dm((P+QVxk0sbG5u~^vUw-KF{k8BHQ>1KQn9|&be2s|HV;*~bvyCTiZ4VTp zSAIs^`hQz`%Z=RH!Gi|Fh&}l|%)=Z+-y|f={UD7OC~K(7YvT&L>w{{YXp+?A>g*f` zPDWHJ3xfr!GWaCU>zK7|;H>h3&fUfWXh(Lxrn^+O$N*1%Ah$&Rpv0x+TGSRX#VNq` zfOJkSk#vWujwB9#t<4vSgAYkun>hGo$QX=7!GD}0Pj^8NN)(<@eD1bG=}qSv{OCI+ z3b(Z}3Y?M40tzNaopj?>y77!&yha^31q_e0Yf$MFN(mBYCzELxa9WEJci#v|dx6l> zST%N1`CgRoMLFRVn{qq7u`&Z-w+RV*5Z20W3A>;?52FQ}%0Tv&JpPFLE2=RP95578 z7=K5y&$_%TggRSb;K-AO8fPhIU?Z6$rdTL5QerPj)v7FbMa^|1M_IX?NOR$Yk7qQr{E`Ztgb4M|(8Uat{Jm z{#s3~%S8WI8`Vcj$q4W7$+fVx9goZwA%Bl68i`^LwA@H7@3Q$O#$@sQV2b_9bV=NCB* zGAv#Wq zV*T-4gBL9R#>m<(heM;YYFU#f5db@t@`%2OJfb~V^K~JXyAQ$T7n!}}_DPXkqzWOo zPvYzsBzUJJY=C@02(o(pGR7f93#sGN3I>Y^t~Wq5Bs%meupf}h2S7lSxnI7AlHL<0 zw|N?M$bE?JyGN;i9`FLr?+3ge*MA6q4ESTf={+Q?2HDvJ(0UEY$>@dGOP+^hS&&7t z{fZ0aprY430lA6lSx`>dyvUbdP%_cQP-js2L2B7_`|6y6$)1Bp@FGX>>=Sqq_2mgy zUyyKGu-^*!6yScqi{yE6gZ_p%JqQ@#pKTF_#C7C#;q(kvqIGv{kd3)Xn15Fj@1n9a znjrqPr=m2r0aQIWBx3}!gGs6#+S_TUZ88*PUk*r9eLRchljvWmnSJ)aKwr)26niCo zoly3g1J2CMa6{m|b_cJudJqPMNS@Y@=s2}2=qCMn=qpJ?fy5`iTp2|!;ZPRSq$;P??Lw|O#Ghv5Hd7$;9rleo?O*IYcb_cA{&haYe)$&@_hs1hy zUeG(6GaCvv%dgG}@kBPjq{S|;)nyD!uisQ~V3S>&mNg@q81zi* z+v`s6UG1`2xyqIU_ieuUV>LVrHccb;=(Pte*n(86)t#n6*AImdbAOPWv&E#?`uEaw zsxj@1CUODB>(9f3h&hN2$Z3Rv>n5YJce&7wn-}##anwV=>PKOCZ^mSa~WRN@43gR)B1V z6yDmDV`P5T8%iSho_|kW`J}%Z8uP@xNNMq2Vn?GZ&{HcozMAUqu16Ay?rLx5e6bO> zFd7K12CVOy?|8i?#7?tzqrq-&t%+jIgWu0t0+o!%&5W%+I1r9Bhh|FK22WJd{$_tK z?F>LZl|O(_C6C{{0`c#bjvn%fqV(3XZ<7TiJPHynU=}T+Tz_@}m+hYN8NQ89@+gqK zxj6_t*J7O|>$H?^AMWppV_i?%j*XA#=4E=8cYc<%C>&M^s$qnrCDm7f^*Cz%O>b80 zZT5=q`_rE8Mz@GfCb6Yy#%T#8@&Wh2=vWXQ1BU(gnSHJ`PmduVe%bCo9!|sBdn^95 z&&DASF8u3@!GE4N?|R3?nn1ZOmtYB`@|`+sk^TMLYQ3wnFU8i~U6s78Y|nL8#Vh~p z4w*t~*=kcEF%F%d}2PVxbBaIuSNboDvmbHLcmdO>J?cjP1MN)wH| zQ`B?3h8^y^_4~V-eHNXen4jqF^w_imA6wMwTd$AZ)_+LV&tX3mEpj}+$bA#k<^*p_ z!PaqW2Xv4w$#Lv51S6Bgz>X-4&W7?M64NRv7#I_Jik!=)!ExtMkFLw5E2QtXfp3uy z8A$=;pGKbBwgG=GC!d}gTA>`3&9ofmdjE^V<#jC-Ff zX|O2!gqbti;#UsDHy4VV@_(GEt1Hzyq3WQB7|3uhXG>uJ-Pq{yk4{d7 zy%8R}xQRiR4gN!3pQ~E0IsGxg#POk4hjSv+TOBmBf8<+RP8L^^tyj#+T+Wen=5lHK zn$S`_nOKh96mQh~k~0_PdqNv_-duJ0EoUy*7hKc3&rDcFVe0m6W6tROg_)t(4uA1> zM$GVLozdX&RQj7(`rsdeZlS?M9pMc{_4mkU`bpjQDN(N2^D=GL=20Z)LV7 zGSSu2fQ`1<$XJ4rsQuaGtUu|Wh%qCigTO9^oma9d{T=1^BZ{~T6Z@zH z&nUJxKU@Nd!~4;h>Kf{LZzjTdbTSV@s-mu(po`{#X_V5|MLS^l?U2~TQIy_-(!+p6 zEN1|TSWW_-1*B)(rFuq@e-C)t6DJm0YW+L6W*o0e>C`BngWw zWAwnJQiq_7DHJior;@TfsWGVyUeA9Qe=gnU&&2{(c9TU6Wdh>ty2X$X zaKNU{GVZ8Dn(CcC$Kb@U(|;QkOe~-Hy0}y-I5N4MvvvMwKV$WO@fXZGh$Jw+i-Cmy zkK-v9nYdgP@sBh8ttSWWC}-o%Mm_NQz}Z>?se_w|r%Q>8%C%VRqgYW=g09{D6E5K8LU4V2x zpqvi^Qe9$1I{}FanE^KgQtsj7O6%Zj)YNetl$MgRh0+V<6<>fZM7Pn4Rd6f$+Zqrd z8Nf@ClckK|5x7Q=qkp-G9z!ePov3?OsR3F7d4L^(ODX>Qh&z(H{!-j(;xJqLoZia3?dJ(bj!B zokp`(ngO9`d`RndPFP)51M_ozK&YFYc1(wYuUO~|8qC_>-@4DF7fr0$n~R<-cMCe5 zQKz$7-zDjJj24|g1nqE>Q1Gy=tE5GTgEow;_%j2Fg98b!;xb6=hriGSomY-3^WiRK zKK$C$sR2_Ea({99Qf09q1`3%piJs`8%+)V}-r&g!{f`-Iup#v6dgy)rk(7R?rS45D zZaN2W19dN1T}Zn_S{E%Kozt{N=SIK-fF!e$3;k)}CxM>?xr9K{7Kujbjyg(7QL?jL zN_FoVK6N^WY{P4bZxjXi(Lu?*dMw zO;FXU5H3Fq6bG9lR%_BhCKnrtyJb~%($j$12J{}W&qw(of!k*4$9IamnUX3GavukaJu<#q}ZWFP!1ZPi; z9^A0;rv9*G)j7B}8bUlPKir^XP~eIwuC4@^fT?XVK}iP+aT%hp<}4u1X>@)!Nm5d0GNSAc1|Ot0MO-ggNy@Y^du_F;(uBGJ8kiQ?476(Maug>33DJ` z47wMVCM>}i7C%~l4BJU#EsNkRh}EDip7tdt$pm27&J`Z zG~W#QG@1pCCgvYr*xqM~y1KV5j`)Um%pmDVb#TpeV9;Oo^@h*pHs!PKWGd(PhJSNG zY!(hbB~E7*BHoj^PRiHMx{P|O`NL*A;s>PVvc~L5heh85&4ZGgIL{ZG+L|OW%kBw2B_LKT29Zs3U3pe3%EgRhfR{4p&;P*!CfllkJNj|iW|eT zsnl$EV`gTo>31e9mTdQ6RH}xm41dTJ)LBOE$;(_Pcwq{1{aM8IJ>T&$=HJLd^1Q@o zQVIiFDA}& zA6Duf0ZzI>YU2cOg6hYjXMd>cCc;THCin#46S&6?{5jyywSAV`99w4QkR-syuVr?k zjchqp=D21`#ca_QQ51JC7Fk}dp-S=*gf*(sivP8k!qH+aBa11p*``{*%?!4F8+pb! zP3N(Ri38nO^#to>)?$xm+&cLxGx*i~Xm?o@OZAZgqz1+n_gJw=&VLV8^P-rq4&~$3 zLfYd=7pn1|wZrvLq;F#L$moWFu1Kh}XSS!gF_&8zXkFAn!6->DxqzrUr!knUh5^yd z{F6B<6g13c?N(4B8(g_gCI^Z&aVw~AgAV-{FNCWT3ZTBgQynkcR=g~uM?f9?+w{*-) z&gKhr3n|=(e<@q7V?Mm zSBd@=rIi9S7m%`x3nvF3?5SdXvPKUIvS z#|E3x)_)kxtS&ZlcBjohyl19pbeK3H4fFqft>=)}ihp5Txt_UteGcieK(_1;^pEOU z{UiGK^-tkrXU~SQZchf=+9V5NcCrY;pD};> zfBdVEaeqJSO5@kiKTFE>kSE78e}D7Mn`+$>wC9Mk7883-4I;RBSw;%FqvZSXoBrVe6&y4#m?ljdcVq zYr?ou{b7WwKj3cQxev&X40=}JOTd?a(=2u#_<7(D1OEtcDti&|MU>Hf^g=I5vq?P$ z;(u&ACQ#4|8HtEaX)>S{2v3sj=;)sF%7ewqKt9UM zldmov4zqxb$vs1pGqGf609lSvE8>EK4S$vZxysS17;#&*#@LlV;j5vhHRQ)WrhjV* z$J4HSer=$2k{^oYQ@w%KBk)Z_6n*`8b#i^k9?Lh9m=8F2*lyRsH?h3l=UZP66;lbJ zZ1n|VZjKuR#fOf+;;dwuW}@Q3V<7>i$6LRHO|giWS*Gt8V?TT42eGV(t#xU97=K++ zZ_^zTU1rj{Aac=S-sSd^V;O7oq@xbkf!=*(pQBvs34GmKua=$B!oG4my$}f|M$*h{ z!^e^W!WD1Zg{|-~d$CNmo(>`{A(lJX2*Gj|rJSb32LeH7)fMvl?Y|Lerqj&`#KZop zpF?h$5iCkbhOEK1do$E0Ut%_q9e+#K1a4L)fv`k~7!4p48W{;d@>5$xy|6ST>~CZD zwy~$$*u^&XE?V3yjT<7|%Ow3#!trfN&WeXSo{}g&i?tY0{;lw>CYVyBJ&*DtTHLH^ z{|GmIfCH3FLrPs&6COZ0Ns?2*Nwy>JxNX3911Fj6Dd038om6mj9->jA&VNIM--|i~ z)wzZ4dmLqt<35_}E&?a`GT_Tf*_*)MRPcAD)tWMdFuY{VFlyOF$5C5eCQWd-?LN}(0dCKZgS+(I-DTIiTOurPPeM3DM9RuFZ(XA5`+r}y) zc^!zAv27DG+lGte7dz7GVSj$_O|!=va^_OiKX z(yk#sU^gO(T+lzbI?)phj_!HG$!aFV(>J6o8ZZv7p0f)ChJiCSbJ*61vFqMh4%_U60%CTt17Ld)*m0rfi#ILZFG z%wxb|@NfpPkhI#iLt~L^ETq|Vyw^{>qnE@&cfub_bO%Wy>}55K*~+nIP8UhgjD-rA zb*U!3iVzEi_<+|>d4K;gcQvkl0r>~}F+Bx9y|s?V5Ucs|j^FF}0RzJBR&?zQ#6co- zRY9Z&F{vz`aFxJaz#Skg2MCLB4{#3#&_j5XUK)v*eWWa*@@(|k_StXISc~E|N_sbi zx1h%*;q6Y4#Q-JfQ>IQInpPig1+G4xaP{$2M}EAlqE%;}5`W6`AK<{V2(JLA^%bdc zyMR+zERDwvzzJ>yB(I{!fNui6Nx^B`lAU-TN|p-E7s4pv7o-GWDq)#49p@fn zg&fF|QQYZaEyN6i(I88A$Qee-RLIS)9gGD<8vRd0q(Kvv4Wk2-8j2w9Nzt9xhNWz( zmrVom^!IDS5`WqMrP&Xze6rH^|9kO8q%>kVak5mJ@Ip1JC2R@?uUs@AEs3r9a4`|G zhox{T;I%s5gUwL0To)e9%C2`4#RG;3WyHvmjdHV22<7GZn31Y;s z{;qH+?}xSfKcjKJwNt;j|D{ufI|^m}4VOt2SNs87!enDmfbUSbPhGfhRX!`MfO} z37QL@;Yjzup?uU=Dpw=t!?^&$(&4*dbw}K1B+DAILKzLb`KaB=Azz=xn+)=v?Y=@L zB@`XGV!=sclZC$TW8CLp!_Xu7;=6J#r$ZpWdw)TSZjhoI_%X&;34Q&64I>Jg)1a0l3wtpb}21U4x{uiN>3=IWJr+j!nmX`o+#FWGzO1JsvFtf zKpV8tL#f#!U=a@|{E%$Pl7uSN3ZYUt$d}Z0h?Tg3&SjF66?vd*a-jfa6RlHP299W5 z7Jtd`H|7!Cq(^}7bw+U`!cKKD=V-DsG3vf@7KX~OXio}}tc%rIr;a?fL2J}{Vgd}R zpl*h}_bI=1Y)deOXRKz<8fg?XTBHMFnS+-`?IF9+-P7l{*fd&~0g=YdLZBHrH(=Jgs%3|u zZBB-C4o7FBFF1HShpjzRcg^hn${{3o)@oaq2MZ=QcCpeKMCX5!Zg>c>A8)`Hj(=0Q z_;cg~4fZ5;nws{1qr_MtlB1Kt=&&$4Rs->Uqr{tSZ7iu^GTR$K%>mRLZI^Du{qrcD zN9hAfDd=Prr>aLkr?|MrK*_W!h~XBMXY;^qxSf1B2p510z^RV>TCx*e56XK`-b8sX zaN7Q$8#wV~N{U0}^cn=00BJQr*MHXmr~EaW=^dn>MmgbQ*KumjO^G#OY$a9=XEbSv z0Ge`LOCZ8=GM{eJ3R~vQtRSlTC{U(MpXBF;3|izx{r@CcFj|l;Q8V+2?|f$h76r02 zvEs(=?$sa>114uCxQeqLEiytKylHO@vi8z_hnIKV_EJ~n<=fr{8F5T5?SIf(wR#OR zvSYGa6sr^4$25UZe%RrPTdY=t*H#^~xZR@FF1np2Tg2{6XR`ty3Wc4u6T@baAAO+D z?h~xs|8|e3Qi-u3bNP)QS>oxG&6dk1jgSvmVOqG=E4MC)OzIWoZpd ziEU)fB~dA9FlDNwye5eblT1525`rnyCJ}<7N=ejVu$I_Udv8Z>_{z_JY4P~OLbn^) zz3dCSn^7ww;I&f-=CMb+GuVVY(|`vq?C5a4>YP8!tTNixe=_~fa3to=`wF?dm%gkm z9{y!?II+He|ITd{n}16in_JmGRM@z6ucQpbmntFd^DCSa!3#$_Zly7QTuHz;0#;27 zyGKdHXOd(%SuWGz>zVKq?etUeDXy2>dQk3$a1%m1I{a)ob@w1@k`jCbSJkD;ap1Ek zC-pPoM}SkSx6v2gfkHdJa7yu6?Nw}y#}r#PMU1INP%UnxgnuUjZq@-Oe=fp}(rehI zeGg^7Z}l~1a8-T{atKjtq)@sQ_ix4h4dC=bM@Va+N?yE_u}<>WO0>l9_&QW}jF zMtGmq!Xr>nhe_{uk;|6}ELKW$2|RCj^F&V=zPe(edw+b-L)$msk=A4*t}t&m!86dH zgR2E|;g|2fkIAEkIpy=52@7e-BTHuFetg(CJ}kj9AdSYR0;kC{uNzz ziJu7SFsdCAK`r7I8oY5BTpI1tGD>Nxq2>EDT?L#WNkX3cue1MU(l+>pfd9h7O5IYD z;=r*76@Ll4w18DtkFo}bsWCquxU_|}S(4j!Z%<9^nyfgD4m0o5I{R+fz4L*do(FbL z+_raPI=yl4Z4=h)nqhssXFO${yW`-NY;p;uyO*42&Xb4@jSL03WJb`Cxsh zKY}Zy_mJyPq3&Y4E`8Kxl&mNv=r5AmDAdWTu` zL|ZQ8{Pz6(AZxYMhGOOi8ix~nad=~Ma@Saqk8G}9`C5G@ghf6gXyZJB_MGJjzaOid zwQ;>Ry|HA94pbSdE!XAKr{@zohquPbUt#U;}IRIN0Nm+o)5i8>cWfH5%k# zTe?N0U63ts)O$)QxGZE`e8O%|39Ua4CftbQ%{q0Q-et#oCwU=;?R9xfHt72R_MQI@ zS3svf%XE>yBUwNxsB2JyJ0(M+Jj!U}FFigtd}bBzH5z+Pbi^Q_h#n8)3T2Ft>whOv z7Yk>lE{#vxl@rO4loGmY3U^PT(`WHK$}BUg?f5f1@~1f1?MUim1meSy!_kLh7RP2B z2XUOm@d%EKINreVWgNeU!@3=`g|=@&+qa>u@EbuOmF z0yK>f9bT_wAVoO+09s`bJO+4-EPo@iY*xFTQdE8bNK)L5lp^gR3vPjnlG>Lxs*|>o zl{HqJ9^T!O4}!Ynz*y}e$qwf|Gu}O_~ zM620!NCfX@tX8Z48EAGvpUfM40x2u3wz#wPqiEKPG#4?qp0NbQpNd77)9-R-JfGDX zbVx@E52$<79F{3ItVBv{2YVPuW+- zMoe96r^eGpo5ig2_fIa@y#;5{g(05mo(7F`@B?_2`!eD(!$=&shhZ)wO(}xnK;;@~ zaeyftU77=RkAQ|Ppfw82mDvpC)~TWPxKu**D9(7QU585KG?Ho^Vt-DXQD=*C7e!{u z*TCZ_8B-015eKad0vLhxA{8`9QV5HiJ3hdHYZef{ywwJYjx-}t)2g&Fpk^A$q>`KYx8mzg^>x3R>105PpI@ zT-mtUPmB;O3AVHE!gfYEMjvEOQz}uJ6CRLK4aiw*i35@_Xu&l~$03)JfKE)o2kMEU zF?rvjAWCTKGzc9^U8+OzkJ#QyN#+5AmV%Mu^MKUi9BQpct(A7k0hCa3o4b{^K}WQR zAh$XT4icOxqkq$S#SEb?vgf3|j_|^`ozyh+_#j|E;1nRS-4NTLvwA(}!ru1w%(*hZ~ zt|vS&NJ+i|ypi&-1s51&I@9P$VbzPvTAWg99#zxJWzVq0`~M!r`0*v%*+H#v0W=n!;;9A-2GEx>jhiD zUO6~3eKMCnF$1^asL#R~bjCIJ=JV(0$M%%$iBcmzab|)S&FfBeR-W5oObLgcYP~m^DU(WB_i8{~;+ViJ|^0whGE4k&{*tLYuED z9!c#;My7}P8FmDU+mh~7J%)@jMqT#Mtw)OnpWbSSF3^KOyT z&LVx&!?n3kXs$*Cov;Zyvm-m`^9^RB{ePm>KbkPd2fH*zX9C9G^q3FHc2g?__KrW@ z{@j^8C97Qicw%Ae;Ze(#ZjWFX!V~39b@;fk73V(NX8uHTVL|WoH_>4d0H5l9E?*)+kbsw z-V_(eSAOK`$GO+JF)+RyZ2iZXNpkn>Rc310WjFz1rHN95u4d4U42WP2aN5CjPMWKBB z6&v&tYw!{aXpNOxS!%bpyNw-aV@DMXlnOrtvcr(n3B?d?rg1|mg@j^EhoQvPCE+qPLJx36`XnQDERwa1$!b0nDTPK($_8EaFcw|}yJqQ1}_ zgBg)y$1ghkfw(W}ONB$uE5F=7Ft8tDYeJF$R(pF_qhl#ntBcHLL6}vB)tQa?YQT_R zN+MZ(byJbu{5SQfTXt`)+FjaUPjfgKo;q~tguEC+hRs;yd$HlfI%cB)qpMI9!l97s zHO4S%U{>yIO9Zb-1)nv0?SI$}$RyfYKcwZ6#^U68Gqybxg(hEoKO~{goGpz2qYP; zKv)Qkg|T75YmBk5g$=v>{5gNX+W0fJe|Wvt)Av7>X0)&tyg8?D-G923&OP_s6QO%} znQP+H4=5gJ%%9OFRTA8e$d<{ivN~xmx)FVnhEFP#Okopjhfky}Y9+%veOM2ul}N>- z9*N@f7Sz7fr;3)E+(L4wGR{^U>%%xC8IUS!6mSx75+t}6_)g$EK~jr2W2ZPiwH`n# zB_JR!dk{D&uZ{xJD1T&kp}$W7((!8m=_+Rc>D=py!b$N)(L)rSxPsx2$X=ypIqK*- zNKf?eCvbu!#Y#AfK`0kLwNt4aE&e7w8(omLk52iR54ca9L4#sd4aqaKfL6-(U&H9v ziIh)X7>gp-l-s0-ps78HdohcTOrvi_%TBeW7cIvy+I4`WlYgW8p$9z;cm^6Cmq`Dr z>_Jk4D)f2+Nq)CLm$H(Od5UA0Q^CB%>a!%Ih0&`L2Y2tuznlDwSn_Rn{8 zckhr`Gd6BU{X$t7$n-W?Q~$6jHi$?@oz;@-3YroFe#Y+JG{@fi?6d91#-W<$gyTC% zy(1*t7Nf;vY=17)BL@76 zinYHYM4Z@xxj^>@z0S!q9%sTPWbE$f;?Ez-FPE9GM26j3O<|~(cF@osvmxR<1B4X@ z!|gq##nNo$=Zyd7KmR$+6N+%>SRy4F^63 z(fzN^jU+x~Nu_`4BT3TIj35VS2@~}PtI!{;D*A&}=nq!0psa#aRv{RyLVvId{lO~q z0;|v;tU`aV3jM(<^arcZAFM)uKsvD1jzc1e&0=H;+oobSso0$=_Na`ZUIOm!1)483 zSICu)Tz^c>Xe46+%?m9cj|U1OS*uiRs-$9FD%Mc39u*rljHiHf^J+TB4taTTK{0bA8TC_6{^=OEq~>C@>T6cwU3 z8ug?Fhg{_3J)|6%4$(*|h|3Az+UV}yFlgP#QGW@=MWXKY_J*28Qf+aGE}t>l*Jw47vz%>k!5lB>tzwdJt(toCIPGzx<}=+eaFrfr-RhHNBc(j#ynQp+Ws z4O=LlX@4saw^=>TnBNeHI_y|j%$cbKWGADqzfkojA`uT;Fpe5G_WH=%j5HSyYN>9@ z*MGucvmM>+g0=mAFbPGR5QZ4#bN$j9_X<#GL>)i&VEyvXQmM8pV&j66T|}a96qL%?gEL*%QpU9mpfyn`TaKBq_!n6VYRC&!!fN zZl{fLPM#fzWP2L@1#y1)VUzkJu7UZr4}Zk_S>|D~c%BmHl~gE9nmHWEivzjoL2er0 zidQEou&9mH-2@|m5%i;(L{bvLD&XCK$3dQVV0GFFhwD2;!rB96nB>8Bh^{HJ*W>7U zEr|GfwA?MW(76}Ta-V#jG}^;xc}nd=XHk^TC*_vQ9WTll<_r0k-6(Q;Y3n^MXMgvj ztRloXNDo2}V!#br0ZCg&Z8qR!!wmu_F^_CE^e|QVIO&SXh-W~16L?d``+*-s8|hZ4 z*vyTFGmh=NjYts7>%HANzh8C$y`5$DiI00O=r_-$4;b@C&yZAW0-#Rv9;Ep^I4(z@Q#^V zyS$}ZGd6MOlGCM&%+5}QDtB*2cD3OL7wU_zZm+lh!jj14+wl2mc-HzWm+!n4ZGo`=tPz4Yy zVST46skC2_Fi9^-50JyaV}P_(Uj$qS+zUuIa|G}Ru5(m9|G0{sSFu}h6)At`9ctU% zavQ8Rh$E15agw1F6Mq0x;)<+KnY`U@y$85uO zl=TmeK8^M_ZW}q6Va?|J=+JO(^ELr_VT@3rS7YIZzk7A0)0Me+bb4o;;xotF-XCCH=zt|wud{e;yw7H~BSuaOt^8L>2praGUe#zlx$tX=W^#Ns-4pp@ z3+u_Nm^G-^g#{>y88D{NuALU3+^4nelGvd6Vl)vC*@CY2UnENbtJV|oY8iVx{4-n9 z>kc@B8FAgIB7axsJJ|o|vHdvO@e1=N#NVa3btO}0SS)-Yx&9sl?cRx>8K0X(9|t}? z71#CP9I3c&7%h@zNNJ%yUFhEpNFw}*+IJILXajsF;C{ekfK);AEPC80GU)rzatm4> z#G-ho+VVJB0AE0$zn)e5&{;2{#miC-Z60s^UX* z27?pr+vRXUWNX9U(t092C_P}Ij6}>50wZ-L!B*OnZ-KgT6q!_=`@>+QH>ZSA{ z#TPD(^^IgsW&OG`=h#}HS;(U_(d6J9k2Iri(XvsFB_cZgI1-U=88F8OYOKkTsrrqF z=k}&jd*`UfNAr%>7Ds!7k;c$+tG+rl5D8Yg$Exi^g(-i(f2u$$S56c_T@k-vwF>@- z%UcjQogq~B8{@-G)@aK?2o3cowRY#mbT~Vd%p`|1Z)#9oQxi@55a{YdO3}Lb_y0_m z{6^Sz4V*0=`eWv-oM#ldM}11}(G9unUJCa|3IJ@WLf-2@o}5C|-%j~yab!dNehSeJUVp<+EMHZEh*X!PjoxSJgq zc{hLX-MFg*xC?S^qOwEMb)>mX${2Ejy-^+O0Tp{f#$;OwynAukD#OCC7TTI%lCCFvR-=9nY^#Vf^7t zVXzF(HH+P$H``n~e`ThLc%isU=Lq|HPxU(dPKy@V*KL7VE|?kUAI|sYv|4Y*iUhwp z>m-(1t-IV9%U344^AtbCX{Or0&$JMTs@04cn3>~{^f=Vt3fx7@9+W4{JABIJNZEga znfCjkv|#in9XbxGzkhZm?asI>6lXdNZo4BWcrAL~ZsxQej?vkX?j6Z~xrWVU(X(0x z%0gcu?sjLY0Worl<&xQV5d=s%(VYeg4YZAf8&1ZA?37X#1r2Mm^KSe97CJ+ne|Y1K zrR%OEy-6K*$G0$NDLdZn9Z#`(a_4`iY^;}|M!6)yM?j|ZcL&;~a!2O3f>y! zR*Hy~j$cORY^CQO^c=w~--$K2f|ZrDfm9Mv=?MqNj*p{F@~9(A_7aXsJ{)xJR$OH# zAkA3P9a7sd^tw*%MT^&sXgM#pTt=ECX#|ovmHT)Ey`G_2N$c4?_>l#ZoHKv!mt&cv z87a*b>CvRwsBB^%!vOQ|;fM3cOmBp>Q!>-joOR;}K}mxsjS@l|)q{&7QTUSh*a;P@ zs92|pb<3D^b`xjQqiw>=qib)&-y|;ZFb;wh3qn5XDfv*2E6@yCVL`CkvsJ&Lzf0$^7pG&)+m=LdC=j>TW_xn>f%aTq z>{ezAgxeuqWp~xB;VfoTHUQNM+}b#9`KGG3JK_krQ-h)Ms9#80td*3%?3vwHoQ~Tv zLjKgukI8k4a_cZlhrNHKcd_%DK>Q%XX~9dFZfdgx!e5@VkE+ z4+~MJJz!&I0?k+?Gn~iPlzrpeEpKrg*4`9yEq{~i0%k>Jr4t>muw{xjk`mf5VD&VE z^*Bth1;YYC9_@@c`-ph^LDmA!=oecUv>XNTDN6CM+?UeONqv7P1HOXQFk(w2@=kSx z7Dk{wXE#W7RP8y1o^%D8=~^)wN?LzU;#zm%4z@uyzDqp5OC9MXMmmc*egj(W74Pm| zwA_lZ?*e=P@Bxr7wLOMjpHO?zc`u;lMYVqtJ^`#v8?1yU>&FRi>rk+lWsK~}G}r5*J8+#$YuK-%0VX+`-4rH#Ra}3fUf$t~(-|RJQf@!!jTG-N zW%83x@zshb3X4<(1*tB;)rP%~Y^V8c9F!JtQC<)6x-2Mw^F%sXgh&tBo@0(2y z!I>KAP8)4$hYcyw{O+mUBL)86;l(h58%rKO-n(ld)EZvwa(S(_g~6J~UY$8Kp*LH3 z%lMInZpVM7UCl6W69k`~`G?AQFgRX;DKIO_;jy~MQ;+#NgIK`*&9E^x*v*)og-)M7 zJ{Zth?UngB^XGq`xM3|gG12Q_E(Lm$EOrjDJ21Fi>z`U)Nm{@c92yQwIb`QAqk3j< z=&SIH9mj((NS2#He(6B4IXGR+j}HwbtPZPL@2!8f#*1Jp+&E5Q-w|pJQ4O_rP_-T2 zPnB%p(DWrs(7}i8W}mJ7ek6;;(n3hku(q)9OFm|I`CSNCz``J|?XP2PFF<%5h9LYj z^S?-gB&k;>;GjyRe!pCf{;Zr>;ts6QB#6>7(*a_lxPuAcME+#!jsVwSrkX*9HjE|t z*HVA07dDzV{_{Hcc5kady<-n zaB1n2?&%QP58O)6}>bt@I=`EglAZ0FXEZ;g17<9QYC7PXVV< zK0y+K7>$Di75qMiA;&SB=v8f%HBd^nuv>q`S4IBa2gT#3Ab8NLBTI{b0qH>_fD~L5 z#j#W3+)K!qq^=;I(23(M2uGBum0re(oD+UPZj*}EOo*>V>IJ(bUh;AEIBjEY!PST% zQZg52 z_Covbm_Yj(w$`%8g>*G&qSZ8fZpV)EAxs-nq&iyq;oD#sh#+uqcI(i!>GZWjb8AT5 z2^XdI-}Tdm)*Q|@lI**8cqkpKX4`*$pW-h15F~Us?7iqrIc;eh(uuae8BBVNOfc%z zu?9EKu%0ZRPVq_C>rXO0*Z=-On@w9ebn@It?=`#UJjmy$8STyt1u%=5+cI?zE$$A3 zK2XtW$Ft`Z2DpZvgTS|8rtDBhL@`SFdPi04go>S( zG3iXnoTT)>N$qtTUXfM2tD7-CF_AX`KTj5Wl9I7f%G56^ti(l8@~HZCGOj8wEAtWk z)x}j7ut}(<4K#*Ty8}m0{E5!Z)>TU~rx<shI+@=t@Jvr4UdKq(*;;AGX@K*RK_N zLZKFEfQ5vkn$vQbn%`f`2vt98Fb4V}mUv%Pl7PdlfX?nH%*2^meVZ?Icz{RAz?9w2 z*e!zV)#0-d?@Y;APhWE|=**uSZa#gSbMsps>8Co?0v&Y=n?i!|t>+tZv?Bn7)w7Ke&*YpX_rd z&$CsSWTv&6rGuip9M=RAdm%2PXP!tp07J zl1Y0ka5_WigT^yosD7M{->q@aR52F9mwEEH9C%fjI_)&QD z0A?J`|9fOXLE!`2VF#ww?&^8(e~(i15aY^;k%DxK3RcEAbSZKpQrem-)+=L@^Ur3C zvky14ibp!H9=QiCw89a52ruVR;E!Gv10l~rQNZj{of?0ya@mDa`D(|pW=qYgri!bW zUNoKM1xyKYNK3)3B;AUWFd|oyW~4A!d4tM*voaqD%vWe;r9?q;sx0&-gLNO{3=Cp1 z>jxPd4Y{(QOAhv>n2EB6sao2rq(5n0!;BIQD`e7vI!7_A;GkBSb>eJ;+E{^NsR_hoV)?>VuWUdi zF9urwxP9TXGldc8Tfv1{CVb8O=Hn5t=k_J0+Wvm~4{PJG=tRw+^@e>RtckGR$j8IOA)$?sA0$C#twZ zGt`RT30N$=-Dc9*e4bzOnE)U3 zI5TdlDbI@aTsW-=uF+}+r~=BTk&RC0j(HfJ(Q0r{)=sQi9EQ-y!ba0zvgue~v^C)p z=U^TAGv2}+hIx zKvob?636C6vdM#NB+{cjp3*vwR+@G5fK!0vGEcZ-P}~Y!5!nb=c6hsh9|93x#63{N z(`Bfnx5_!`pU1JgKs)oLfhNB0H4Q^7jTcg;;a3XdLM77*jp+Fk6C~D6a1Fk20JaB zN3&w-QL)?$*Uw0bAt_x6rZgp?gOn-ja}n4o1t&{$8^)Sn%?l*R2}|n@Rce(N-zzrT zmY2NwurB`^_oJ)_@nBbWt|FJZ;xgE5v5l8szA&Lf0y=xS*&o^I3<(}HAF^0bZo%q_ z`Ic6EI&*BG(_$|m==Faq-D6P)!V&}dmQxH#_w{zwr~TkDthYN;ACJUF>(j16tQaZ! zcCX%9>3(|u{-?V;AKY$D3nRI9Ct@E1<0TRRq_DD7#qY1AYE}3I20Q)6NKchDnUh7q z;BUlGM{;(u_ul{b;BU(F0<)Ux@xltrAXj5ru-Os1jsOLBG6a7WRM$}ZCSTNT!Jt^v z4TzzAZ5p4z8 zuG9FM{!sJ(l{UJ}mh-B1=|#EeOX0W!k-N}8|Hzl{B2qHR>o}v=^^f)#4886^n$~qg zM;Q9%?{MAVDO7)FoAzyM*b#o8+d(r<%5Kca>8kpn-lXZ_$B6_t%dtEyigCkqA?Z~y zvsi(fK(3+~3Y=`gltqjBkcP=C6gWmA80I68nU#(J5|bhPZs2zVr@MU!IB}te0f_-U0h~M)U%=UKh*zc2 zKaZnd0Q@rGm*p$IgI?cId(nBnhnD{)w_NV{1N9g^{htt*JAzYRz#}clj%9A>qm=90jg?Lc*0#xBy)FgoI0<5FZRUxwCDDy7L9`rBcgD zw4D1$3n>oi$VI@5xGz!|-U|Fy8NUN(+^wELM<0K~(Z_I<&Uzd;sTQ9D{t9sVByRw| zfj9m|dXpkqd|5u9KAvWn3kIy5*i=ei$memY^8VMQiI?|7V5@S@UB!e)+CbVVse<3tt~yu=uH-0C8~~Jf z1ss25%Xi=1^t1|veq`f>aO3GO6dF`q=O1ppwbzUG9s%tzZ!tnoq0kh-(71f^7ThI zaFKk_!69qV`oq=q;SZiJBW+=;49k7m;?{pzOonu)-`|-Iz)e&e>5rKs%@S+2#q)w8 z&=cj{w#rP5`K$dEL`kx)ZojwBforpTkKk+Fdn!jbTFpTerlKBvT@VJCbH{6ld|)H9 zsV*l(Q_k6yN_DqyNwkV_3s@=b)ykhPEPI?QrBA1a2m0cCz+lRBkECGLYq45im(_pB zu||{DV~8*sF@5zeXh9HtvE!7R(rDRC2D|kcjbY4j?ZB?f#ftC z`vh%=CulD`w8cTC32dk)U^^_flKuAy?5+n6tszMO+tK;qGu&6WerQL|c6>-CNhzy% z29ABikXO)5AHa;4Wyedii~jS-9TnRI*77-ZAP%T8R~ zIBNypdYgLeu!^0Lv05huNQ31lzCLVMKhuzMq$s&qc`7N!OVX$8kqdvCfrKcDqKX0s zv~q=puJTi$p6LH=%KTuq`rKY<;?3@0DtN=`;&Kuphvjgl5)2J z!DykZb6{u3o7@53?hAi1QCH3i?)LX6{{?{mwO?Yn_V0Kz$(U1sKhGoH)lP?%oqz8( z12T{y|D!E4-LC_4<8J-Nh`(ISd(8n~pjxf?hYojnLVS4lY}fgP@a);b$ScP%)j?0m z4?oR)i_1eUyM-B~6ma9>haH5ei9WCvf71shzi|cgs#s0M`p|!0B7_Zmx*<&YY55qk zOrYf;KKns@_9JNB5P1l-o<{2+;6J`1Hl*4?UY50AtVHx zrqCEk2@z0B8Vrguj}c8NSf7kZw?Q%hU3eUD9M_r#uE+v}ub`daDj-?@sqY$avKj0E zz8g4s#2rz`zd?V-u)xJgvo8v?((; z#cfmm6(oX?!($ul9#_U0iG`}^fZiST*fhM!Zqi%y@0KQcYcZ?`kqRphxP8Xk=W{1! z%mHE3`9ikt7}VvG*@EGNSA|SG;>g}SDz_8)6Y7xu4OMIa*{L*pDw#WJ=zwv+{DhlicHJOn>+>_4aeHu>88u}Z^o_BvR<+W%$ zNi4GncPM|YTs*P2)9%z(wjI1>6Kr4M4`1T`fE&cF^c2GM9)xeg=R1Cv6vxt5I*gAa zdQ*~4`m^{^g!8koa9&MC2GGT4MfwQKn4~19fYz*ftgK>n6&qHu85P^FVz-(`-l@u_>&xC+?^L-m-BS^M;;u$Z;ii|Z3B3b79;-#uedy%*S@mXY`v*PBA7AgHfLONGt6GKaaDY$4IZ> z=&S14Z>s)}@4}b!G298bFl~e>r?VNqCHyG+¯u5jah9q)?s>KzopqWPu6x=o&o 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
      <7`5 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 O$qPZHp%GV*K>dGFm#Y#0 delta 279276 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

      2r4#BBU-!f*wI&0-w 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 From 49807891e306c8a390382dac8c11e01cec497169 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 22:20:46 +0800 Subject: [PATCH 172/175] docs --- webmagic manual.md | 9 +++++---- ...7\347\224\250\346\226\207\346\241\243.pdf" | Bin 444139 -> 444164 bytes 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/webmagic manual.md b/webmagic manual.md index cecc25a88..3bf1ea5e7 100644 --- a/webmagic manual.md +++ b/webmagic manual.md @@ -331,20 +331,21 @@ webmagic-extension包括注解模块。为什么会有注解方式? * #### ExtractBy - * ##### 用于字段 + * #### 用于字段 "ExtractBy"可用于类以及字段。用于字段时,定义了字段抽取的规则。抽取的规则默认使用[**XPath**](http://www.w3school.com.cn/xpath/),也可以选择使用CSS Selector、正则表达式(通过设置type)。 ExtractBy还有几个扩展属性。**multi**表示是否抽取列表,当然,设置为multi时,你需要一个List字段去容纳它。**notnull**则表示,此字段不允许为null,若为null则放弃整个对象。 - * ##### 用于类 + * #### 用于类 + "ExtractBy"用于类时,则限定了字段抽取的区域。用于类时仍支持multi,multi则表示一个页面可以抽取到多个对象。 - * ##### ExtractByRaw & ExtractByUrl + * #### ExtractByRaw & ExtractByUrl 在类使用"ExtractBy"修饰后,字段的"ExtractBy"使用的是其抽取的结果,如果仍然想要抽取原HTML,可以使用"ExtractByRaw"。与此类似的还有"ExtractByUrl",表示从URL中抽取信息。ExtractByUrl只支持正则表达式。 - * ##### ExtractBy2 ExtractBy3 + * #### ExtractBy2 ExtractBy3 "ExtractBy"、"ExtractByRaw"支持链式抽取,通过增加注解"ExtractBy2"、"ExtractBy3"实现。 diff --git "a/webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" "b/webmagic-0.2.0\344\275\277\347\224\250\346\226\207\346\241\243.pdf" index 543884e563a7dcc00eef19c9b95ef3b11f83506f..a38a009110de80f11e9b695c6122e62dadf0e063 100644 GIT binary patch delta 261978 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

    • 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%0At@s$c{PrSo*LYrcROZFP(-1k`I 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μ16d7(j(2DQH&hcQ+E6gO7FghiEuJfXU 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ˆ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 ThWcb5#KVKiz#yq8h5Ek$<_>L% delta 262033 zcma%gV|ZuH)8-@-Of<2biEU$I+qP}zOl;#9+qN^YZQGM%Vr!r0ec!!y|6lgnFReOv z-&K9O&*`cPiordL#;v`EK~Pa)p=TswVkBZDQi4qsWX6PK5N9P~0?jglqctGZO#eA@E6iol9!TH~_sHm|0(_vxy zZ?6Bt`d^CG@quGCTuRKrfKV>MNdHIMe+JP4Ka^TNl)!w${^er$m!@TG9gG3>KdD(|I=(x-a6R-WjAWe?FZN&g#W-HgHAud;94jVz)zw76a1fRhSnm74i3Q4{C`;U zA8XixNDK~u14K6p6Z|T>Stte&VF=5jGx_1}0T`vPj0s|{k-8;Yt}{>Dk35~>2}2K4 z7Vv0(Sm_B8+3W7~ysz2s16wQkfkiG3Pbs_^%Ix1qSawP(QYf zy?vK+Di`*|z-WV0*N!DP3jxi}!=i zbkO(9ofg~FolM;3Zu9NGkNHQOQ+_6Zd568;$HOkvxKy(@=LTbCm|{+GHt=>-`~toH z*`xQDuWLTUrF8zaVezA{y?vHBJ3n8!Ghz4Jw1@YBRbxP;-074gee%)8E)gwe1kWn| zb6j=_z;(Ko$5Re=#!WxbGkEtqDb>0|FH%p7iJ-gU;d9IFrHAjdr>mT^Wj|!9c_Y^N zx8m?px}Y;8&d+ss+AOehw)VpW^-gvnE=%~-OB-V{){{{Zy#@`TG9u$sUiU|D)sZKA z0kcs*5AS|*PpOhWP~I%oYw0`{d7y}lH5|hmK*v>mijD1i`3gSG?@4EMMYYwwpv>#B zy)->aIG8Lrb4g1HMVrgQq^!xPEn1tA$`wB52G&%}Q3*SHP1ekHIS&ECqo=y)*!W4&d_ZFnnvfA%VHLoO1{t4&)F>585B zZ1|H_rD(0Itu4e%!q#eeMdA|A8m4Bd$g#>B3=!A6kMsAA%v8x`60h#2Q;~$}FC7+r zBX438xUkw^5P6kJ8?ejwefQ9gHeT|dfLT~vG_{-qxcz0K1rYrOOykP$zQ4P=7mQ4& zs?n{4^JhxgWL>;nqk=_NCu*hI9LpsevcN&cz4TL?0p3;e1$B<;5n+5#kFS1t$DCG@VhyvD(``oc9eb<0BRCkt=5k6 zN=S7FTk4P0b7VH4k1vq>BY4dP;=3(#--921puCfYFa8A|ZiABF6`_OpgA%a+Wy{wz zlA)J{OXlEigH0mZ*p4HZ{z_cpsypGHQZ7uL{9(BIHaJZ6#*gXl8G^#bMee<5P4WHE zhDA40Nb2A@?;}8&RwQq&066>d8(L&?rt_e`)URF_E*WibN_zPw?FE&W9ad32Utdu& zPq0ihSD`kaFd`TSVfL)R?5B$oU;4bm+4}R2Z(D*xyXl2A0mLIO=taUffFojJ(4!}O zjmj%@eC4})o=A{z<~Op>RFV;2_{xu{o%(ON^mm9TuCl~CIXzEg*MNve{k=}Nq@mb7 ztG0GUdwnE6Xyl_P;P`AHT!-b=KD|wfP6hX%CP|i5&_sbWbhwu;f)wUgb&+d&UtnLi zgQta$E34V~`XdZF9>iaBEKbt_2nPX*zx+fa@R}2lsVyUhUFyl50#Dp%}jfY)-1CM}`C&4N;nSH0Gn7pBJ+^BQh2N5w?eQHDB% zTr9_Vw^mKJyF`p%%uJhd+I+*bltK5i9jYWX6fU=RdrEco0H`Ipa3ILa5jnMT2lJ{N zj0q|la>dcq;5HaKP5Q;T*{A|0za&jRkI%_$f_ zJKDF7L#P40TOHP&HXF+1A;;e#Yl?yfb^Y@&#TF`AbCyu4$nSZQSL#DpBqu6MKiHPJ9T_V-DJ7d^ z@J!^|L=P?f@Bz6LMZIY13j}H9STDLgF#OCDSJEfki zWo}CI58z(J*W0DkIkNxP57~FTGIl{hiTZPwOQ#pU;4S1$Y(AW)YxbmcuLj+IUfrJ< zGpb23tjX0{I;LMeZI*Y0EI6-(LwWsj`O$|nij!NphkcQ!JG)vdptBH>OgIN<{{k>dh8*Lt# ztN@>E2kjy(?b9wI6Ux}aZUU1EIWx3E1ts$e#cW52G1UzBiI25ZZVTmHQk*|MCmb(! zp;Olh6e0tJ=>kD0J*7WeYCt~hmO(N7^pV|t%jEgH4*=dFtPPgYV*O1ykKNaB0_>GFGg}cQAA_r})YS!8 zOH@n4o!b0b`*CFl7~a3_n?CLjB6@0Nzg z@9Kz!e54();^CMqn5UzfQrHGG-X7rj9K-8a3U4D&WiyU-A;| z%y=t@*l(8_AYe?{%${7)WZ_+csWPciib+pLR|;{g7ALvwGo0NpLdUbi`=ccTG0QR| z3yNc<)WFDj+QN#o4>L6+^BP4I-ISv(FxTL$3=&{Sz4WKpC3-3zGj9i9wpgFh`)#yd zw5o6W_5n%# zQtENcA67f*N-5#HIUvI*4t~0RtI&Y^wmJ!yas#gFvM%+aysxyTCE}}v=l~-gr@!B0Y2IMS>oe%- zqC1Z>B*a9~FziUHmWj)X_p44wGOt~V_YA5L-@75wz+tFgk+Vk5TqER}A~m-mE!DYP zcT%w@KgrWWx5V6=y_`5npzz-H{O6aqzj+t1rgkRIE>5O~AgeA&SgikY2JMZkU|E<-R-*Zcf@^Dpr2gSam{WU%$ETG|pcq%PHZliMtOV zIQK2^pEDv_>f_pHSdAYs^;!f z-pFAlV>EjFh=eWq;m)eu^|oHMbIt%fCc21Tz&q+ma3GM`{or%NG0Dd@{2II?p)wVw z^)xi?a}dwRCEp++RsE375qHTd_G6AJu&a1;{+n|+)Edo{QQCehX4L=|1bJR#qqnG& z6JB|aX||YDT1nl=567Uc;^aceJsfY@j*|Ga5YqdAcFU%Eocy_LF2=)T>m3|G^%N&_ zR=;%!bLcDt&dxB7_3r%*ee7zU6!oN15w5pz2ksloL1Sil;a0+QxTWuX?%o z$f4stqzcRX_UPqyl97Mmy?=#2hEPr2=AH0i*;V1wXQpMk>id*wq;v1ujZTQbGDobj zZzPL=&f*25jzBYF>?L6{q1ra!>*e$I77AkM_IuabzI>7AaJTj4;P-pn{WGZQisKn- zq?vH6>zdiwaZTgx3$%1>$JnpO?oU7VxB7bDdTwlOK&I>Sc9f1d$IRc5OYJT`d>C)q zuWv?L?o7LP)D-fR(Ev1DQoGuvj@3j)_OX+2=C-=Z5C8%`8Ct`MJK${Sj<2 z)$#P%w7SU%R$DmYqLsuCV=s?ZqffK5?i{0-8Fxqy$}kkz;gf`V!rgn54`6T3wH`lN zrTTN1w}S!E>1HSQz8$UC3q>$v^)*#v8c#sZdFz;KecrTIB`OF$3M3wEP^DyL42fjc zuU*}AVu~T=it>ckrvSX|48Zm%OYI-O4(usiPWLq^$zBxJ2TPg_uIq6&DE3KljilV# z9rPdaLf<}e#`~mBl?TK>$2*rbUUb!MuE3q)VVdz@hJWc^D9^nbocDj-^UbKTVPOeHfE@6J7lwn9D6imXsYNy-jKibP{C$Uq`~p%XORlIO@wo%s8SIQOptUE zhyYKc88gjJNT9!$GKYjm= zuENLjgjm~~G0-1;L_#F1gHV)W2Qu#PbCEOC{CQ>4 zl8~I}K#91w^d0S|X@@20Oe3!A@NjkD4hOM3jsfqtYNVT=BMxncx#{$!e2sWvH=o%* ztVGZZ(+xBdnH!+dpVy9@NWVb^;&~I^e=}v+=9vL<9`tHd72PfdKNRdtEAXnz8Gj0W zM;!U`V9qOzLti>=I0KGWJNoqj?C#4p7*Wkt&SO3y8V9aCNtxVIRM5MtkgNoAp9CKQQSPw6{f>3h7|YCYgtD_=t*6X-&zA>9>{Su0)+|ifxF9Kk zH*gC09M8{2b-f#egcVpT8(X`#4ku#|L*mqgpj zApsJOE~UjmyoNh{h>mJWNL|sf#HDf!C@iDSu)G1qD^vz;v1AJ#$2A&CO#>&>D&XE)QBU0V|RLYl0D zMLOUWpPpo1p$+Uq`I(rUf;csMj4zATBFT&HT;!7qP zl7xNF*Ca5%a!83X1OI`sXF&|PVAM@&Fh!I-e~@{1QT-|}UM#x{6VE&pY>MMFBsx8J z6Wrul5D*XX9kx>b-7mo@fwT=^G9?4c@W*w4-U#rRoHc}hBu3>Xi-r&$r@vu+)L9E4 z;ZbfCE0!_U?>p|hdo;G9|KQLiG{xT}OS`O37(2Qyd-9VxDGq^D_QY(XE|hE2kMg-b zGKQKck+k-}LAoV%l~RowzU@nyFC_xB2r0^6%jm`G z@qGCj!Sb~hQ>SL@^Jcybt0}26z@!WH1cBim%VkATUTrVk^dT2316LGFWUJRSG!=m& zom&R9uXu+cnyjICoy=NjAj3*RXmOh3hH(L*(*hh?$UbEDVO_?s}v8+}njKBsu1n6h0^y)1dN@ z@RQhxW*5wb>5GL;seU3e3_Ze@D~^v7_?DZN^rC`rP7tRsRZ-8>SoEVp*sAM^mB!~}YPqY4)~SbFk3h@w;C z@g;q(BBJ4JS$+Z+X2k(NpoJ|i??_yCUzV@1UZ-GOt{WQ)HyV+z;4!MRH$!Zm;hMNI zJk|pmCb4h&OCqnpc~JDeoW})24sr>(P+z(TY8U7IpM&h6EIrY>`3g$@ttZ|#3Mr2L zyi~p=I0OL&Oj=%`@P-3AQw6#N#(iEb)j@8B_@alroYrx6uO z0?|^|XTeZuMG|8TX5M5?@~*n?V=VdDQmmdWkme4f64+wloji~fc6f3DIXi!MlbP&zL->{kvhCQu14`24@= zg#ULQ1vJVBo(0aq1&SjE#{l{9gUbS0@pW>8jPRn5euG)qGMPhle7BJHdta%Mz7qWt zSV57~PjE9ZDow&88-6Ty-*A9Fjwp|5qIMaa#?`xyJ_cpgT}T|H7kRumH`!lsCv(=9 zn)u{-kRxL@UL3bY!yJ@3)H)W(;-7!LWa=4e(HRIm{oE_!OpHLMg!4pPRctbov5r`x zJ2jCZGv|^ZHB*r;lyoXZsatSGY5Wi?&Zn?ONZv@ys*JC!fbd)a!JT5KSLDp?k?LJ| zRP~Z7GF6x828VC*>hSdw#ao+YozGrdu&&xvZTfju#~TX2Wl?PSfmPHxa)J!IAW=cn z0^qRVEKDuy0^qFR*c|NiER2lIM66s)^c-xQtVFDg?DQP0j2s|JA@I$A#hfgxoJ1@f zZ1n7mEL=oPoLuzmY)o7r0%7nyEDm~B4pwF&7DhIDE+!^sB6bc&dS)&rmKH1#@Vjpy zP8TTl@5+*jqN0j4!uGCCmZnZ1MOkq9mT?y-V=&NPIdFQ&|B`|X-JpsHgV))N$Js2~^Jvv>vza5?$m#g0#5p>;e>(`E0%WG~4+$w!GIJMkhlOA^R)AaB;nSv!Bu1|Hk94$LND!|Z~ z0;t;1LE4ryOepb3;W)b%N5dDbdg&)kpo>S2NN*qL$<{2uS}XVL*c6`Xs%LAC?jcY9YDI zIbdB&yhe$CYjFM2NKPCZ8x9KRrB7f8!*+j1w6BSM%PMtHCzP*imGBy+7>MZ9%YNjz zQPt-<*u3LUGyvED6wnM{vl>(lexzeE8()?1b{3M>iKuqpJNt$9C=jG z>DS{f5d+uAtHUqe!Pg!sk)#HGUeSkJ{#q1ds-@8PBBnZ&_+e4*Y!ShGTUt{2D=y%j z%l_Gs;3F#Z^(Q{bYX82#;jSIQUy|5**D>LE-o7QOXPDEUPmG>n*I#w8{WNt*5pTQ+ zhNGmg&JHs}oD~ZILeV zSXSGE>SU3TJ&+l%vb>#vp}3=nirRn}`wc~HtAyP#nZQm`m;d~LmlN)d2`}0xaDC%? z68Wt&U_ZX;;I$C{(0Y`=@Sk^6@%+wl?Ph=AzVTD-`eVCCnU+4`kk=0Z5fon$j!{MX zW0BI(5n0}xPfrLo6^Pdnt%hJo+#OTHiHtmeRf=_BY745F9E|FS7kw+sG6A4!Hb>13 zi8a4OjgAOykwixBaNQDBn6?(j89B!5g!nbM_6fyLP&M&{ZVzS?2Y6}Zm?dlF3^I8$ zT|4-BFfn9|<^YOiL!!K~_o4%p4c-hyu0Fr%cgjvXgDrXala*i5{60+x+~S}%n8HEX z!v`2?Bm1bF@)pOu*1Xf$!$8~0iqg9AsBG!_*!q;Q9`^Cr?dx!olCcL|r3h(($4cM2 z<&hyOBChAk7rb=`;Onr7?pIwF*~UPUJ*kLEhv^`M7zjUoAVwd9k57D8TJ1l0Rbjva55s z16U-9W6DitXY<#mn0z+qe^1zX5ygrpfp_{hs-73?U1HGGj0n7rP_04`M&Z|DQ(iQ| zHuShVW}Vd+b4TPxRh=%Jtq`2sX*D!B(VgG$w*Pz}^7&FqC>PZo@M^t97bs)Ihq%5( zMn2W8CCwx3qNFIT10nS3Pry^`Tlb zn|cMgmU#CQtQWZYV7o$wIl1=uW&Ri_86%v9f?@_KsXR<~UjNSMox$PLoT9{o*xXI} z8*xWyO}ZGtQL7t>E)hI9KKnM4y;I%N+wa6m1uHVmvraE~0H5Ti1V{YlooYl$WWxx^ z!oHwY*$1aXV=*V+G$@n*@NuznlUW6W(%RDZa&;|oJXqT(k^)B~q$F5&PfaeJmq zgjD8yiHCK`e-i4TSuDeh?LV%RFN1HHvRn$j` z@O6}Wgu2&1JNLU&#{v1X%u9J(es^vS_Ph~1?mUuFN!B@i9p3$4jN%AuNzhY@ zL8#bVFjHlLb)k5WZl6)%0@kQmyKXClyDe&ZZ^QBkAgjc6H4Kbg82vyeAB!0m8`Z(O zWp||5r2R`et;|)o-yXtCX_sjKWy-Gb^;efR*2k!mL6x!>7GD=e_u(%#3u_FM4a_); z-2KXylP2_3YV%Yf+;M*@Ld_rA-*v5nuP`)w`{{a?tVT9tXK>%D@PFns3k#Xw zz_!Ws0U`;7>Mi=;vX%s*JGc>_$0jJ7EUag$pN&VMn5 z$KI7FudY8;pB$-InQT)YF&9NwI3$k3e?~E8}Zl7hp<{Z)9!pdefkNujQy+Z zOJn~n1KnWGaB|c7H-)d{U>bxgP1v>AJ%3_^UQZA`t6aM99Un41zo_N#U2^q6{iHD9 z*m3Sj{#8)KU;9M%Wr<-4^Fik>V_N`u8SBseo)_4c_q^{=KNV;F$a8tQ?wo`=b0J`9 zv`v7MuRX!PP#_P4u}MQXunDzEYczM3S$u*XAksf{r6m;`=ximjvKAT7XD zC%j`90*}ilw)l-a(uFk_2sla{nNYDJ_t;qep4xNyxX-1YfO(>O2Pp_36~mScvO9LQ>ia086b{ZQu99ljY%qLg zzsUv*)@jVvbXH6#GObh;YY?3J zW20?{?B)^7vOG&nvlk7z`pH+fn$%UHXn@OaJaSy_tu}ToufNRyiB4X+ZTo%7e1-!4 zG_w@`wDdNK7~^hWHLymLAW0FqWM)B`e#Ty5N=upz~ zsx#5btkcr(p(v<|lO(~?eF0uYQ9^Z6KfU+X1JyqC6VG(v=_x6q! z@4w-Hb?jrSJLH!i!>bue&R7gKiU2=TO3v9$zLpM5LwonSI8}=U4sb!*0595+AT*yB zvDp`D94gUOcr7|Lj;g7}#igM6#t0*);hEWyF9hgzR&=7PwBmj7)PTaT4V!w8(u{Oj zr#xvohywl=ZgwuE-4?M5rMzOP;0d2kNKjR4?%Aj)2fmL4NJ+W(%t(+mswEHfcrZ>(|V6HPh#cSWYo) zl=sU^t4-H@CRE8<2#BBMHf^*z3L1j5eZKRhv0Ild%|!#jFgR<$9&w>d9$+5|_O}!o zf7wK%Dn8~p6>SYt44w39TO2Aa5c$sDu{ksfb}R3WQH|a(H@+kOyHk&L{`Viw6E)QR z*aMYnj*i)njcmLhquF9eg_6~Aa6M>oa3XcCs2En(@b`E*MxdM^C}?ecn*~qu;}rTf z54ZV%+9^s~4*Li`m8X~L^$*Y6l|Zw|F4sL@m$mq=#ustWbVCFGIo2Ox*DZZ=ZoNeU zm-X@U{7s9Np)n()39JTc!aY9bav1JKr*?Ncx4$5;U?>b=)(mSoX;O8H_0$LdWbu5p z;5fv!xG%6cx-QgGbGb_2*Zy2Ea&(K^(0e!hhd11?U*pc4)DS(DXXIbB>7N`H6dVU7 zF@&3Ib2{3}$xBV-SvW2e4K_h)^LvFLk)XLHfR;prpBGwHoO&7 z*s5j)mOe`W9!qrk7qx|3KY2tAq>__={NUtar%kSuX(WQZR668hA+>>y6elV9`MqzU z-*{OwXR4To<{~PEJyNOB(G!%4Y9sUIw4ctof`tljDyri~X%4hoC>voV)w7p#6Q|KX z%I9fHb*t5=7ai2N;bY3=x;#dm1n1JpE1L3^=whCMK%I&>%keo=Sl8!e{R$N+)Ap#t zkxxdkg(MiWRg*+DBsGOtt(qYK83adE1(IkH-aEYIw@uU9t>e*eNihDi>>9D$sn!Lf zBUVotzGzZs*_FCS;2>D}MAE^}N1K+%&uA5wBR_3ftA^M-LcUePz-(_Qp!-Lj>}#-h zzMnf#?qE-pd_7mO#}BA@FrD6u!Qlo<9&BLUw^y7X^qMe#!_iUm(36=RjhiX+DVoex zmqb4t&?6>jX%K0HkXA6{SP#Y6U>b^9$;Xw&PM9Se+-Wqx(X!xs7t%a^E?6Rx4DP0} zLC+Ujt)7Qj_`^{?Zo)mdYF8zQM1v01R4xNRX|03Nm1{`|hdkemB#KC0V|Xf;s8WX& zqPQA_Wpc|k1l!$(iZcm9^0wBJe`Uz1R7>O>(>i6JGj$tBDHt@;F*3k`DvE{op&~z# zv7jvWN%P1*w{6-GT)=|DxIf*JDGg(ek$4%Yk2KfsvRSIEaF@N%VYFQffIL|)`I-Tc zNjBqaMe)?2vK0@S)G0EifRH6AIMBU=gFW(je(Z~cdzLadX~o1Nq=fZjgT{l-&J9C( z=o7h|dQ+t>)yB1~g%nHXREAuB?SCbdgm4Rl#hF`t=DPV|m;p{v)E~biQ8wgr@%S?$XlF z{;lg?`Mo54Ix0sq&=j_zbcWj&i&-q@`{Ui?pBEy--bwgHE(b)xJ2)@=$TQb~T93i1 zmTC>pvnraL*PX!Q?AI${OWWPZnor#)!t&3@WtGQC-uAeqIh^*|+6D)_?pH1#TKOb+ z4?7LzMaP=|WFAbCS@E`0eA|}haSh%KzYgR{TC-8OG9=UMbsazIu2vhJ+Wx9qwuFL)?((0sFYB1^ZeO{*ZkRu^Gzi+ zByf7|TAOrAsEzH;y$GmlOxJM0p6U0)x0h%0osM*y5eE1%Lk7#3N;btr8jL?~eDWI) zY=1ILt&;?+PBaG_Zp`tg zC8tL-Pfc9O;fu&Am0yHmYc#4QyoA;2pboD4!vE^A%fL4xKgmBnxS#0(Y3su&?#3aA zmhe>-6gzuygRpNzIx9O|pDY=rI?}#Hts4_h1avi3e!Yj~C7=ynU?Sp|4r)1UJ5AKH zKK;hK;_h{1#nQ}jVc0Zg2$JhMO4(ANoH>GRxA|#Edf^-=Js0;0OAPb0kqx>VTxf8;NFy=mL0YoLKq*qIZTyrDbuvFQPD?8zYK-r2peTB- zlwx1EqG(MF37m6FrSrF*S8IoE;vP9DlH9YQ_&ZbZd8DS5BRYF zTFP!J9s6a}DrXITLv0a|E{#TtM`x3}7A1hBsVT9VMV}_&u8!5{R7FZxJ)<7@nVuO? zs=}$m0`573#z%k7?=6|Ph6?xc;IX-1AZc+je2xxY#NBJiRRP~hXR2jNtI;-$`W(_L^HNM83jjT6t+g^{F{}A+Sdrin5xRFQB&iJHPtbUh$bmoACNzHVPjAt3g0y8XK zS%!ptpa|~q7-TO&nA6CkMI8pLnp9+RbCz{jyq6YBe4$*^ zzOjFnRfE(2Y!f6)t{5mOaiiz`d<%}MX^yA2EOx=ZtM=h9V_lUA7&lQ#R!$X!wR-<~ z{hLRy7ut*SgRh6-dF-P>hsHL037!PeW^XIhe1;%olFTeYz zR_ydKHU{Q-{7*)BaM=0V{;*)7UZestSnX!%bfzGn!b!VrhZ*ExS`>j;dD#(o;6&1B zjae2V)tDz0ZW%EXJ3Y7M)a*SJ|;~_#>2IHyTZGuMtiyH%-ej#i`wc(rauOxrsV~+l+&cq5~Afr zU_K6fZ)pv6n!pZ5{^cC@_NCVyMOnt(&=?^=&;7i-?JjU-9LavX2yIg*xf|Sqzee0L zmdt%oBt4B=F&*AvlhKUfr~YKUThte62qNQ&*^;Wsbv}LkoYQZeJ6(DzpG+3pe6P5C zZd0%*N~G%YvKxk!Ax49ObtveB-qiZVVQkI6Ogw=cRO(TfiFf_h)=6>U9KQCql39WdZ%A-4ekm|qbo|N`0V0h@t%4`bd@J#qKN-QHq$39+thSu-{Bhfno8_o=Hl-6 zBm1X^3OiG5`=1}&ULC*bajL0&n7HBryDXk=qRC7F_C(H_t4kl=EhDrrgDX)Z0`)?H zi=jnSIPaGiUPFw?R_x8ll{%6+*c}NNd!g^_BhPj9^5{97F5+)|ZgaMAMoJ@SEQVA zuA5bDciXqEu^N4vgRlMv!Tj4vCNuKe{MUx-tra!x2Lb1@%PzWplTDziwuAar5HLU7 zl!%b6L3FqB^>`a8X2bJ7(-s?`m=Lb~Ec*(i(8uWw$ZRI%6vqmzpnL zsb0uaNt+^}&;-&%6Gu$atX4L)RpfIC_Cnd9g0OIo&5q~^7cA+TWEg?uOeoPqM+wPz zXYZ&JSBNBHekFpt(2WER_NBtOD1r3Pg$@ct*3E^3)`F3Fvws^6UE?^-K^BfA8w^ zKmX;IFzxf049S)b@qIvnyD*5En2jc*DChZ6EL)YICfRzEy}^X(DNF~o(hbY16DPmv zK*{FDnXhfWYkSJm-u|yhP4&!;6ZrwXr+g}VF+){g9*jMPGeooc>{}s+*Kq6SJxG44 zxZwy|IZq*fFxOf#m?Rup;E5wzkF{&RtE+gtL*)9s`!NemgdLbgZfWhsMSz6urhc0a z$xc(IkjNZ1Zh_dx5&b(MAE{P^`a5^HlBUA0(po9bAm?~qgivyxVUBh4jGD*jGozZK z;-vbO2HVsj-Sw~*KUpc619z0G!3-r&U&MlRe~CTank|8uPiuKQI`5&yWmylpEhfYPw+qp1B!|_X+d3@w>iO=^c7)kMO z$HN9I8zl<#sJ*P}QM*Ha{cg^9LYavyV{-`Y8+bSJb2W_3kld%|(|UM~>6>MFh})n%5yLE6`t!Whl2$^_4hdt#FBMf9!DH#FLJr{iza; ze6(J7V-)$q+smUY1e}ob1LhYIttnj;|quMuMD?( zZh=|A3n_ffol#AO zo%1$yXEN!z8c;Ki8{zp|*C1PCL3>4%;a<3$XnDEYOyT!TD7L;YL2LP!>bFAv%j-We z8rVS72u+e&SD~sW&7p`>cr<^Nhhg!<5p&+$z~?bFHeQ_G20K}N zs?!6-sR1X~p*--X6gE`3?@$A)EJnb!Ex*#dR+_0Q?D2~Q=)Q_#(rWZ&>sujJ3ImXSbkSOo| z=#JZO_y+5|`m+&4KE$ygZD-fxKk`nE^k^3$%6}q)0UOM~li)8QB~cXUe^BV! z{qb)4Y6d}DojX~RMB27-qYv7;<{M??3~4y~xbY$}g*W|NB4ETB%j$K~@7jOkdISW* z9ofK-myL83ndu1C%MS)9Lng#C`HTius$f0){7ME(<7K#$p882??Ca0^w3KBY{p>kB znyOC_%o`N6;%a`%Gz1aQ2cpmzNl!g~vi#t`{^5>i)!Ypjb7RTK{60*PjMAS6F^ZOr zdPAUY&c%y}?WX-a;2{qcdO$iAjRNwL&qwrWtQY&r%fTt=5p!M-bE`A zK|pMX(=4cbS(oH$-T&d>5Mvb6s#2$-Q=svKn$Im#t{$h!REqdKc|R3Io*RQ?YtT7w z0ZA;3COmYKtDT%Wn%n&RSI6TZbv^)_X~K0r7 zneZpBWc?=iQ@Mj_nNHpfcQN!38aH6E_eF#{zN)Oc%wCSo95?x**zw3sy~DfsROnV_ zS>}=C)@a%2k@^;)8h7JN)qM`(FTRVlL54Tz+&rS|;4~fhu~0K;*|63)q`9P45gw5S z)r=Sd%uul$d&v_9qC(&reNxvRPBu5yR`oSXut)lHMpL$)!KG5g*X4MQau)R+DyJJ2 zN6jr~dqlF|`3RlCeZI?g2sbny9@UM$3TH<)J?u;x<8GB-tZ3UwPF8T&pB?@kc5`)y zkNz=<}A*t2zIf({WW0G&4)53Fkj7f=*WsgIJ&`=Lnp*M4B z?4c`o$DVK!hXZc3gI}m~A9gU#bs9)jZ?u zfqeouHd^$*XLwB~phgv2y%dl02j7<)?x&JL9hu18+vpOuT^57JdbSIioJTOwLa2u* z2ou#*V_lP9?WGr2VsXXw#y%;RSo1s!-k~S8(=QwB7cVCGQ#~o)Q$Nl3-8cxa-CLha z-{bTNV_%esNfE5M&+Z3imXV4MGDfebpQ&zNe zv~(5CCXKZ^dv#qkQ}vwfj4gAuz2>E!zO`1mZsKMVdegwFNdw1g!_AAu1g$%@(b2=~ z{RON!E(XKfu_*QcM>S656grl47kBBjsNTdNvIq*PZJ0OC+@NpU=SI??3)-U*-yrZl z@VOBM89!fFZ$L_b%Em}Xy;$DUrC#+q+Be?v`}%EFe`%Xn)Zr!3uZ#qz(p6RE>9_mG zA8$~N&r|rj`Bu7zIuZKF5@0qWVopwbk!b(>?adRNe7WC!`>}X@zh1>`n;KDsd~mX@ zJ>y6|yNE>-@LJAZe%E<4c)53)@c>eEG6?rw;%HsqLRS^YDV$1VCpcp*yp;a_bs$ZS z@$Rqw87#=aJ&}IH{N#?Wc{|VpfeG;_0%GSU&I-&3;3D^uL%i+~yklGsoV}(A?C_0% z4X!&$8(mlw@^b7BoK<1v5{%&Y9cAF69D?Y&gzHU&g$QyY#=^i14pbov>IW2C6!e}v zpqHzrfA_kc;RnYKM#N}Pp3Kfl66Y|ec&zOd_5Q33l!_AlPQ5IOgBSdsN*^U4ZZ|4# z$Ra{2VWlIhyTyM%R3dTaTlxN zNKYKdMKJAf^1(Ef2D;Dx)H1NoLqeKh zZsbE4IC{~(n6Kr{(<3ndBcq0wFwF9FYikJliMuuV%}z@xOjF zMeY@>5deavj{~g)fB3ww2tS{OFLMDS{Z6>oz1SY_&7{Y2IxX~PeP9rj^11l1(kPWI zIvipiq=^{)*9X0G)g}Ya_ecwy_H5pP^jGY7$TjZKGCj8xib`thF#25w?B~_MK0&$T zb6_=}zBhjL&lReUb?k@UKZe{_)?YK~nVU+5nxcL zZ#1wSqvjO`O3H*H0#<5=@vqv-)^KCJ;YxHFgB}gshfZ&Tv&^eqL%!0NK-V8W_{$fq z4+_sPSdZF1N7|>@CKx`B`o!*;*Xu^;=H-Y!rXhj^&bZ2#Roc&+(rvI6hcB3}7pOAD zPZ@X$Zv8H}(Lbaf-QF^6gtkpMt&kiOir7nfEzM)IM2zMS2xfoP#W2;)&k(2S^nO_} zQ;`?2sIU3ruf+WMY;gn*Qp|$F2hbOJzU%NfUq~K8GSL4%P6Il(UHVU~)#QA8_hEsn zrw`#(m=zVz9_*y~0;u=ohBY(W)Tg1svJMX3ry#Ze1$;n*zo%Gn&5U%Y`GSK_7Mk7A zzWrX{rEQ>3x(&N@DtN$7wq69;puu?^4NkFI@NRGSJ z80xxkkBIYXPMpsV;?x^!pPk!};+!*P0_WBYCO zS@IfH7ykarRXcM=%QKO1Rh!w^mWxKVyB(Vj+_mY@!8`9fB&=(nRQTWDyjPgiu=YDs&+j=Ib(w~yzUj^SzwHewhGYm5$_f+7 z`V=!v(a22ZcVns_*ZhDRcwY$P+2Nv*%>tBkKMAVlFyUrI2sChvePg8#gFg# zWhkV!*G4?&KSnKYzDcd@5FK=UjDH7cEC?EUuXQG9OpBS+g2rTck3m;cdP>CiTq4t6!fJadeE8;xu=l-71D1bH2~`Q2G3zSS{r{TWd^P@aNP%* z-UsSAitABam7pqu^NvBBjr8#+7|=3n-Hdt(JS~F!i&1hB=sb#(mopia^_~VMaWVpQ zG_B0WxFF#AVw!w-j+7y_+>VuXIXgaa`9OWLAeE^aaFTMk|I%K@r;{fb@9 zwHH^%BFEj1R5ls*_V0f`u8X769H)#^iN2KJ7S zTd{sAU^Ch}#oGhxM%h=W^)@iphC62fc0*?E#k$>#+1ZOb4kLek6zQW#A4R&HpFhPr zsc6-JzLWviQG_%@0XI4s2Z~xrxxg4dSQ|2EI7MWhr>&-EW6^o@B z@^QMQCgs8VSK(BFI~uR*eCH~xc4|K83t<{))_Qr_={LY8iDa6=`nIq^m4ke?VtYPTv=+hDjWr)ZP6RkA#|}}BnW+8UIC}`< z8MINEt_A@C(*w&D7-2@*cUq{;r6mkZfK_4ny1qTGB<_ERC1R1Y*Rycnu2?D_eeidm zT(`6;XxNxtzJM->C6eL7?#)3s!h#5dh1doSwjF*nSL=z|F2AM`;vjPN0frZWY$z<3 zHi!>m-PDu6x6a3UjpNN0FV<`v{$VfP*z)33dYpU@*T(^mBK{n%M?rfB5oh}c37j5I z!+FEsktKhA;HQof5dhBtQVn0RAJO;Sg!SA(7tGbD3)Zr#!h_ z##USp_9Oa$@xhs3HU;GpqPRxciNs-Y8JWce&b5CKEO2<|OFA=@u1UA;-hJDD{q(0a zEb=yMJDW+Qp6bs}gj0*X_Ek5S+_2#R9k zV>*8pL0$xJAnAZZB`7ojoU%8D7@g*TZzs|L=14=_hWnDpWteLO&e%Imb-*FRnGAP$ zAYTKRWg9r55w$Mn^BFmyAXW|4RE}je#YL zuDCzY68EJG|B6J?ZCyptYcUp@+ghL7U1-JzNDxZ7i$1(+%^iyi^Vm)a6VZ&;cLT@M zWb;7l5pr{D9ANF&r<~Tyr>t&nuoV|?g5XV@+EZO=wV40WZ6P_ zBtJSDYRyNE(AG#OknaCF8jZ(k_N7{4?b@!cE7L=PO5;# z$j1A5VU@Upk2g+kXpLcZ!+ec;FynuG)I%%OgRwIlgfV`$LK9etPK+&rk;^f%FzBf` zW;J2~;b^9BC z`@`i+u&}Oo{rG!@)$_B_s1RWTUfNhSdsZa!&C#{%v7V~fdb)kL@CG(~*`Nj~-b*0T zc9&$O25A8km(HaIO=Ygzx}MVgzRDw!XnIN}HZvEC{L0~`I9!vAQ*Agp->8Z$$lXoX z%uIx^arVE-Xe3g2kFG78jAn{TFwB+*WR%Bcg_1 zje@HaiM?IrAhTPSfTjjC4Ziu=ScFc(@R}f7(`T2#rUnyIpF-a{pH{Xm!JFC*=}^C9gj(CblHd6ri zj0b&UexZ+!1+ zDZs5X@nrSrNf#SN#r%P_2~S&ds>2a#iTg9)`=NB3$5kX+z3BA#dd#m}ZY0wV)x<)g+670(w4bT!bB}rVgbT38ii&3A=Py%H|No;~7 zZoqso$L?&>!dze9C5+h=4Z?TG<6(c&7;Z3E=^V;1e*;%>&XvZcjpynwA&ukd^t^Ay zak}M$d@$YwX}owRq;atQ>AF}9(wJd3leFA*#a}dUiLiLb%dgyb-^<;?PYdsV{#oID8vN`t8d~wv zz4yNS^1a)CO)q)3@CDVq`!3ZM*cWXCG8Q`VZP1CM!1;%*7ent20wU0TUC@1lfCzM7 z7gi5@!!CqX<-{m-pcO^|3gmyCLT(y#;vqVaj1_dEpd!2{3gmo+`R{;T+W{Uh2iG~c zJ_b8vH|XXtu218tggnZjO+DIFg41b%C&mjI&r9N|e#Drz$E1rN{KABCW@S$&wd{-m z(|)}NQi3Y>4|c1R6*AHJ!582isK`bU8YW^q1?_(87FpohTcn$&Mj1L&$H2}UD?_>xELW>LV|G+pagfn`W zUx4bF(Ge_p5r!KX=W@*I{{5TapW1ZilfsJ82bR8E7@*qUUbbVa-Qm7B8qSV0G9Oj6 z(4G!O!}Qf3KJnDXA3k-U{|UOey`%8*@2IxDeZJX*-6rohUt$h|Uibsif1Hhg9KII3 zEnBN@cRFC(roAJJNCBOl2;_E6#yya~m>%q%^ zfI1JLd<)kB9Jo4v$^9t559M1?z76HuK%Mu2R(_6pkD}hAXy;MX+soIw2H4Ah{;ELL z&7kT^fCJzJJ;vdMNCC51;NB1Lp(F|F#C|EHfC_CJ&_5%-bfBbPwNwK6UC1l%{wyeaKEW5)vS$KJWnWQ*KpP!NIG>-n*^VH;U6Neh_ToTCXu@8D68E)|F>sn{FPiVR8_VqtbL~^-Rwdv}BA)B}`Kc-HS z-QIQkBWAnR%Jg*#pJku4KspMHJlxs@OI$-%0@eez0(Jpp;00D-$_=OhKS+beCvh*+ zy3U})gS;ci33IO+mJY=mXuy0HIbQH{CM%eZDS*1{JH)`6ImUdt){gj~A9+bj6&4+Zo9= zFL+@5s)r&b{l0j(=Az}HNYXEM`e8E`4(z&eNz~=bS|h=ZNr8Et9y%4scOS1!#B#G= zXLy=_h&S9<;2Q{8vZs~NBjb)DC_f9@VOlSH54{pO%+C{s#3P{O3h)g-Fku9juEdyA zpzsi4Cg6v?XZ@}2T7`T9d@?^0(@U*bjRyEO8OLREE(Gb81Gi;oYFm0r%$CtwQSV_U zHVWA3tWpkBOG{qZA-n*6!*rfOC(rO=x@^gRie>k2j0D2*cfy{kEPQP6L(JPa`LV~$ zZMjJ7-hhKH|NhE5uA~q60^y)9fA#`zh}k`Dlj@&*ivF5OIcEkvrX)7-f%Gu&6(&Dv zjesX;VRMGCMwypUUZM;)*BhWaa(*iZwgSLb1owx52`})3i;Fv*KI_R`>EG%(qYYgYcg{VY*EmP{kjkGoz&5kt`p0;PxiL_nhlHL=+&gg34 zb{s?ZFdx_1NWIV7fJf7TUf|^|;H8OwoM;^bNv*&fGu@Wp8&D8Q7-Il57Q9}vJa-cTbuWG`5%oi5K9U92*CbS+SS74P> z#EgikNi#eBkAG&7<4k68)A$w0Z;(zAl>s1(^(KgGHGVb3ff&>HDsfe^XUe#L5nc>u zGYfq1TL8m+Io!XPz}Hf^7tHFwX^`OvSCnoM=B+D_MuSn^U&`X4NSLbX!WO+gUB!(QR6k!3MrgJ(~F!gpiHIC=wY+B)E?4kWV**Bc=ZZU=0HC3-ukZ$0wv z;ZP0vH5Rg|8kqA#HZVU)4%a5wmosr)09b2inL*Q%*FXW-6y9%DLGsQPu31jZWRVUp5W*b9-;;K5M%3QEFSL1HH#nq5M!@= z_<0$-V=RDmEywR=cXoEyT7M4xur*oa z_a)M4rV+Zym21e>7JA)((Yj_6Z7ck`qA689@pxUfzDD`padSgmrjAOUNUq*l_?TW+ z9*$=^j@9Ne@rM4ckU!{;xt8OMAPi9;5T@tlSDE$1uEgF64safLQi$N-CU_v$A36umfupcVJRs8n8@INX zw6X><25Zrdo?L^M>#_zyf2xY_y<_aU2+rwfoxAVc8%xd7mygL#qsKj6ySHB1ULlI= zc7J%!XDe6Dx5z`V0hOX6@ar2t-52qXSBX^JarKs;7Wd|c@R23!ThqWr0@z@?7L3C% z52_PbVV)MYf6Jsr0%H$ikFFd(dlfjdx`dw|+!X{?DDJVN9flJxf5(X(7>NKcI7ZcS zx`Y$#MGhi`+sMq{#e7{E%8zg34M_G5WJyWoDlFXC?3Lout~!4|ax_2bEgV=hJ=vhC zoEeYrz4H-|&g=4cRi^!S>`f$Q8kDV>>GZg(YxkBV=P|70!;yWT-uRMVE|mqm{-|7# z{I9J1Y)>STR||rwe|_23U7MjJ@V~+q?CXBl-$Z0GY_R>^bH5s-2d;`=3bI18EPfft z2b>K5CJ_4$Pzw0X0AItu{!{$s5Bu6rJ1nA!QbIq)c62ENPwD4xx5k5B$GK5*fA)5njWo)~xSf2!-RT6BG>gjI_In6s@7 zFayvDSP6inp<4mF0EYnGfD?coz-c%MB!CGJ1k?c905brcfR%vtfUSUCfJ1<8zzIMP z;4}~>0Zf1(pa#$em;vYntOTqFYz6EB90GI$P5^oUry(yTfC&%;)BxH5GXR}{m4Nkt zt$`#rhOyQ{t;BkcX$as2w)m+=z1E>ztR3wFV%6=RBXQ z*~7-uKBAnh;Nkr}Z$x_1h&1!;53fIEMEd*@>1iX<(?_J)&hGH`n2j|&4Z1uh%{*Si z%jb+pUpgW^cSL&ri1dOH>4hWGSQFG$1e_QVN%7h5{&;lgb4@ zf2kouRi!Ga%=1)`kV?peAz3n7| ztRy@cHK}dhbfSF9x(N}Yr_O1c7cN`ke~=!Vx@e&*ToyA3;nz-|cjugNS-qDK-R3)I zFX_8KW*i~Ooip0oriI(db)-czP!TTE0;JvqFAcjfGLpKgVw2K_Wjf7XC|RHkJl8ab7R(R?|SN^9S!QomT+gd&`~Qd2^i~qTh+)TIcZ!w0Aj=rgd{jKJa!6 zG!W%{&-$(iB3 z!&#BmO<#GlE+x%d=i5}&e@%OpF<1gbS#ozcnd&=8camC?N+*#d`t+Wu3t36*12+u%eDK`64v1AeyJLl=}vZHG(ydVq=Y9V~t>AjS7rX#!64Go;kLXh=+(#JWMjh%_Lr^B=LlV&Hz4T zsXR7xSv*0spe2QXIYus$Z=rNkX(hdn`K@~3@Pp8p&^bNX~{*Hdn6?1L8pZ{2xeE+{Tl&B=DgdV;bR=CypT&Lu$>nn`+;VOMcZR#n=klKklCWNUSUeCCLLY~&0_OyhMh0W1 zk0yTY%v%x(`?$f1n4*X?mJo!zB|tr{OZW+qpJw39hYV z3wKhXkDhn)DSReh&yNlLoqvPh&3`K-36q5R!ZM*l*djb9#))O(L~)WhPkc(;Cmt35 zL%b~Zs^V2^RNGa1RVO92R3L4UWSR(ETr`R7C2vFOHu3XN_L8A=HMlx~9E0@skax&6 zfAS+aM0V16BJ+%!$)OiWcW5oRd64{uzn_$nC%9j7w}s02S9lH03thppa=@?tE0C6& z;!95QdJ^3(XF_~jtix`z##o}wCZi!LGD5G@YSfZS6nKu3jA~C!tE)4)wNps;)YWCO zvZoCdZ8uf4cDhhib8DYY7rU8GpbyjwAEGJS+i(HM|EpeW(M6Kz+#}y z%pm&-2@oB7a3>kswj9cp3}rp4I~|^?>Q1`{d9?9K)os%{M~!Z*u8MWLn=&&xf9cSv zo++KgQ`s4n-gi5@4@xj;Oe4n5%$V5;{K7rcSPvjbTjh zw0f#KtxLbK{Zzb>tKM)^V<(qX)7IWm(-~-852CYTD=W2aK&gJL3yNr^Zw1nb9$;e-$(*qZ+#$0Y|l`wW_I;jA`t$2kc5AGh@GP#b7sx zvOlvTvx23A-L@6s^vhM@`i~B=)VAWtpOMy&>8A^2V|#`H%}&=;3<6pJ*An*CUP3yi zmVkWtG*P_eOyD!LlY=PnNu6TSu(r;XWBbr(n^Dz=+^niDjoqQFOO;LNf8W|+7z75Q zzro|`_>O?Ho}RzmTGQ57qe?P-M_41{f4>NI(zYArx>j|GOGdO{R>gJ(s+vG_2=Sp&jh%-ezfDc(mD7(Y zFkU{>)`xR0aL!3XdtUe{Fl$!g5ltN(?3rU5J?_p!9UZY9Y}SR#f3T1TRs{Mgx(VyT zDBMj~j>5f2JnmS9&Q*-UHUE7Sf3CfS!gc?g!o&LU29mb{+hGcY>;FX*9{zJE-0-s~Jfa`dTPQpd zIFDcy9`)Zx;nBBHc+5Yi@YsI5f#f(~J656a_MS%4kK)*#HfBEEp5y@MB4$0eo7Rjgd zV|ok8rvm3GjO5e)Ka#xtCXy5JU9y$)6PC{9c9AB41(1!pm7G7cQMiXZ1_%I(Sc-lH zfENJGfNkOg@-kBPjMc(l$Trn3vKi&gDnDsQ+e^s5gmgUG+TSr zWD*O?^nX~8hKFY#{)p%$A*+UgrB$kQeJ!^pdPMsoNfe@y>|-P*B{h?1j2T0$DA|Y| zUU#fg&tk8)e&XT3I)RIuB*Ihok|d=$nfOQwyvQ_?e@-&sOJ>1q&mp-akK`-u1*CvZ zfnWGN7tIxM3%DJ8BELgO7WRtC;ui61l}j~Fb-(IGDMgwm{T}hE`!#Wz;hK%wJnetz zvUJ;Y-|IW{-$cxc*c)*%QXSbDMWQA|?KKz-lMH`0rWscl|I_3$9Wo>G3NL*tq@WD3 z5+3vze-dzus(AQff)vjattiCvJm=7;q{0}(M)a081WQL4zAtSs1WQSI zX|R+*Zce_@ZS(=Q3NLkEKQ11=I;2||bM05`m3T5YbXMFZ9t0h7$zb|y#q*$iEV&&p z9@M!Lun6!DD196>l~76s|5QYWO9Fjz5mm`0e@&#AYy{mmq0a|OUnBWF@)uG6BS4R* z7K0XE3ht@dAQyIqBqc)8ikaM7%i#8Q`6gb_DvFz}-%cvVv+DK}M!ia`oum_B22=*9y zdwWQEPkDKdp~vVqTK&{$vieQ_^fg)O>B|l85TnVDqLJ16{Q#Cs2b#|qk4JA^xFapp8E53x3H7N7gm8$Zs#Nb`PfN7q}xCfAP1a z#TS)l)mfZFub*04kwQn*&aPlHze%3TJt3X}En8SL|1C^w6PcV|5ew?6F;CUtn;H={ zHRz@$69CfzivW)RHUV}3_5pqmh-j%0$;Zfi0pMClH{r6oi9S0g*IZPb4=SiE26K$n z<4g8&M#CRQZaH1HBG=Vau=-?efAxsM%v9%^Lphh^rcVwB=)W<$n4)V{UJ6(8xH32x!%X22x(0n?tM! zoA9bA>M1HV84G;L*)*T78+q^g5!JOPR~Iz7a#xg{7FFHyxANEWN%{R>e>Jv!y@gVm zcVtKK%Xt_-o9^Z2aBQx-116HlQ-^pC)pkMr*uA`lN!0lk0|v|P$;~mljqYr2NboRs zSpF8BR^kPIjW{UgK)_5>c&!NB={$DxJof`(z0eR;uqEXUeGgbkv*izIn*1M32hh+) zD4cHbGM>>C$njG@x0o!Ve{1Mw?iKPT_bzvuUZFb5aV;jEM^A(p3D5CbV98^Yx9A+= zrm4HX0iN~|=MCT6pnA$n8x(ygj$7Z0oSX1}k(XTCatzX%!yuoveRcVmXG4YWzoREU-0=9+jR-cDm| z(`l|J2~paBSxk7rtxt#(_(*9_%so!ZMNW;n z-?`J^rt{n@-5cG{f4e)~C*0q-CAX(GaYPu``R5yYd;ESwZx3cYDG!$S{E1EfmfW0{ z`DFeL+{5!!a-;0d6D-jZ#3+(VZi~CByzDRU3~HJ_`JwDsQNARVE})(Z)X-YKalu_9 zW4R^Qo!cIK;>AbHCeLqP+E%i3|AIe;K6+vK*y*E(S7lxcf77=pbXIxq9I|Mi#znUz z(wuIp4wPnC6Oxj2-_O;b({p-#hB=TR3W1D>q$J5O*Db9|)o+NIYQ3LKP2Fk8$;siK z&*{uLk@HQCkds%N`_tR?^ad{&dQSD2{Mk&yv9u-VFUz(WjvF9nq=n9>(N?B_3Na@< zj9rRaQd!yCe-;m+iWbAX&10cQ&f~(wr6b}B){R@fu=26>#gp3_+b47K_k!C~U$S-H ziO}$z0^hJXp{w$-`^qJHaH4I(^ih1vGT6jZR6|mi%$P$Wn*#l(Dq+< z%U`{J*Bfjt4TR1JX(Dt5R`q)W!-hu;&uETl&Jc=|ery(&Xk(-yeGI3+#^NF2_ClbF&loGRQGZk7ioNAdr;(SB! z3qucB4Nmv?@dsk`K$9CFs@{S6;{6GbOH`S^kd)?`#X!7cElRc)K_ zO8Fr9>anBp2Vd-=u{&n$Up8~)|9o9p>xlRYYzYqQn~t0f+%5E1fdTk9szaM`_ zzg^KyHpq~*w4uDT6w6>X%ob5m9rXxl35Q}kg(FRCvTV>Ltb#`cf21kAa$>P8EtLRa ze?n8Y4gq~P0`hLkWz$97uhC{sD|bx}em-4(n|llK`zkv6>JX*?73=B+*ja7JX|UR- zLjPsFD(sYYn)t;rYht)KZ5pLMl9s~h(tPSTgIHu6X()C&(upp~XHQH2Elq$@83Xm( zx9l_Xs{wLgVscO(gcJn*eTW&|eG`Eqf5)Z*#2u?OoAOcuRgy^Rfp(|w(phawMpfS> z{}!2|DU%CZY0dnqs^r_|-&2`ZUil2f}LST&{*&!o><>1BwVUb!9*0`(&{sHl-c;exIAe;f>SAYtN%2*0~x@EHA22#Pu=W%_{W0Ve(?Xg3!u6L&I`e9jV$=>TzetB4!3-bkDO=Uy5^ z7rs7Ol8+^1k9+x*!^i*a#qrrrf0~;jzbS|0!~6De8-m~B7tFRZ|d@FFoLi$UU2f5A#{EAGsM z>_6Q04JC`7m%D-wbIXLo*N2>5^wQ^lmlN{W-W?(fxx=M=t|c4tX7c z0aFLNNCok$$LR)@p_|YX%H8uU;&?V?Ipo4 z9F*S;5&2>H3LAv>`wu!&e;9xm^SsD$I<;CkM9_QFjIci$K&Y&bzg$}wXZ0ey6z{0Ex%w0IcX!Ibe)*o9XRe@SW}if~+osOB9K z2YgjhH;n^}Uh6}7gy8}#njj1?W)m6R+h_rI=GwR7;cK<>6@|{5ams{E0TVeC*r*|r zTCEX{F>1RemH5=@8m}?UR4f&$OEo2?S)|>#gxqUfM;EAf#= z!bPfibu{R~3A~RpMMXsVqU>fycW6QQYj(rgv$kNVq0d4qh3Nzbff-Loj8Go1`(gbn zj4voEgmR0Hv9Q;r!W?=){+yG)l0TL&aq{Q%5Y;p1j{hS4f0?vv>B7fp&!k_E1v!>5 zK7kfumG}+>O-m*Qven!~j^p4tNNFYt+fGtzdCK8*g;q;dYR)G*^q4;yyH5YV2?@+! zw&DX(rmF?$X~UZ3M--FH4SoVM{B5Q~xq9l9j|F!C$0@+#njl^sB3Q3|1tcIX?a)bo zg-+7JM~fpBHUVFZKE`B^wmUXEM6n{y%IhkkG;v&UoH^E!pe{Ds;}g!gFAdN&eVT@i z?KKq^aEfj*<$EQU*y06KJ#I7Itm5=(f)L54MS;J-&SBvrk|N}Qld(|6leARM7q5L{E7O1A6lQC7D#dAhzmVrJqOnYvU%swKsd>>Fe$aqPEzU^#2~DC3g(Qp}I$t1&-j zMnw{%F45*pvZ|93BXxo;>r}e!R9r=NG%r+tq-(Nmo3f48k?Kt;j$CJvaUv# zb)=BeWs#}%`{qY~=K=rFbXiF$V3U5g*9$^50fbNp)gsC+^Gv%HUg z8%^JB&%520wR~8LFTqn#HvNykr>ZNL9xh30oiNhp@RX$to$<~G@^@6aAf!Nlx}iUh zf|3#`3FxURP2vQ#2I_}&)5b0?3HDfHK%+v`=#ZP)Vu%_w^ajKJA@gQgya?P^F5#$L zD}NwYi-+ZF*MgTl^>KJTsMpxEgrtUXiLrg_t$LU zJFYLfwCbC0R$bydFb%@*soiXcI)0kOUVOSsZ;(C7Ez4 zLub?K2#j4Azd9SyX-Sfaa+HICD-cNqb62aOFpAYGN#KZ1)bWyrr_A=%JWcI-Mqqo` z*bQ5`4F=m0!x1HZz)W9d-Z71T4^0ZuGOS5gGXr;N(-E6N{67^$M1^j2gW_ADEDxzv zL*3y&O4rC+=^42U2Y@8_lGBhoCwIsfxy#&1*-g&{{Xr2&q@aTbhdvWZgvp4c`pF>j zcwppUuCQncT}Opa5@_;&T}b=V6B!}ml#|(!j(zh6v!-m^_ll498yWVx%zHENxBDA+qZCGYyet|t}_-}q?#;tkzld~4wk7l7|9 z3VwH>`stWgVz@Pbadeoa(KN$!pLU6<+w!jYJ&W4Lsf75C1aE>viiySLw+&66P z>oWChSjLoL~o`~!+)k4QDqPv^8s$YpHki*M4BcDpJd%PgU4e4aU+0tP2pYO>IljAtJ30>X- z{~&CZ63j(d0x%MAN$$S2P~j>_WHew)fu5KXNe@WNZeM$*Hel9q!5CHB;IWOx30CUS zP1{=Ju`-`%#d{?YA~sd=$EZPT8kdKen9IM$61;%|YT zd+=aIHcC9=IUIc2k?=hx1E82tV?|FL_}`5Ar~yqQVJq2DYgOX=PTUottX>-I_C(@t zGx-I2+u3ddjRXf;5ryts7|$a@QF^Mk&o)PYP!n4!JuL|9;r(F=Wl=ERl5g=qDm;bx zO!wq-c^S#J`RNA^$mgHiHh4&n_#w|<^Z)!I!54hr78Mde#&S`Qc`EoMMj=Z?lv6-5p40~?gO(GkA zR;xxo#1>jLc$|fxz$xZE&=zkv>ee^qOkh-Dc->9(`ff0+jOkgneNbS^FXj$*th#%X zKfyIFTMH6Xv&XOf=-RiR-Tv3jFF*6*qxE-BzO92_ zU{Am2*=ygQysLZrOL;NAJ1e)<)Oad?sPFoJ(Rx12zcsK;?hp@x6Xk&K}VRu8CRFYP)om4(5!DQ;Xfs(S(#x?+8F)2ZHC^jet1$N2j zpam2VaI{!nd=1;46#HF-vKSmsk^*LqP$f=Jd=wG%{>S#m>EY8Vv4vOUztDKxg!@;* zm)#~z!d}(kiU#aq;SrE+4pta{hdnip%*1}yEJ*kgq)U;mL)wA#X{1jheHE}D@FnI( zB>KA%?cyQ*5!n6AgzU5LB+$T#r^aLEs4;7@`(}*_do&svg*%L-fkY#hfR!#D^CtoG z29`SY;CZ8P_PTFbJA$aUzxT$j11ua&ov{5JUfMBva9Q|1{y{cxuri!~bz9h?hq$nn zrQ+io{8fGPZHHFsY=*Kel*Qa5T4X zNXqaj1;c`ixpi$BBS&U71?LHY=f-;j#rdOJGc)o2OcvWP|JZJEeIQe$7Mg?|p+?;d zor;em{0YlJOodIT?eZPAj>8>zF|)LfC(;ZPSD?RG~uU9_iPg@?_5Z)2bN%{qkW;vH7|4sf9*WYL~mRCEC4xW6!Yy0-yySH!enl8Ua z$A9xTI!WH~H!c8LE|F3F+Ndd)g}q&mVDQDkr=s+_S- zo6r6aZ6IZZQC3`km_gwMHykbxTMC6Hww!pFRm9d{ML_t4_dE!zr@eH{;^pyFBL|N? zG$A`vzCevx1(R2C&mI2di2L4d$n1Wa^TV6E41emQ3U77rJ@N7jwW-5EX5d~bkAfb) z19O7mp8iR~U*otR^weaQfIr;mNUuW|6UjTx&KRG?k*Ft z_6R+RVN0h^?YfQqrUQ3jNJ?Va)3aA4lxzu%%gv`|`GV`2M-Iy0Q{9n|R*ZdM+Q`Rt zygI*b9lv2{^28Uf8o1)hJ89N+YM?btA3Ox)uL;dqy>8o2cv`!Mi;6(lzBXVtOA#u) z*2U#;0gh*XJDFUh&Zk#m6Vvv%M@_#mM^7osT0;xdVZi$oq=OkaSk9T5*-vEdPdamK zTEy#v-H1^bDsxAz6q+f;HXApud{yv@Q2F+pl%Zi-R)#*sx%W2Z^u&t5NR2_2Y>(hI zf?KDn*ACOwx~p7usi%2$e4&XcyUL|9oTMEOcBLuPEwq5sFPcq zazz0}t2{0^pLD7wq44o>Q&Upp(Ej1WdrlvtV8>rn_U!pBBh%7CyT*_E`*k_=9exDR zJly4f&&$iP+sm@5t5$CQ<4f-qy9N#N<;GY`Qbvzi_TuqBzQQ(1VXK7x%H1cJ>CT@(b|E)=eY#xLX-}PL-YymiCr1{(KFm z9J?XdOXxih=ULh7WClmrC$dN?IL}7Q7V6l4y*qJYM116$4{poh=NzRu@`Ksz&tcO! z;%Jf09vk=5Qq1&;$=?t>rO=#N_gJbx?VEjiW*4&Eih+P4PYcOKekXc$XmfOrogbT-doW;SnlM z#83WIaMjfu7R_#|@8Yo;Pxbo*yVTBq=xx7wL&|RWeRu<#MK}95q2QAD?>`~W-Wi*? zSoGOt=93T{UyQB&B{c9Cq4L_>Lgn?dc#lY|*>1dtp7_}>7ja@iM8IDSV1a)gpv`^@ zd=YVk$>e8I{~I}dUyeomW7!zWu9lfwL)|-e(Nu&mKYi^D`4bj6--W?0^Tum`Z}X1p z7m)v!&BZVcM+x|;1LXso)mTC}NiYizErQTqAz78CEfW0NYGIgmywIe5N_blPyzp!7 zUg1sYfcA*+f%YTeQ|%YR6~QX-2#oMP6XN;;VkEriGr?BWY7iLF_z)sdYY`*S=s;>p zs32(tq7tzSs6!ZBtC2*Nj;C6Gt-v9sOjuk*{VFyd+Vv5yh9$j^@_o^f?EhPIWVsR@ zF}$OMN0zH^E~#&{AwFVD?=La8Z9Z+uM{ERi#J7$*=t6lLZQ0jF$0AU&P=5Be2e}l^ zCLf`t!JgnrS}X4dPb_k+FbZ>pohkccV4hDqK|5XhlybB^*b*kuSy*h$(>GeL7PN!8#oKvm#Vegb>BeWJh z=%kV~#K~otopikgY~E0_EgEKQn6Y7IW@d(lnUjXwd`X-%(1w|rnVA_HW@ct)eEpBk zx$jCxR~}jR_UsvX%aXT7Yt{-bwx)&Q2o0Y)Cd&d%WlQ2ur2#pOO?sv;HVdoYH#~?s zIRiS+)oHGSZ+mW8>f?(A`a{TBm`(fKfH5EW&A*ozhKW{sh|AnixH+r$Ndm%O;*w+n8wlo0dwK-Ffc zvruv3T#U&Ro|T|)9QT*T18cV6@B!ZPYaVV6^e$1m-j?3g?b{mEf!mT;b=EBBrNA6B zJE?-jhDpP@&hH0vjbkG%bwxFX+(KETuEbMea^QYAxrSiXg_?fOel~tVe)E3R;H%&u zaA~k2utV?;(m=33Fh9Vd{ph-RfNqX%v2NS$IKOkh4nGP%b-!CbLo``13CMOo2oWq} zLSuYmGGopy*=~<+!*29$+U}ns%y)%oC$H5>r<3YB+)asbu<`0J@z<+odKZ&~Dq8wC zX_;Aq*@B)TyiOvzysAHE-z6be=wagNVdJslb_-w2VCuC|X%>-b=npm(fycVd$xVf- zVDNo($Po(IcxhysC_EKn{%iq9k)LmVF1vm%tA01};QJ+zBeO8^2|s_%zABMS`5yY+ zgoE#=K#tVG#wUE5eV@I(B%TuT6#2Q~ck>3m4-Gl;h(yCosM7gwXxi^)2Ymk(CcZ{i zZuk@8%Uw~)|LC|T*>pf7;&5{Q54x9?m5cX(bX<9pu9P6KlCmD4`Q$jc{)5{!KwuU# zakY?ga&#kQmXVkKrY23Vt|4P#<7T5S&ZuBxW&Lkl!%5T8#>~mwf|Qk$`#-Ztg@pbm z28^&~TELl~6SKPRh!~`oFUB{&xaBQiJ~!pDU?m2pappAjhUQOnDE(!K6eQo6i*W7$eTZBzHxrBc zHiQ{;{h`zn3*h6Ahm)AK+w57Tzg4;B=^r7{8HgW5v`WCtQb|TkBFN*CsW*Vy36A~@ z#gaoNzW#k6{`T3-)gzb8hYT*LX`^ZFm!SfP=M`Dc*4L zS0De5ClET}>-!&YMhJF)J{F8ToMv{!VkA*I^xQuh)ePDaBx-v!SP8n&Cy>TTn#YRWb$r48UxoMy9=|+ozI?8MgcU$hs-B zk+SQ}zR4W_D-tKplo+1$nRMTS*`~d0AQi(BLQTD>Y+5T?d-H-t1o*1Ib0i8w*+Z(d z0o34_UEov5*?jn58V?-Ch<-aZ6{Tjmn*`vZ-FRRP=a4E!HsSR!8q!cA@ANiZB`9># zw-RPKHER4EN~sjRW%Xjagpg-2DtIUK5kWgN<&iPg0fWl!YJ?F{D+SHIU=;)r4wxdh zji@5KI;f;81#BF?wplkbOT|iZdCy;40pXl&%o%+(Lwx#(v=@1@h`1LKv+SEd3^b+p zucUlA&g#CY6t+<-g+Ef848TgG4#H00!D)oY+23^YegwA4x@S$4b*Aq2I(p2?6-OMLZO+b zVr33)&DNX;8q|p2D|tdw>FB5}@FKV3KG{EPo4&y|D2w=fGWflS?b|pMlgt4p1p7sT zV()oBb6Sf95p2>mn8D{IUB!IzTz0|e#6@l;Pep!OD@er6p(Nya6&uC>1`e`jN=P&! zXRP%(v`%2(3w>3EUIf9jYlXn(rCsHB3*O?B#7Y;dw&Q=_%)X(aDT(an{w(m=1uMVMQONTfvhVZVGhtP9ZJiVlanK|G$=Gld zadc7|1AB62YgT>; zXXb-F_yUYCO~DUJU0B#FnA`V`FU`>oT2B4u-81+RQFA}sb?rW=WoTkgf3gu{X-|E! z8c=g4z5ZKuQuR&f1KX@Pbp6+zUY7CM1M#2|#rYj#_ZT8Sc*ic7*=7Hw zX9e3s_V5x&h-AiFfxUVl(xS+p1OWe~7O)(Ga(zu{~{%{|X zV}Q432{jGx6@3Tz)oLX9to<2RljUe}X2s0*;5mGY>csK@+-l>!7FDr4ydar%RkJ*d z{>BB>1=JYjOm?xdJXAr3zZ0B1quw0?^Q;eTi@2au9y7a1KPF-`LLk$5hHf|f^Dhsg z*ectuIqa_fc=&Dm1kWe!U=UJx7`f3*Z}V6bUXr-}2i!4FxZR0~{w?%i!&|zugYRI1 zRm!p!OjXVb^b;)rB}!5*H**Vmk4h0Fa3x4V#2i9Fl{?_h5d zzWRW@>mk(LY+wy+I^lVuof9tiHShXi6o2-k;(C7h=_u8rhwgcTxqG2wxrT?hdm;Am z%7^Ru>51!!@^e$LherYa@yZJKaoBmVgTzAk&xZi;fwn932Clvi|-BQZjq7s8==`-FMGJriSgT@G;Wu7@U@=GqDQ=u zgYnx0HE!1{^5Eqw(k?2o$=miN%SS8EZWK^u^%i0MxEF;7$P?^30pZu4*%xhwrf(hW z|A?|q_?yO_U}14T(N?@RC-FZ0ad1DOe9bDKql9{&sF_(l%&J&FFlb(nId+A^Ua}l5 z-|EPBg_}m64t=|yCe4UH;LeSzSw2Q-UWa5r*HF7%(|u1)ofA)&0^Lu-k}1N{2EZop z=NgzFe9CGce(DnK`t%6A76t`f1E1KtMyTu`IJkXjMYx}K@z0Da@5=G7Rq%sV_uWEY zEFm88F#_2YriiS5p*I)&qYUFt-r`{CiJ0I+SGniCv^ zy5h`1?@A*vg;)@=1~T9?AQg_p0I$ifRCk-bfjJ~BCglL^rWnO42zE35yS#~HFL zda>tfIwIlu(^9Gl+|Tuld%^RGP}sL|Z#J%wFdReKx3%hl6LtljTTF}#NrK1EMEFaI zPhxL>cvMc7Z69(BV%~v3R0j5KXGjd8Z~+ofEIbJi2CtkmR;2nki=prXz;^e!kfag- zg5d!-e|V#{zCh-8KX@aljjG%V93q9MK`kn8MCVP(l}AI1-bd9TR3p<~Wd?;O+O3A7 z*UjYb>doL}Mudq-2d?fce zdnM3wd=o+r@TgXh72E(r)7(c`1tj0#5Y?Cv)}_o?R2J4(2#g-9{$M^Tu8zU}MD3KN z2N(=~>g1(Us~uwk3~6AzKLmzKiOlgpmTH3RQ!G6sOxSWKm|a2N*DplRE4lfdmFfcO zjCZpC-THJ&T|wXl3B&2gcqio3e1~ydK_KYm!aFF$lbveg))k=Y?3?U&JxzHcuKyI; ziqbdU$#bL<3VsoC3k^~B{vARh`Vj>Lhh%yG3dxexn@qRZIb_MinVJ|tr}Bj+d+K=F z`FHUyN#%=ibz`UCz5kWU7xfyr#>MzNL8khEyZ^Mt^YeW_YEpQ+rd!?=$s@qqT|}fZ z_R_hR!$D`E0x+3+bzsae#4=^!mL;Luzw~VH6+yAr!UY{*Yl|sqfK_UMY$%!<2bI4| zFA)Dch~$Tw)%z40-E?`rwfc^I_q`~{syQh+DhSt}S`jB1wHvIkFl;P`V`i-vD@bEz z@N_j#tR(CdgRYl7VL)++`=ZtAP|fc4rQ`AJXoX`%6*!*A=JG$}QNkRA1}7W3rF4NS z&ywx6dJ;Av)|r7>j<7C6chCTvD}>w<1$C5b;)!E-pc{L*@)%EgVZFEHKgjkvVSLB9 z`Rxbt2XP9Z{5!&)psoUgar|&nD~TXCOuxPUFezbSX|S`jb@wV( z!A;!&czNsWY_q4foz6DdRyqV`E*`m2E09p^iEST*by7E7Rv-4$nyQ!+xGFc=eP12) z4xZK9*S3d;s6a_HJ=X1WqZfwCi)SdUoX6HDtzUnNm=ye zPWJi?xmo8&hlkIX{sQv$cjRHU;kABW167xoLx^YjbinF6YsJ#4nR18x<#EVbsFI<9 zWv1HP;AtA3@Lzp2ZU`M;zm4KTX>Zx5ck-bvQys-bz+Fph@^dww{mAxyE*rhHMs!CS z=X50+eQavl>}nt1V?&&2r<9^jj6xyk%N)NHYQ+3}T5B6j!zRYv>ZA+JFM+^ zFhf=0vloa1ci|wxuIIyeoCbBl@}Q7SkwO*_K1{*(?I%`4$tYQ-goM(<5E5#WzSN@^ z={pq-BEW|3wOmIr$a3W|@p-rqT%tTUkvJmhJ~cRbtS{PCAN}~dg$ko+*~5Sb-0@|e zu00x;T>HFQ24E00adSEta1+CYSFNth)%)y9L~q7yOxqoMxq%klT>E#*9%VNY6+Ip1 zkL4cMT+O~kOO!XSGw}94CkOJ*RB&F`7uEDgW7?ug1ZnXucDLKz~DEuq~rCc%0Ai|}gbLA=E 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 z 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 From e3abe9b70ff8b53161aa273f829020b2ef3b87a3 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 22:37:15 +0800 Subject: [PATCH 173/175] update readme --- README.md | 155 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 112 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index e6212c73d..76795b23c 100644 --- a/README.md +++ b/README.md @@ -1,79 +1,148 @@ webmagic --------- - [![Build Status](https://travis-ci.org/code4craft/webmagic.png?branch=master)](https://travis-ci.org/code4craft/webmagic) -####*一个网络爬虫工具包* +>webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。作者曾经在前公司进行过一年的垂直爬虫的开发,webmagic就是为了解决爬虫开发的一些重复劳动而产生的框架。 -webmagic的发起源于工作中的需要,其定位是帮助开发者更便捷的开发一个垂直的网络爬虫。 +>web爬虫是一种技术,webmagic致力于将这种技术的实现成本降低,但是出于对资源提供者的尊重,webmagic不会做反封锁的事情,包括:验证码破解、代理切换、自动登录、抓取静态资源等。 -webmagic的功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),开发者可以便捷的使用xpath和正则表达式进行链接和内容的提取,只需编写少量代码即可完成一个定制爬虫。 +webmagic的主要特色: -###特色### +* 核心简单但是涵盖爬虫的全部流程,灵活而强大,也是学习爬虫入门的好材料。 +* 提供丰富的抽取页面API。 +* 无配置,但是可通过POJO+注解形式实现一个爬虫。 +* 支持多线程。 +* 支持分布式。 +* 支持爬取js动态渲染的页面。 +* 无框架依赖,可以灵活的嵌入到项目中去。 -* ####垂直爬虫#### - webmagic着重于页面抽取的工作。开发者可以使用xpath和正则表达式进行链接和内容的提取,支持链式API调用,以及单复数转换。 +webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: - String content = page.getHtml().xpath("//div[@class='body']").regex("这段话比较重要(.*)").toString(); - -* ####嵌入式&无配置#### - webmagic与其他Full-Stack的框架不同,没有配置文件,大部分功能都通过简单的API调用完成。webmagic以jar包的形式存在,并且不依赖任何框架,在程序可以随处进行调用。 +python爬虫 **scrapy** [https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) - 以下是爬取oschina博客的一段代码: - - Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); - -* ####可扩展#### - 参考[`scrapy`](https://github.com/scrapy/scrapy)的设计,webmagic将爬虫的扩展点分为Processor、Schedular、Downloader、Pipeline三个模块,可以通过扩展这些接口实现强大的扩展功能。如可以通过多个Spider实现多线程抓取;可以通过扩展Schedular实现断点续传乃至于分布式爬虫;可以通过扩展Pipeline实现业务可定制的持久化功能。webmagic的架构原理见作者的一篇文章:[webmagic的设计机制及原理-如何开发一个Java爬虫](http://my.oschina.net/flashsword/blog/145796) +Java爬虫 **Spiderman** [https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) + +## 快速开始 + +### 使用maven + +webmagic使用maven管理依赖,你可以直接下载webmagic源码进行编译: + + git clone https://github.com/code4craft/webmagic.git + cd webmagic + mvn clean install -![image](http://code4craft.github.io/images/posts/webmagic-0.1.0.png) +安装后,在项目中添加对应的依赖即可使用webmagic: + + + us.codecraft + webmagic-core + 0.2.0 + + + us.codecraft + webmagic-extension + 0.2.0 + + +#### 项目结构 ------- +webmagic主要包括两个包: -###Get Started +* **webmagic-core** + + webmagic核心部分,只包含爬虫基本模块和基本抽取器。webmagic-core的目标是成为网页爬虫的一个教科书般的实现。 + +* **webmagic-extension** + + webmagic的扩展模块,提供一些更方便的编写爬虫的工具。包括注解格式定义爬虫、JSON、分布式等支持。 -webmagic定制的核心是PageProcessor接口。 +webmagic还包含两个可用的扩展包,因为这两个包都依赖了比较重量级的工具,所以从主要包中抽离出来: -项目使用maven托管,如果没用maven的可以去[http://git.oschina.net/flashsword20/webmagic-bin](http://git.oschina.net/flashsword20/webmagic-bin)库下载依赖包(这个仓库代码没有实时同步更新,不过依赖应该不会有变化)。 +* **webmagic-saxon** + + webmagic与Saxon结合的模块。Saxon是一个XPath、XSLT的解析工具,webmagic依赖Saxon来进行XPath2.0语法解析支持。 + +* **webmagic-selenium** + + webmagic与Selenium结合的模块。Selenium是一个模拟浏览器进行页面渲染的工具,webmagic依赖Selenium进行动态页面的抓取。 -例如,我们要实现一个简单的通用爬虫SimplePageProcessor,代码如下: +在项目中,你可以根据需要依赖不同的包。 - public class SimplePageProcessor implements PageProcessor { +### 不使用maven - private String urlPattern; +不使用maven的用户,可以下载这个二进制打包版本(感谢[oschina](http://www.oschina.net/)): - private static final String UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"; + git clone http://git.oschina.net/flashsword20/webmagic-bin.git - private Site site; +在**bin/lib**目录下,有项目依赖的所有jar包,直接在IDE里import即可。 - public SimplePageProcessor(String startUrl, String urlPattern) { - this.site = Site.me().setStartUrl(startUrl). - setDomain(UrlUtils.getDomain(startUrl)).setUserAgent(UA); - this.urlPattern = "("+urlPattern.replace(".","\\.").replace("*","[^\"'#]*")+")"; +### 第一个爬虫 - } +#### 定制PageProcessor + +PageProcessor是webmagic-core的一部分,定制一个PageProcessor即可实现自己的爬虫逻辑。以下是抓取osc博客的一段代码: + + public class OschinaBlogPageProcesser implements PageProcessor { + + private Site site = Site.me().setDomain("my.oschina.net") + .addStartUrl("http://my.oschina.net/flashsword/blog"); @Override public void process(Page page) { - List requests = page.getHtml().links().regex(urlPattern).toStrings(); - //调用page.addTargetRequests()方法添加待抓取链接 - page.addTargetRequests(requests); - //xpath方式抽取 - page.putField("title", page.getHtml().xpath("//title")); - //sc表示使用Readability技术抽取正文 - page.putField("content", page.getHtml().smartContent()); + List links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").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()); } @Override public Site getSite() { - //定义抽取站点的相关参数 return site; + + } + + public static void main(String[] args) { + Spider.create(new OschinaBlogPageProcesser()) + .pipeline(new ConsolePipeline()).run(); } } - -调用这个爬虫的代码如下: - Spider.create(new SimplePageProcessor("http://my.oschina.net/", "http://my.oschina.net/*/blog/*")).run(); +这里通过page.addTargetRequests()方法来增加要抓取的URL,并通过page.putField()来保存抽取结果。page.getHtml().xpath()则是按照某个规则对结果进行抽取,这里抽取支持链式调用。调用结束后,toString()表示转化为单个String,all()则转化为一个String列表。 + +Spider是爬虫的入口类。Pipeline是结果输出和持久化的接口,这里ConsolePipeline表示结果输出到控制台。 + +执行这个main方法,即可在控制台看到抓取结果。webmagic默认有3秒抓取间隔,请耐心等待。 + +#### 使用注解 + +webmagic-extension包括了注解方式编写爬虫的方法,只需基于一个POJO增加注解即可完成一个爬虫。以下仍然是抓取oschina博客的一段代码,功能与OschinaBlogPageProcesser完全相同: + + @TargetUrl("http://my.oschina.net/flashsword/blog/\\d+") + public class OschinaBlog { + + @ExtractBy("//title") + private String title; + + @ExtractBy(value = "div.BlogContent",type = ExtractBy.Type.Css) + private String content; + + @ExtractBy(value = "//div[@class='BlogTags']/a/text()", multi = true) + private List tags; + + public static void main(String[] args) { + OOSpider.create( + Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), + new ConsolePageModelPipeline(), OschinaBlog.class).run(); + } + } + +这个例子定义了一个Model类,Model类的字段'title'、'content'、'tags'均为要抽取的属性。这个类在Pipeline里是可以复用的。 + +### 详细文档 + +见[webmagic manual.md](https://github.com/code4craft/webmagic/blob/master/webmagic%20manual.md)。 ### 示例 From 96093bf1095bf557925d1a75e2dd2c98d6e56c9d Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 22:42:56 +0800 Subject: [PATCH 174/175] remove duplicate doc --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 76795b23c..66be4c46c 100644 --- a/README.md +++ b/README.md @@ -154,12 +154,4 @@ webmagic-samples目录里有一些定制PageProcessor以抽取不同站点的例 webmagic遵循[Apache 2.0协议](http://opensource.org/licenses/Apache-2.0) -### 致谢 - -webmagic的架构和设计参考了以下两个项目,感谢以下两个项目的作者: - -python爬虫 **scrapy** [https://github.com/scrapy/scrapy](https://github.com/scrapy/scrapy) - -Java爬虫 **Spiderman** [https://gitcafe.com/laiweiwei/Spiderman](https://gitcafe.com/laiweiwei/Spiderman) - From 61debaf15552c0a42e2ecea07fd4e498b8f87f67 Mon Sep 17 00:00:00 2001 From: "yihua.huang" Date: Fri, 9 Aug 2013 22:52:30 +0800 Subject: [PATCH 175/175] update release notes --- release-note.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/release-note.md b/release-note.md index 1fc33ce09..d78963ce9 100755 --- a/release-note.md +++ b/release-note.md @@ -21,8 +21,9 @@ Release Notes private List tags; public static void main(String[] args) { - OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog") - ,new ConsolePageModelPipeline(), OschinaBlog.class).run(); + OOSpider.create(Site.me().addStartUrl("http://my.oschina.net/flashsword/blog"), + new ConsolePageModelPipeline(), OschinaBlog.class). + scheduler(new RedisScheduler("127.0.0.1")).thread(5).run(); } }