摘要:今天我决定学习如何使用做网页链接的文本和图像提取。准备基本的知识是必需的,安装最新的开发工具包,可以是或。第步启用使用来进行依赖注入。上下文和依赖注入是一个规范,能够使依赖注入在的项目中。在文件夹下建一个名为中一个新的文件。
编者注:我们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 18 天的内容。
今天我决定学习如何使用Java做网页链接的文本和图像提取。在大多数内容发现网站上(如Prismatic)这是一个非常常见的需求,今天就是学习如何使用一个名为boilerpipe的Java库来完成这个任务。
准备基本的Java知识是必需的,安装最新的Java开发工具包(JDK ),可以是OpenJDK 7或Oracle JDK 7。
注册一个OpenShift帐户,它是完全免费的,可以分配给每个用户1.5 GB的内存和3 GB的磁盘空间。
安装RHC客户端工具,需要有ruby 1.8.7或更新的版本,如果已经有ruby gem,输入 sudo gem install rhc ,确保它是最新版本。要更新RHC的话,执行命令 sudo gem update rhc,如需其他协助安装RHC命令行工具,请参阅该页面: https://www.openshift.com/developers/rhc-client-tools-install
通过 rhc setup 命令设置您的OpenShift帐户,此命令将帮助你创建一个命名空间,并上传你的SSH keys到OpenShift服务器。
首先从创建示例应用程序开始,把该应用称作 newsapp。
$ rhc create-app newsapp jbosseap
然后可以使用如下命令:
$ rhc create-app newsapp jbosseap -g medium
这样会创建一个应用程序容器,设置好所有需要的SELinux政策和cgroup配置,OpenShift也将创建一个私人git仓库并克隆到本地。最后,OpenShift会给外界提供一个DNS,该应用程序将在http://newsapp-{domain-name}.rhcloud.com/ 下可以访问(将 domain-name 更换为自己的域名)。
第2步:添加Maven依赖在 pom.xml 文件里添加如下依赖:
de.l3s.boilerpipe boilerpipe 1.2.0 xerces xercesImpl 2.9.1 net.sourceforge.nekohtml nekohtml 1.9.13
同时也需要加一个新的库:
boilerpipe-m2-repo http://boilerpipe.googlecode.com/svn/repo/ true false
通过更新 pom.xml 文件里的几个特性将Maven项目更新到Java 7:
1.7 1.7
现在就可以更新Maven项目了(右键单击>Maven>更新项目)。
第3步:启用CDI使用CDI来进行依赖注入。CDI、上下文和依赖注入是一个Java EE 6规范,能够使依赖注入在Java EE 6的项目中。
在 src/main/webapp/WEB-INF 文件夹下建一个名为beans.xml中一个新的XML文件。更换beans.xml中的以下内容:
第4步:创建Boilerpipe内容提取服务
现在创建一个Boilerpipe内容提取服务的服务类,这个类会用一个url,从这个url中提取标题和文章内容。
import java.net.URL; import java.util.Collections; import java.util.List; import com.newsapp.boilerpipe.image.Image; import com.newsapp.boilerpipe.image.ImageExtractor; import de.l3s.boilerpipe.BoilerpipeExtractor; import de.l3s.boilerpipe.document.TextDocument; import de.l3s.boilerpipe.extractors.ArticleExtractor; import de.l3s.boilerpipe.extractors.CommonExtractors; import de.l3s.boilerpipe.sax.BoilerpipeSAXInput; import de.l3s.boilerpipe.sax.HTMLDocument; import de.l3s.boilerpipe.sax.HTMLFetcher; public class BoilerpipeContentExtractionService { public Content content(String url) { try { final HTMLDocument htmlDoc = HTMLFetcher.fetch(new URL(url)); final TextDocument doc = new BoilerpipeSAXInput(htmlDoc.toInputSource()).getTextDocument(); String title = doc.getTitle(); String content = ArticleExtractor.INSTANCE.getText(doc); final BoilerpipeExtractor extractor = CommonExtractors.KEEP_EVERYTHING_EXTRACTOR; final ImageExtractor ie = ImageExtractor.INSTANCE; Listimages = ie.process(new URL(url), extractor); Collections.sort(images); String image = null; if (!images.isEmpty()) { image = images.get(0).getSrc(); } return new Content(title, content.substring(0, 200), image); } catch (Exception e) { return null; } } }
上述代码执行以下操作:
首先在给定的url中读取文件
然后解析HTML文档并返回TextDocument
接下来从文本文件中提取标题
最后从文本中提取内容,返回一个应用的值对象的新实例(value object)
第5步:启用JAX-RS为启用JAX-RS,建立一个扩展 javax.ws.rs.core.Application 的类,并通过如下所示的 javax.ws.rs.ApplicationPath 注释指定应用程序路径。
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/api/v1") public class JaxrsInitializer extends Application{ }第6步:创建ContentExtractionResource
创建ContentExtractionResource类,它会返回一个JSON内容对象。创建一个名为ContentExtractionResource的新类,并用如下所示的内容替换:
import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import com.newsapp.service.BoilerpipeContentExtractionService; import com.newsapp.service.Content; @Path("/content") public class ContentExtractionResource { @Inject private BoilerpipeContentExtractionService boilerpipeContentExtractionService; @GET @Produces(value = MediaType.APPLICATION_JSON) public Content extractContent(@QueryParam("url") String url) { return boilerpipeContentExtractionService.content(url); } }部署到OpenShift
最后,更改部署到OpenShift
$ git add . $ git commit -am "NewApp" $ git push
在代码push和部署完成后,我们可以在 http://newsapp-{{domain-name}.rhcloud.com 查看正在运行的应用程序。我的示例应用程序展示如下。
今天就这些,欢迎反馈。
原文 Day 18: BoilerPipe--Article Extraction for Java Developers
翻译整理 SegmentFault
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64013.html
摘要:是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题标签摘要图片视频等信息,且支持中文网页。 爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会: 网站的 防抓取 机制。你要尽可能将自己伪装成一个人,骗过对方的服务器反爬验证。 网站的 内容提取 。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。 第一点没什么捷径可走,套路见得多...
摘要:类似地,一天中的时间,比如,可以使用类表示。合并日期和时间这个复合类名叫,是和的合体。对于最常见的用例,日期和时间已经提供了大量预定义的。你甚至还可以创建这样的,它使用的历法系统,以相对于格林尼治时间的偏差方式表示日期时间。 一、LocalDate、LocalTime、Instant、Duration 以及 Period 1.使用 LocalDate 和 LocalTime 创建一个L...
摘要:自从年推出标准第版以来,正则表达式已成为语言的一部分。最后,如果在正则表达式中使用了命名捕获组,则将它们放在属性中。支持与相同语法的命名组已经模仿了的正则表达式语法。下面是一个例子此正则表达式在句子中查找连续的重复单词。 翻译:疯狂的技术宅原文:https://www.smashingmagazine.... 本文首发微信公众号:jingchengyideng欢迎关注,每天都给你推...
摘要:这个月的天数是否事闰年似地,一天中的时间,比如,可以使用类表示。使用静态方法,你可以实现这一目的合并日期和时间这个复合类名叫,是和的合体。对于最常见的用例,日期和时间已经提供了大量预定义的。Java的API提供了很多有用的组件,能帮助你构建复杂的应用。不过,Java API也不总是完美的。我们相信大多数有经验的程序员都会赞同Java 8之前的库对日期和时间的支持就非常不理想。然而,你也不用太...
阅读 1536·2023-04-25 18:56
阅读 1483·2021-09-29 09:34
阅读 1708·2021-09-22 15:51
阅读 3482·2021-09-14 18:03
阅读 1159·2021-07-23 17:54
阅读 2017·2019-08-29 18:38
阅读 2899·2019-08-29 12:38
阅读 609·2019-08-26 13:41