Bootstrap

Golang: 如何使用正则表达式,并实战爬取手机号

Golang: 如何使用正则表达式,并实战爬取手机号

众所周知,正则表达式是一个十分强大的存在,很多人接触了正则表达式后,都会感叹正则表达式竟然恐怖如斯。我们今天来聊一聊正则表达式吧!

常用正则规则

正则表达式实战:爬取手机号

package main

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


var (
  rephone = `1[3456789]\d{9}`
)
func HandleErr(err error,when string)  {
  if err!=nil{
    fmt.Println(when,err)
    os.Exit(1)
  }
}
func main() {
  resp, err := http.Get("https://www.jihaoba.com/escrow/?&page=1")
  HandleErr(err,"http.Get")
  bytes, _ := ioutil.ReadAll(resp.Body)

  html:= string(bytes)
  //fmt.Println(html)
  re := regexp.MustCompile(rephone)
  allString := re.FindAllStringSubmatch(html, -1)
  fmt.Println(len(allString))
  fmt.Println(allString)
  phone_map := make(map[string] string)
  for j:=0;j<=115;j++{
     phone_str := allString[j][0]
     phone_map[phone_str] = phone_str
  }

  for i := range phone_map{
    fmt.Println(phone_map[i])
  }

}

上面就是利用正则表达式爬取这个网站第一页的手机号码的代码。

我们可以看到这个重中之重正则表达式:rephone = ,这个正则表达式的意思是第一位是一,第二位可以是三到九,后面九位为任意数字。

下面来讲讲这段代码:

先是使用http.Get()去请求网站,得到响应,然后处理得到响应体,然后将响应体转化为字符串。

再使用正则表达式去响应体全文中匹配号码字符串,由于这个网站这样匹配到的内容存在重复,所以我们将得到的号码放入Map的键中用于去重。

下面再来介绍一点细节:

这个FindAllStringSubmatch()它返回第一个参数的连续匹配的片段,第一个参数是字符串,一般第二个参数n一般使用-1,如果n> = 0,则该函数最多返回n个匹配项/子匹配项。