初級爬蟲,爲了學習一下經常使用的goquery。html
goquery 配置git
go get https://github.com/PuerkitoBio/goquerygithub
會提示不支持https方式golang
解決方案:dom
mkdir -p $GOPATH/src/golang.org/x性能
cd $GOPATH/src/golang.org/x學習
git clone https://github.com/golang/net.git測試
獲取net 包後,應該就可使用了url
或者經過clone獲取goqueryspa
git clone git@github.com:PuerkitoBio/goquery.git
個人goquery在$GOPATH/src/github.com/PuerkitoBio/goquery
使用的時候直接
import "github.com/PuerkitoBio/goquery"
goquery 使用
聽說和jQuery相似。
待補吧。算是督促下進度。
1.解析操做的學習 (完成)
2.若是遍歷dom樹如何避開陷阱 (完成) 規劃路線
3.分離 貼子中樓層,樓中樓。貼子有惟一ID 已經體如今url中。 樓和樓中樓應該也有惟一ID。
4.回覆中有圖片的狀況,下載or跳過。
5.做爲解析器,如何融入項目
func GetUrlDocAndRetNxtUrl(){ file := "urltxt" fout,err := os.Create(file) defer fout.Close() if err!=nil{ fmt.Println(file,err) return } doc,err := goquery.NewDocument("https://tieba.baidu.com/p/5976430861") //建立了html的dom對象。 if err!=nil{ log.Fatal(err) } //經過find a標籤中的下一頁 。 //或者直接構造 oldurl?pn=pagenum 便可 。
return nxturl; }
尚未測試。。
測試好的代碼以下,網頁格式在註釋。
開始時候忘記了CSS class 空格分隔時 表示有多個class屬性,誤覺得是一種帶有空格的class屬性,浪費了不少時間。
未區分錯誤和到達尾頁狀況 待補。
不該該每次經過url建立對象,多一次訪問,性能浪費。應該設置傳入對象。待補。
也能夠經過網頁的返回文檔構造對象,而後再去進行解析操做。
response, err := http.Get(url)
//使用goquery解析response響應體得到html文檔
doc err := goquery.NewDocumentFromReader(response.Body)
package parse import ( "fmt" "github.com/PuerkitoBio/goquery" "os" "log" // "strings" ) func GetUrlDocAndRetNxtUrl(url string) string{ if url == ""{ url = "https://tieba.baidu.com/p/5976430861" } file := "urltxt" fout,err := os.Create(file) defer fout.Close() if err!=nil{ fmt.Println(file,err) return "" } doc,err := goquery.NewDocument(url) //建立了html的dom對象。 if err!=nil{ log.Fatal(err) return "" } fmt.Println("html-text-page_list:\n") //fmt.Println(doc.Html()) /* <li class="l_pager pager_theme_4 pb_list_pager"> <span class="tP">1</span> <a href="/p/5976430861?pn=2">2</a> <a href="/p/5976430861?pn=3">3</a> <a href="/p/5976430861?pn=4">4</a> <a href="/p/5976430861?pn=5">5</a> <a href="/p/5976430861?pn=6">6</a> <a href="/p/5976430861?pn=7">7</a> <a href="/p/5976430861?pn=8">8</a> <a href="/p/5976430861?pn=9">9</a> <a href="/p/5976430861?pn=10">10</a> <a href="/p/5976430861?pn=2">下一頁</a> <a href="/p/5976430861?pn=15">尾頁</a> </li> */ fmt.Println(doc.Find(".pb_list_pager").Html()) tmp := doc.Find(".pb_list_pager").Find("a").Eq(-2)//Last().Prev(); //fmt.Println(tmp.Html()) //fmt.Println(tmp.Attr("href")) if tmp.Text() == "下一頁"{ nxturl,err := tmp.Attr("href")//若是找不到 屬性 1.尾頁,2.頁面自己有問題 如今只處理尾頁問題 if err!=true{ return "" } nxturl = "tieba.baidu.com"+nxturl; fmt.Println(nxturl) //write file //此處分離樓中樓 和 樓層內容 } return "" //經過find a標籤中的下一頁 。 或者直接構造 ?pn=pagenum 便可 。 }