
go基础综合-goroutine实现网页爬虫
发布日期:2021-05-15 09:25:02
浏览次数:19
分类:精选文章
本文共 3335 字,大约阅读时间需要 11 分钟。
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 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.Printf("���������������%v", end)}func GetImgUrl(url string, i int) { defer wg.Done() client := &http.Client{} req, err := 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.Printf("http get error: %v\n", err) return } fmt.Printf("GET %s: 200 OK\n", url) log.Printf("GET %s: 200 OK\n", url) defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Printf("response.Body error: %v\n", err) return } compile := regexp.MustCompile("http://~~���������������~~ /uploads/tu/[0-9]{6}/[0-9]{4}/[0-9a-zA-Z]{10}.jpg") html := []byte(string(body)) submatch := compile.FindAllSubmatch(html, -1) fmt.Printf("url: %s, match: %d\n", url, len(submatch)) if len(submatch) != 0 { GetImg(string(submatch[0][0]), i) } else { fmt.Printf("url: %s, ������������\n", url) }}func GetImg(url string, i int) { client := &http.Client{} req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Printf("http get error: %v\n", err) return } 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.Printf("http get error: %v\n", err) return } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Printf("response.Body error: %v\n", err) return } timeStr := time.Now().Format("20060102 150405") filename := fmt.Sprintf("./IMG/%s_%d.jpg", timeStr, i) if err := ioutil.WriteFile(filename, body, 0666); err != nil { fmt.Printf("ioutil.WriteFile error: %v\n", err) return } else { fmt.Printf("��������� %s ��� %s\n", url, filename) }}
������������������������������������������������������������������������������������������������������������
���������������������������������������������������������������
������������������������������������������������
������������������������������������
���������������������������������������������������
������������������������������������
������������������������������������
���������������������������������������������������
������������������������������������������������
������������������������������������������������
������������������������������������������
���������������������������������������������������������
- ������������������������������������������������������num���
- ���������������������WaitGroup
- ������������������������
- ������������������������������������
- ������������������������������������������
- ���������������������������������������������������
发表评论
最新留言
不错!
[***.144.177.141]2025年05月02日 00时28分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
IDEA打war包部署在云服务器访问
2021-05-16
关于Form表单中action参数传值的问题
2021-05-16
tinyproxy正向代理
2021-05-16
codeforces 59A-C语言解题报告
2021-05-16
Fast Matrix Calculation HDU-4965 矩阵快速幂
2021-05-16
An Easy Physics Problem HDU-5572 计算几何
2021-05-16
OpenCv 金字塔之上采样与下采样
2021-05-16
华为手机麦芒9参数配置
2021-05-16
Java中的注释
2021-05-16
Java接口(interface)
2021-05-16
Linux+Nginx+Asp.net Core及守护进程部署
2021-05-16
Spring框架概述
2021-05-16
控件的三种模式及Image View控件2021-04-08
2021-05-16
计算机网络--大厂常见问题(2)
2021-05-16
2021-05-12书城项目第一阶段:提交表单
2021-05-16
cookie、session、token
2021-05-16
vue项目更改title
2021-05-16
z-index失效解决方法
2021-05-16
【MySQL】如何在SQLyog中导入CSV文件
2021-05-16
XmlUtils
2021-05-16