• go语言,爬取百度贴吧指定贴所有内容


    初级爬虫,为了学习一下常用的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 即可 。
    }
    

      

  • 相关阅读:
    D. Longest Subsequence
    线段树入门HDU_1754
    poj_2503(map映射)
    HDU_4826
    poj_2251
    day 44 单表查询,多表查询
    day43 字段的修改、添加和删除,多表关系(外键),单表详细操作(增删改查)
    day 42 数据库的配置、数据库与表的一些剩余操作、用户操作、数据库表的引擎、数据库的模式、mysql支持的数据类型、约束
    day41 数据库介绍、数据库基本操作
    day 40 线程队列、线程定时器、进程池和线程池、同步与异步、用多线程来写socket服务端与客户端
  • 原文地址:https://www.cnblogs.com/Geek-xiyang/p/10124749.html
Copyright © 2020-2023  润新知