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.结果
有些地方没有解释太清楚,见谅!