go語言,爬取百度貼吧指定貼全部內容

初級爬蟲,爲了學習一下經常使用的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 便可 。
}
相關文章
相關標籤/搜索