• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

WebMagic Selectable抽取元素

JAVA web前端中文站 3年前 (2017-04-25) 1852次浏览 已收录 0个评论
文章目录[隐藏]

昨天用的?WebMagic 最新版本,还存在一些问题。导致控制台报错,报错内容为找不到 jsoup 类文件。详情大家可以到 https://github.com/code4craft/webmagic/issues/533 查看。

今天我们将使用?webmagic 的 Selectable 网页获取内容。

webmagic 获取网页内容

Selectable 相关的抽取元素链式 API 是 WebMagic 的一个核心功能。使用 Selectable 接口,你可以直接完成页面元素的链式抽取,也无需去关心抽取的细节。

在 WebMagic Xsoup 和 自定义 Pipeline 这篇文章的例子中可以看到,page.getHtml()返回的是一个 Html 对象,它实现了 Selectable 接口。这个接口包含一些重要的方法,分为两类:抽取部分和获取结果部分。

抽取部分 API

方法 说明 示例
xpath(String xpath) 使用 XPath 选择 html.xpath(“//div[@class=’title’]”)
$(String selector) 使用 Css 选择器选择 html.$(“div.title”)
$(String selector,String attr) 使用 Css 选择器选择 html.$(“div.title”,”text”)
css(String selector) 功能同$(),使用 Css 选择器选择 html.css(“div.title”)
links() 选择所有链接 html.links()
regex(String regex) 使用正则表达式抽取 html.regex(“/(./*?)/”)
regex(String regex,int group) 使用正则表达式抽取,并指定捕获组 html.regex(“/(./*?)/”,1)
replace(String regex, String replacement) 替换内容 html.replace(“/”,””)

这部分抽取 API 返回的都是一个 Selectable 接口,意思是说,抽取是支持链式调用的。

例如,我现在要抓取 github 上所有的 Java 项目,这些项目可以在 https://github.com/search?l=Java&p=1&q=stars%3A%3E1&s=stars&type=Repositories 搜索结果中看到。

为了避免抓取范围太宽,我指定只从分页部分抓取链接。这个抓取规则是比较复杂的,要怎么写呢?

WebMagic Selectable 抽取元素

首先看到页面的 html 结构是这个样子的:

WebMagic Selectable 抽取元素

那么可以先用 CSS 选择器提取出这个 div,然后在取到所有的链接。为了保险起见,我再使用正则表达式限定一下提取出的 URL 的格式,那么最终的写法是这样子的:

 List<String> urls = page.getHtml().css("div.pagination").links().regex(".*/search//?l=java.*").all();

然后,我们可以把这些 URL 加到抓取列表中去:

 List<String> urls = page.getHtml().css("div.pagination").links().regex(".*/search//?l=java.*").all(); page.addTargetRequests(urls);

是不是比较简单?除了发现链接,Selectable 的链式抽取还可以完成很多工作。

获取结果的 API

当链式调用结束时,我们一般都想要拿到一个字符串类型的结果。这时候就需要用到获取结果的 API 了。我们知道,一条抽取规则,无论是 XPath、CSS 选择器或者正则表达式,总有可能抽取到多条元素。WebMagic 对这些进行了统一,你可以通过不同的 API 获取到一个或者多个元素。

方法 说明 示例
get() 返回一条 String 类型的结果 String link= html.links().get()
toString() 功能同 get(),返回一条 String 类型的结果 String link= html.links().toString()
all() 返回所有抽取结果 List?links= html.links().all()
match() 是否有匹配结果 if (html.links().match()){ xxx; }

例如,我们知道页面只会有一条结果,那么可以使用 selectable.get()或者 selectable.toString()拿到这条结果。

这里 selectable.toString()采用了 toString()这个接口,是为了在输出以及和一些框架结合的时候,更加方便。因为一般情况下,我们都只需要选择一个元素!

selectable.all()则会获取到所有元素。

好了,到现在为止,在回过头看看 WebMagic Xsoup 和 自定义 Pipeline 中的 GithubRepoPageProcessor,可能就觉得更加清晰了吧?指定 main 方法,已经可以看到抓取结果在控制台输出了。


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:WebMagic Selectable 抽取元素
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址