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 便可 。
}
相关文章
相关标签/搜索