Python爬蟲工程師有個經常使用的提取數據的庫BeautifulSoup,而在Golang語言也有一個對應的庫soup,因爲我比較喜歡Python寫爬蟲因此天然而然的就想到了soup,這篇文章就是就來體驗一下它。html
soup是第三方庫,須要手動安裝:git
❯ go get github.com/anaskhan96/soup
複製代碼
就如以前的練習,咱們是要定義頭信息的,可是soup這個庫只開放了Get方法接收url參數。不過其餘soup也是能夠定義Header和Cookie的,能夠改爲這樣:github
import (
"fmt"
"log"
"strconv"
"strings"
"time"
"github.com/anaskhan96/soup"
)
func fetch(url string) soup.Root {
fmt.Println("Fetch Url", url)
soup.Headers = map[string]string{
"User-Agent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
}
source, err := soup.Get(url)
if err != nil {
log.Fatal(err)
}
doc := soup.HTMLParse(source)
return doc
}
複製代碼
此次再也不用內置的net/http
這個包了。soup支持直接設置Headers(以及Cookies)的值,也能夠實現自定義頭信息和Cookie,而後就能夠soup.Get(url)
了,而後用soup.HTMLParse
就能夠得到文檔對象了。golang
而後再看看豆瓣電影Top250單個條目的部分相關的HTML代碼:bash
<ol class="grid_view">
<li>
<div class="item">
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救贖</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飛(港) / 刺激1995(臺)</span>
</a>
<span class="playable">[可播放]</span>
</div>
</div>
</div>
</li>
....
</ol>
複製代碼
仍是原來的需求:得到條目ID和標題。此次須要把parseUrls的邏輯改爲使用soup的版本:fetch
func parseUrls(url string, ch chan bool) {
doc := fetch(url)
for _, root := range doc.Find("ol", "class", "grid_view").FindAll("div", "class", "hd") {
movieUrl, _ := root.Find("a").Attrs()["href"]
title := root.Find("span", "class", "title").Text()
fmt.Println(strings.Split(movieUrl, "/")[4], title)
}
time.Sleep(2 * time.Second)
ch <- true
}
複製代碼
能夠感覺到和goquery都用了Find這個方法名字,可是參數形式不同,須要傳遞三個:「標籤名」、「類型」、「具體值」。若是有多個可使用FindAll(Find是找第一個)。若是想要找屬性的值須要用Attrs方法,從map裏面得到。google
得到文本仍是用Text方法。另外它內有goquery那樣的Each方法,須要手動寫一個for range
格式的循環。url
經過這個爬蟲算是基本瞭解了這個庫,我以爲整體上soup是足夠用的spa
完整代碼能夠在這個地址找到。code