用Golang寫爬蟲(四) - 使用soup

Python爬蟲工程師有個經常使用的提取數據的庫BeautifulSoup,而在Golang語言也有一個對應的庫soup,因爲我比較喜歡Python寫爬蟲因此天然而然的就想到了soup,這篇文章就是就來體驗一下它。html

安裝soup

soup是第三方庫,須要手動安裝:git

❯ go get github.com/anaskhan96/soup
複製代碼

使用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">&nbsp;/&nbsp;The Shawshank Redemption</span>
            <span class="other">&nbsp;/&nbsp;月黑高飛(港)  /  刺激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

相關文章
相關標籤/搜索