初级爬虫,为了学习一下常用的goquery。
goquery 配置
go get https://github.com/PuerkitoBio/goquery
会提示不支持https方式
解决方案:
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/net.git
获取net 包后,应该就可以使用了
或者通过clone获取goquery
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:
")
//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 即可 。
}