第一个爬虫 Groovy + Jsoup(神器) 爬取知乎日报

时间:2022-06-12 20:08:07

1.分析页面结构

第一个爬虫 Groovy + Jsoup(神器) 爬取知乎日报

从上图分析页面结构,很明显,这是一个列表页,我们应该将详情页作为落地页

第一个爬虫 Groovy + Jsoup(神器) 爬取知乎日报

分析落地页,我们主要抓取内容和标题,但是在你实现的过程中可以发现,某些详情页是没有标题的。

思路:我们大致思路就是从抓取列表页的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.结果

第一个爬虫 Groovy + Jsoup(神器) 爬取知乎日报



有些地方没有解释太清楚,见谅!