老狗啃爬虫-便捷的元素定位之Selectable
摘要:
无论是Jsoup还是Xsoup,都是为了实现HTML页面文件的解析和数据定位,还有正则表达式,根据这些技术原理,WebMagic进一步集成浓缩,将这些我们在爬虫开发过程中使用频率很高的功能,抽提出一个叫Selectable的接口。Selectable可以使我们在操作中简单快捷的完成页面元素的提取,不去关心具体操作细节,而把更多的精力用在爬虫业务的实现上
书接上文,我们捋过,无论是Jsoup还是Xsoup,都是为了实现HTML页面文件的解析和数据定位,还有正则表达式,根据这些技术原理,WebMagic进一步浓缩提炼,将这些我们在爬虫开发过程中使用频率很高的功能,抽提出一个叫Selectable的接口。
Selectable可以使我们在操作中简单快捷的完成页面元素的提取,不去关心具体操作细节,而把更多的精力用在爬虫业务的实现上。
在回顾下我们之前写的那个测试爬虫,代码里我们是通过page.getHtml()获取到一个Html对象,这个对象是实现了Selectable接口的,于是乎,Jsoup、Xsoup等等这些功能,我们都可以直接使用了,接下来我们看看这个Selectable,主要都有些什么方法。
Selectable之提取元素(数据定位)
下面的这几个方法,主要功能的用于数据元素的提取定位操作,这部分API返回的其实是一个实现了Selectable接口的对象,我们来看看:
方法 | 说明 | 示例 |
---|---|---|
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(“\”,””) |
根据上面这些方法,无论是抓举数据还是提取链接,我们都可以避免在页面穷尽的遍历,方便快捷的将抓取目标精准的定位到具体的元素上,将更多的精力配置在抓取的具体业务逻辑上。
Selectable之数据值获取
一般说执行完上边的提取定位操作,我们就可以拿到元素值,Selectable接口的以下方法,即可以满足这个功能。
方法 | 说明 | 示例 |
---|---|---|
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; } |
根据这些方法的特点,我们可以发现,如果是单个元素,只有一个结果,我们就可以用.get()方法或.toString(),获取这个元素值;如果是多个元素取值,我们就用.all()方法,即可得到一个链表集合。有时候得到这个元素值并不是最终目的,在爬虫运算的逻辑里,经常会有URL链接对比校验的工作,这里也直接给抽出了一个match()方法,非常方便。
总结
看完这些接口的方法,我们在回顾之前讲的Jsoup、Xsoup等等,思路应该会非常明晰了,对,知道这些基础,WebMagic框架的使用,爬虫程序的开发肯定会更加得心应手。
回头再看看之前的代码:
String title = page.getHtml().xpath("//*[@id=\"content\"]/div/div[1]/div[2]/div[1]/h1/a/text()").get();
是不是感觉通过这样的方式得到title值,非常度便捷高效。
当然,其实Selectable接口还有很多方法,我们只是列举了一些比较典常用的,其他功能,以后在开发学习的过程中,我们再慢慢发掘。