go语言并发爬取豆瓣电影

package main

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

func get(url string) (re string,e error) {
	resp,err:=http.Get(url)
	if err!=nil {
		e=err
		return
	}
	defer resp.Body.Close()
	buf:=make([]byte,1024)
	for  {
		n,err:=resp.Body.Read(buf)
		re+=string(buf[:n])
		if err!=nil {
			if err==io.EOF {
				break
			} else {
				e=err
				return
			}
		}
	}
	return
}

func spider(start int,end int)  {
	m:=make(chan int)
	for i:=start; i<=end; i++ {
		str,err:=get("https://movie.douban.com/top250?start="+strconv.Itoa(i)+"&filter=")
		if err!=nil {
			fmt.Print(err)
			return
		}
		go func(i int) {
			fp,err:=os.Create("/Users/zmx/movies"+strconv.Itoa(i)+".txt")
			if err!=nil {
				fmt.Print(err)
				return
			}
			defer fp.Close()
			re:=regexp.MustCompile(`<img width="100" alt="(?s:(.*?))"`)
			filename:=re.FindAllStringSubmatch(str,-1)
			re2:=regexp.MustCompile(`<span class="rating_num" property="v:average">(?s:(.*?))</span>`)
			filestar:=re2.FindAllStringSubmatch(str,-1)
			re3:=regexp.MustCompile(`<span>(?s:(\d*?))人评价</span>`)
			starnum:=re3.FindAllStringSubmatch(str,-1)
			for j:=0; j<len(filename) && j<len(filestar) && j<len(starnum); j++ {
				fp.WriteString(filename[j][1]+"\t\t\t"+filestar[j][1]+"\t\t\t"+starnum[j][1]+"\n")
			}
			m<-i
		}(i)
	}
	for i:=start; i<=end; i++ {
		<-m
	}
}

func main()  {
	var start,end int
	fmt.Scan(&start)
	fmt.Scan(&end)
	spider(start,end)
}

猜你喜欢

转载自blog.csdn.net/baidu_25845567/article/details/82389636