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
}
使用go語言爬取豆瓣電影的電影名稱、評分、評價次數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.