zoukankan      html  css  js  c++  java
  • Go语言实战-爬取校花网图片

    一、目标网站分析

      爬取校花网http://www.xiaohuar.com/大学校花所有图片。

    经过分析,所有图片分为四个页面,http://www.xiaohuar.com/list-1-0.html,到 http://www.xiaohuar.com/list-1-3.html

    二、go代码实现

    // 知识点
    // 1. http 的用法,返回数据的格式、编码
    // 2. 正则表达式
    // 3. 文件读写
    package main
    
    import (
    	"bytes"
    	"fmt"
    	"io/ioutil"
    	"net/http"
    	"os"
    	"path/filepath"
    	"regexp"
    	"strings"
    	"sync"
    	"time"
    
    	"github.com/axgle/mahonia"
    )
    
    var workResultLock sync.WaitGroup
    
    func check(e error) {
    	if e != nil {
    		panic(e)
    	}
    }
    
    func ConvertToString(src string, srcCode string, tagCode string) string {
    	srcCoder := mahonia.NewDecoder(srcCode)
    	srcResult := srcCoder.ConvertString(src)
    	tagCoder := mahonia.NewDecoder(tagCode)
    	_, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
    	result := string(cdata)
    	return result
    }
    
    func download_img(request_url string, name string, dir_path string) {
    	image, err := http.Get(request_url)
    	check(err)
    	image_byte, err := ioutil.ReadAll(image.Body)
    	defer image.Body.Close()
    	file_path := filepath.Join(dir_path, name+".jpg")
    	err = ioutil.WriteFile(file_path, image_byte, 0644)
    	check(err)
    	fmt.Println(request_url + "	下载成功")
    }
    
    func spider(i int, dir_path string) {
    	defer workResultLock.Done()
    	url := fmt.Sprintf("http://www.xiaohuar.com/list-1-%d.html", i)
    	response, err2 := http.Get(url)
    	check(err2)
    	content, err3 := ioutil.ReadAll(response.Body)
    	check(err3)
    	defer response.Body.Close()
    	html := string(content)
    	html = ConvertToString(html, "gbk", "utf-8")
    	// fmt.Println(html)
    	match := regexp.MustCompile(`<img width="210".*alt="(.*?)".*src="(.*?)" />`)
    	matched_str := match.FindAllString(html, -1)
    	for _, match_str := range matched_str {
    		var img_url string
    		name := match.FindStringSubmatch(match_str)[1]
    		src := match.FindStringSubmatch(match_str)[2]
    		if strings.HasPrefix(src, "http") != true {
    			var buffer bytes.Buffer
    			buffer.WriteString("http://www.xiaohuar.com")
    			buffer.WriteString(src)
    			img_url = buffer.String()
    		} else {
    			img_url = src
    		}
    		download_img(img_url, name, dir_path)
    	}
    }
    
    func main() {
    	start := time.Now()
    	dir := filepath.Dir(os.Args[0])
    	dir_path := filepath.Join(dir, "images")
    	err1 := os.MkdirAll(dir_path, os.ModePerm)
    	check(err1)
    	for i := 0; i < 4; i++ {
    		workResultLock.Add(1)
    		go spider(i, dir_path)
    	}
    	workResultLock.Wait()
    	fmt.Println(time.Now().Sub(start))
    }

    编译

     go build -o go_spider/xiaohua/xiaohua_spider.exe .go_spiderxiaohuamain.go

    运行go文件

    下载的图片

    短短14秒钟下载了全部98张图片。看来go的速度就是这么快。

    go第一次项目实战,成功!

  • 相关阅读:
    Python该怎么学?
    Python招聘需求
    最短路合集
    最小生成树prim算法
    最小生成树kruskal算法
    React-redux原理探索
    Redux原理探索
    头条前端面试题汇总,会持续更新
    阿里前面面试题(最全),持续更新中
    ASP.Net MVC3/4中Model验证错误信息的本地化
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10994477.html
Copyright © 2011-2022 走看看