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/httpsoup.Get(url)soup.HTMLParse
而后再看看豆瓣电影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
for range
后记
经过这个爬虫算是基本了解了这个库,我以为整体上soup是足够用的spa
代码地址
完整代码能够在这个地址找到。code