Golang实现并发版网络爬虫:斗鱼直播颜值区直播封面图片爬取并保存文件

爬取斗鱼直播颜值区直播封面图片代码实现:

斗鱼直播界面

工作流程:

1. 明确目标 Url

2. 发送请求,获取应答数据包。 http.Get(url)

3. 过滤 数据。提取有用信息。	

4. 使用、分析得到数据信息。


```go
package main

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

func SaveImg(idx int, url string, page chan int)  {
	path :="C:/itcast/img/" + strconv.Itoa(idx+1) + ".jpg"
	f, err := os.Create(path)
	if err != nil {
		fmt.Println(" http.Get err:", err)
		return
	}
	defer f.Close()

	resp, err := http.Get(url)
	if err != nil {
		fmt.Println(" http.Get err:", err)
		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
		}
		f.Write(buf[:n])
	}
	page <- idx
}

func main()  {
	url := "https://www.douyu.com/g_yz"

	// 爬取 整个页面,将整个页面全部信息,保存在result
	result, err := HttpGet(url)
	if err != nil {
		fmt.Println("HttpGet err:", err)
		return
	}
	// 解析编译正则
	ret := regexp.MustCompile(`data-original="(?s:(.*?))"`)
	// 提取每一张图片的 url
	alls := ret.FindAllStringSubmatch(result, -1)

	page := make(chan int)
	n := len(alls)

	for idx, imgURL := range alls {
		//fmt.Println("imgURL:", imgURL[1])
		go SaveImg(idx, imgURL[1], page)
	}

	for i:=0; i<n; i++ {
		fmt.Printf("下载第 %d 张图片完成\n", <- page)
	}

}
// 获取一个网页所有的内容, result 返回
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
		}
		result += string(buf[:n])
	}
	return
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值