go基础综合-goroutine实现网页爬虫
发布日期:2021-05-15 09:25:02 浏览次数:19 分类:精选文章

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

package main
import (
"fmt"
"net/http"
"io/ioutil"
"regexp"
"sync"
"log"
"time"
"os"
)
var wg sync.WaitGroup
func 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
    • ������������������������
    • ������������������������������������
    • ������������������������������������������
    • ���������������������������������������������������
    上一篇:go web服务get pos
    下一篇:go使用protobuf和cpp进行tcp通信

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月02日 00时28分04秒