5.1 Go语言项目实战:简单爬虫

Amiee7 · 2019-03-13 14:30:47 · 4133 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-03-13 14:30:47 的主题,其中的信息可能已经有所发展或是发生改变。

GO语言学习群721929980

常用正则规则 Go语言标准库内建提供了regexp包

  • . 匹配除换行符以外的任意字符
  • \w 匹配字母或数字或下划线或汉字
  • \s 匹配任意的空白符
  • \d 匹配数字
  • \b 匹配单词的开始或结束
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结束
  • 重复零次或更多次
  • 重复一次或更多次
  • ? 重复零次或一次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次
  • 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
  • (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
  • (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

导入包

import (
    "net/http"
    "fmt"
    "io/ioutil"
    "regexp"
)

定义正则表达式

var (
    //邮箱
    reQQEmail = `(\d+)@qq.com`
    reEmail   = `\w+@\w+\.\w+(\.\w+)?`

    //超链接
    //<a href="http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=%C1%F4%CF%C2%D3%CA%CF%E4%20%B5%BA%B9%FA"
    reLinkBad = `<a[\s\S]*?href="(https?://[\s\S]+?)"`
    reLink    = `href="(https?://[\s\S]+?)"`

    //手机号
    //13x xxxx xxxx
    rePhone = `1[345789]\d\s?\d{4}\s?\d{4}`

    //身份证号
    //123456 1990 0817 123X
    reIdcard = `[123456]\d{5}((19\d{2})|(20[01]\d))((0[1-9])|(1[012]))((0[1-9])|([12]\d)|(3[01]))\d{3}[\dX]`

    //图片链接
    //"http://img2.imgtn.bdimg.com/it/u=2403021088,4222830812&fm=26&gp=0.jpg"
    reImg = `"(https?://[^"]+?(\.((jpg)|(jpeg)|(png)|(gif)|(bmp)|(svg)|(swf)|(ico))))"`
)

预定义错误处理函数

func HandleError(err error, why string) {
    if err != nil {
        fmt.Print(why, err)
    }
}

获得页面html方法封装

func GetPageStr(url string) (pageStr string) {
    resp, err := http.Get(url)
    HandleError(err, "http.Get url")
    defer resp.Body.Close()
    pageBytes, err := ioutil.ReadAll(resp.Body)
    HandleError(err, "ioutil.ReadAll")
    pageStr = string(pageBytes)
    return pageStr
}

爬邮箱

func SpiderEmail() {
    pageStr := GetPageStr("http://tieba.baidu.com/p/2544042204")
    pageStr += "ximendong@21centry.com.cn"
    //fmt.Println(pageStr)

    re := regexp.MustCompile(reEmail)
    results := re.FindAllStringSubmatch(pageStr, -1)
    for _, result := range results {
        //fmt.Printf("email=%s,qq=%s\n",result[0],result[1])
        fmt.Println(result)
    }
}

爬超链接

func SpiderLink() {
    pageStr := GetPageStr("http://www.baidu.com/s?wd=%E7%95%99%E4%B8%8B%E9%82%AE%E7%AE%B1%20%E5%B2%9B%E5%9B%BD")
    //fmt.Println(pageStr)

    re := regexp.MustCompile(reLink)
    results := re.FindAllStringSubmatch(pageStr, -1)
    fmt.Printf("共找到%d条结果:\n", len(results))
    for _, result := range results {
        //fmt.Printf("email=%s,qq=%s\n",result[0],result[1])
        fmt.Println(result[1])
        fmt.Println()
    }
}

爬手机

func SpiderMobilePhone() {
    pageStr := GetPageStr("http://www.zhaohaowang.com/aspx/zhw/index.html?CityId=1#BJ=05698")
    //fmt.Println(pageStr)

    re := regexp.MustCompile(rePhone)
    results := re.FindAllStringSubmatch(pageStr, -1)
    fmt.Printf("共找到%d条结果:\n", len(results))
    for _, result := range results {
        fmt.Println(result)
        fmt.Println()
    }

}

爬身份证

func SpiderIdcard() {
    pageStr := GetPageStr("http://sfz.ckd.cc/")
    //fmt.Println(pageStr)

    re := regexp.MustCompile(reIdcard)
    results := re.FindAllStringSubmatch(pageStr, -1)
    fmt.Printf("共找到%d条结果:\n", len(results))
    for _, result := range results {
        fmt.Println(result[0])
        fmt.Println()
    }

}

爬图片

func SpiderImg() {
    pageStr := GetPageStr("http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%E7%BE%8E%E5%A5%B3")
    //fmt.Println(pageStr)

    re := regexp.MustCompile(reImg)
    results := re.FindAllStringSubmatch(pageStr, -1)
    fmt.Printf("共找到%d条结果:\n", len(results))
    for _, result := range results {
        fmt.Println(result[1])
        fmt.Println()
    }

}

更多实战:https://blog.csdn.net/u010986776/article/category/8095305 GO语言学习群721929980


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4133 次点击  
加入收藏 微博
1 回复  |  直到 2019-03-13 14:53:08
cicl
cicl · #1 · 6年之前

不错,学习一下爬虫相关的知识

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传