go 语言爬取百度贴吧中的内容

涉及到的知识点有 信道chan ,切片的使用 ,os,http 包的使用

package main

import (
	"fmt"
	"net/http"
	"os"
	"strconv"
)

func pachong(start, end int) {
	//明确爬的地址
	url := "https://tieba.baidu.com/f?kw=%E6%AE%B5%E5%AD%90&ie=utf-8&pn="
	c := make(chan int)
	for i := start; i < end+1; i++ {

		go ping(i, url, c)
	}
	for v := range c {
		fmt.Println(v)
	}
}

//不同的线程去爬不同的文件
func ping(i int, url string, c chan int) {
	fmt.Printf("当前爬取第 %d 页,%s\n", i, url)
	res, err := curl(url)
	if err != nil {
		fmt.Println("你有错误:", err)
		return
	}
	name := strconv.Itoa(i) + ".html"
	//创建文件
	f, err1 := os.Create(name)
	if err1 != nil {
		fmt.Println("文件创建失败:", err1)
		return
	}
	//内容写入文件i
	f.WriteString(res)
	//关闭文件
	f.Close()
	c <- i
}

//爬取网页内容
func curl(url string) (reques string, err error) {
	resq, err1 := http.Get(url)
	if err1 != nil {
		err = err1
		return
	}
	//最后关闭
	defer resq.Body.Close()
	str := make([]byte, 1024*5)
	//循环读取数据
	for {
		number, _ := resq.Body.Read(str)
		if number == 0 {
			fmt.Println("爬取页面成功!")
			break
		}
		reques += string(str[:number])
	}
	return
}

func main() {
	pachong(1, 3)
}

猜你喜欢

转载自blog.csdn.net/weixin_39579606/article/details/83107951