1.分析页面结构
从上图分析页面结构,很明显,这是一个列表页,我们应该将详情页作为落地页
分析落地页,我们主要抓取内容和标题,但是在你实现的过程中可以发现,某些详情页是没有标题的。
思路:我们大致思路就是从抓取列表页的URL放入List中,然后进入详情页,将详情页作为落地页来抓取标题和文章内容
2.编码实现
import org.jsoup.Jsoup
//抓取列表页所有URL
def list = []
Jsoup.connect("http://daily.zhihu.com/").get().select("body > div.main-content > div > div.main-content-wrap > div > div > div > div > a").each {
def url = it.attr("href")
list.add("http://daily.zhihu.com"+url)
}
//遍历URL,抓取所需信息
list.each {it->
def temp = Jsoup.connect(it).get()
def title
def text
def url = it
temp.each {
title = temp.select("body > div.main-wrap.content-wrap > div.content-inner > div > h2").text()
temp.select("body > div.main-wrap.content-wrap > div.content-inner > div > div > div.content > p").each {details->
text += details.text()
}
}
println "url:$url"
println "title:$title"
println "text:$text"
}
分析:
第一步,
Jsoup.connect(url).get().select(selector):选取列表中每个单项的选择器,得到<a>标签
遍历所有<a>标签,得到href属性,将其加入list
第二步,
遍历list,取到temp(Element类实例,查看Jsoup API可知),遍历temp,根据相应的选择器,取得title,以及文本。
注意,这里的文本我们又进行了一次遍历,因为落地页上的文本内容是很多个<p>标签,我们需要取到所有<p>标签文本值。
3.结果
有些地方没有解释太清楚,见谅!