GO语言初体验——爬虫程序
2009年11月10日,Google正式推出一门新的编程语言——Golang,简称GO语言。计算机可直接运行GO语言编译后的二进制文件,也就是说开发者只需要将本地已编译完成的GO项目文件上传至服务器即可完成部署。

不久前我用Node.js写了一个爬虫程序,可以源源不断的下载国外某网站的图片。几个朋友试了试,感觉最麻烦的地方就是配置Node.js运行环境以及安装依赖库。正好,GO语言不存在这样的问题,所以我打算用GO语言重写这个爬虫程序。

很多网站的图片链接是有规律可循的,例如第一张图片链接为https://xxx.com/img/1.jpg,第二张图片的链接为https://xxx.com/img/2.jpg,以此类推。因此我们可以修改链接最后的那个数字一张一张的去下载,当然这个过程可以交给代码来完成。

源码讲解

每次启动程序时需要做两次判断,一是判断当前目录下是否存在images文件夹,若不存在则创建文件夹,该文件夹用于储存下载成功的图片。二是判断当前目录下是否存在count.txt文件,若不存在则创建该文件并写入内容“1”,该文件的内容为数字,用于组成图片链接,每成功下载一张图片数字加1。

代码如下:

package main

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

const countFilePath = "./count.txt"
const imagesDir = "./images"

// 判断文件夹是否存在
func PathExists(path string) (bool, error) {
  _, err := os.Stat(path)
  if err == nil {
    return true, nil
  }
  if os.IsNotExist(err) {
    return false, nil
  }
  return false, err
}

func main() {   
  exist, err := PathExists(imagesDir)
  if err != nil {
    fmt.Printf("获取文件夹信息出错![%v]\n", err)
  }
  if !exist {
    err := os.Mkdir(imagesDir, 777)
    if err != nil {
      fmt.Printf("创建图片文件夹失败![%v]\n", err)
    } else {
      fmt.Printf("创建图片文件夹成功!\n")
    }
  }
  data, err := ioutil.ReadFile(countFilePath)
  if err != nil {
    data = []byte("0")
      ioutil.WriteFile(countFilePath, data, 777)
  }
  count, err := strconv.Atoi(string(data))
  for {
    count++
    countString := strconv.Itoa(count)
    // 根据网站的规律自行组装
    url := "https://xxx.com/img/" + countString + ".jpg"
    fmt.Println("【正在下载】", url)
    resp, err := http.Get(url)
    if err != nil {
      fmt.Println("【下载出错】", url)
      continue
    }
    if resp.Status != "200 OK" {
      fmt.Println("【下载出错】", resp.Status)
      continue
    }
    imgData, err := ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    a := imagesDir + "/" + countString + ".jpg"
    ioutil.WriteFile(a, []byte(imgData), 777)
    ioutil.WriteFile(countFilePath, []byte(countString), 777)
      fmt.Println("【下载成功】", url)
    }
}

以上代码仅供学习交流,如作他用所承受的法律责任一概与作者无关。