博客
关于我
go基础综合-goroutine实现网页爬虫
阅读量:605 次
发布时间:2019-03-12

本文共 2362 字,大约阅读时间需要 7 分钟。

涉及go的net/http包的使用,文件读写,log日志、正则匹配、go routine并发、协程同步。

package mainimport (	"fmt"	"net/http"	"io/ioutil"	"regexp"	"sync"	"log"	"time"	"os")var wg sync.WaitGroupfunc main() {   	log_f, err := os.OpenFile("down.log", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)	if err !=nil {   		log.Fatal(err)	}	defer log_f.Close()	log.SetOutput(log_f)	//记录用时	t := time.Now()	num := 20 //开启20个协程爬20个网页	wg.Add(num)	for i:=0; i<=num; i++ {   		url := fmt.Sprintf("https://~~不显示网址~~ /20140421192446_%d.htm", i+2)		fmt.Println(url)		log.Printf("GET %s\n", url)		go GetImgUrl(url, i)	}	wg.Wait()//主协程等待	end := time.Since(t)    fmt.Println("程序用时:", end)}func GetImgUrl(url string, i int) {   	defer wg.Done()	client := &http.Client{   }	req,_ := http.NewRequest("GET",url,nil)	req.Header.Add("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0")		response, err := client.Do(req)	if err != nil {   		fmt.Println("http get error ",err)		return 	}	fmt.Println(url, response.Status)	log.Println(url, response.Status)	defer response.Body.Close()	body, err := ioutil.ReadAll(response.Body)	if err != nil {   		fmt.Println("response.Body error")		return 	}	reg := "http://~~不显示网址~~ /uploads/tu/[0-9]{6}/[0-9]{4}/[0-9a-zA-Z]{10}.jpg"	compile := regexp.MustCompile(reg)	html  := []byte(string(body)) 	submatch := compile.FindAllSubmatch(html, -1)	fmt.Println("url:" , url, "match:", len(submatch))	if len(submatch) != 0 {   		GetImg(string(submatch[0][0]), i)	}else {   		fmt.Println("url:" , url, "null", len(submatch))	}}func GetImg(url string, i int) {   	client := &http.Client{   }	req,_ := http.NewRequest("GET",url,nil)	req.Header.Add("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0")	    response, err := client.Do(req)	if err != nil {   		fmt.Println("http get error ",err)		return 	}	defer response.Body.Close()	body, err := ioutil.ReadAll(response.Body)	if err != nil {   		fmt.Println("response.Body error")		return 	}	timeStr := time.Now().Format("2006-01-02 15:04:05")	filename := fmt.Sprintf("./IMG/%s_%d.jpg", timeStr, i)	//fmt.Println(filename)	err = ioutil.WriteFile(filename, body, 0666)	if err != nil {   		fmt.Println("ioutil.WriteFile error", err)		return 	}else {   		fmt.Println(url, " ok")	}}

转载地址:http://tynxz.baihongyu.com/

你可能感兴趣的文章
M_Map工具箱简介及地理图形绘制
查看>>
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
nacos config
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>
Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
查看>>
NacosClient客户端搭建,微服务注册进nacos
查看>>
Nacos使用OpenFeign
查看>>
Nacos做注册中心使用
查看>>
Nacos做配置中心使用
查看>>
Nacos原理
查看>>
Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
查看>>
Nacos启动异常
查看>>
Nacos和Zookeeper对比
查看>>
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos如何实现Raft算法与Raft协议原理详解
查看>>