使用go語言爬取豆瓣電影的電影名稱、評分、評價次數

package main

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

func main(){
	//指定爬取起始、終止頁
	var start,end int
	fmt.Println("請輸入爬取的起始頁(>=1):")
	fmt.Scan(&start)
	fmt.Println("請輸入爬取的終止頁(>=start):")
	fmt.Scan(&end)
	Working(start,end)
}

//爬取頁面操作
func Working(start , end int){
	fmt.Printf("正在爬取第%d頁到第%d頁...\n",start,end)
	//循環爬取每一頁
	ch := make(chan int)
	for i := start ; i <= end ; i++ {
		go SpiderPage(i,ch)
	}
	for i := start ; i <= end ; i++  {
		fmt.Printf("第%d個網頁已經爬取完成\n",<-ch)
	}
}

func SpiderPage(i int,ch chan int){
	url := "https://movie.douban.com/top250?start="+ strconv.Itoa((i-1)*25) + "&filter="
	result ,err := httpGet(url)
	if err != nil{
		fmt.Println("HttpGet err",err)
		return
	}
	//fmt.Println("result=",result)
	ret := regexp.MustCompile(`<img width="100" alt="(.*?)"`)
	//提取需要的信息
	filmName := ret.FindAllStringSubmatch(result,-1)
	ret1 := regexp.MustCompile(`<span class="rating_num" property="v:average">(?s:(.*?))</span>`)
	//提取需要的信息
	filmScore := ret1.FindAllStringSubmatch(result,-1)
	ret2 := regexp.MustCompile(`<span>(.*?)人評價</span>`)
	//提取需要的信息
	filmNum := ret2.FindAllStringSubmatch(result,-1)
	Save2File(i,filmName,filmScore,filmNum)
	ch <- i
}

func Save2File(idx int, filmName,filmScore,fileNum [][]string){
	//將讀到的整網頁數據存儲
	f , err := os.Create("第 "+ strconv.Itoa(idx)+" 頁.txt")
	if err != nil{
		fmt.Println("Create err:",err)
		return
	}
	defer f.Close()
	n := len(filmName) 	//得到條目數
	f.WriteString("電影名稱" + "\t\t\t" + "評分" + "\t\t\t" + "評價人數" + "\n")
	for i := 0 ; i < n ; i++{
		f.WriteString(filmName[i][1] + "\t\t\t" + filmScore[i][1] + "\t\t\t" + fileNum[i][1] + "\n")
	}
}

func httpGet(url string)(result string ,err error){
	resp , err1 := http.Get(url)
	if err1 != nil {
		err = err1
		return
	}
	defer resp.Body.Close()
	//循環讀取網頁數據
	buf := make([]byte,4096)
	for{
		n,err2 := resp.Body.Read(buf)
		if n == 0 {
			break
		}
		if err2 != nil && err2 != io.EOF{
			err = err2
			return
		}
		//累加每一次循環讀取的buf數據
		result += string(buf[:n])
	}
	return
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章