golang 爬虫

在工作之余学习golang。
菜鸟。
无职转生实在更新太慢,于是想去看一下小说,小说的网站在手机上不太方便。于是简单的用go写了爬虫爬取该小说。没有用到goroutine,所以爬取其实不太快。
goquery是go写的一个类似于jquery的库。还挺好用。
代码如下:

package main

import (
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"regexp"
	"strconv"
	"strings"
)

func main(){
	url := "http://www.bbzayy.com/ldks/9181/"
	resp,err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	bytes,err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	str := string(bytes)
	doc, err := goquery.NewDocumentFromReader(strings.NewReader(str))
	if err != nil {
		log.Fatal(err)
	}

	//定义一个map
	storyHref := make(map[int]string)
	doc.Find("body > div.container > div.row.row-section > div > div:nth-child(4) > ul > li > a").Each(func(i int, s *goquery.Selection) {
		
		content,_ := s.Attr("href")
		storyHref[i] = content
		fmt.Printf("%d: %s\n", i, content)
	})
	f, err := os.Create("小说" + ".txt")
	for i:=0;i<313;i++{
		dUrl := "http://www.bbzayy.com"+storyHref[i]
		for j := 1;j<=2; j++{
			dUrls := dUrl[0 : len(dUrl)-5]+"_"+strconv.Itoa(j)+".html"
			fmt.Println(dUrls)
			res,err := http.Get(dUrls)
			if err != nil {
				panic(err)
			}
			defer res.Body.Close()

			bytet,err := ioutil.ReadAll(res.Body)
			if err != nil {
				panic(err)
			}
			content := string(bytet)
			content = TrimHtml(content)
			doct, err := goquery.NewDocumentFromReader(strings.NewReader(content))
			if err != nil {
				log.Fatal(err)
			}
			//定义一个map
			contents := doct.Find("#content").Text()
			buf := []byte(contents)
			f.Write(buf)



		}

	}
	f.Close()
}

func TrimHtml(src string) string {
	re, _ := regexp.Compile("\\s{2,}")
	src = re.ReplaceAllString(src, "\n")
	//去除所有的&nbsp;
	re, _ = regexp.Compile("&nbsp;")
	src = re.ReplaceAllString(src, "")
	return strings.TrimSpace(src)
}

如果要加上goroutine,因为可能会导致顺序混乱,可以将爬取到的内容 i-content key-value的形式来存储后排序再写入文件即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值