1. 程式人生 > >go 語言爬取百度貼吧中的內容

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)
}