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

举报
Regan Yue 发表于 2021/09/10 16:11:00 2021/09/10
【摘要】 Golang: 如何使用正则表达式,并实战爬取手机号众所周知,正则表达式是一个十分强大的存在,很多人接触了正则表达式后,都会感叹正则表达式竟然恐怖如斯。我们今天来聊一聊正则表达式吧!常用正则规则\d 数字\D 非数字\w 单词字符:大小写字母+数字+下划线\W 非单词字符\s 空白字符 : \t +\n+\r+\f之一\S 非空白字符. 换行符之外的任意字符. 一个真正的点regan+ re...

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

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

常用正则规则


  1. \d 数字

  2. \D 非数字

  3. \w 单词字符:大小写字母+数字+下划线

  4. \W 非单词字符

  5. \s 空白字符 : \t +\n+\r+\f之一

  6. \S 非空白字符

  7. . 换行符之外的任意字符

  8. . 一个真正的点

  9. regan+ regan表示的片段出现1到多次

  10. regan* regan这个片段出现0到多次

  11. regan? regan这个片段出现0到1次

  12. regan{n} regan表示的片段出现n次

  13. regan{m,n} regan表示的片段出现m到n次

  14. regan{,n} regan表示的片段出现0到n次

  15. [abc] a,b,c中间的任意一个字符

  16. [\s\S]习惯上表示绝对的字符,空白字符和非空白字符都行,任意字符

  17. [a-z] a到z中的任意一个字符

  18. [^abc] 除了abc外的任意字符

  19. regan1|regan2 regan1或regan2所表示的字段

  20. ^regan$ regan片段匹配全文 ^匹配字符串开始 $匹配字符串结尾

  21. regan*?,regan+? 这是贪婪模式 regan*或regan+所代表的片段,使用非贪婪模式。非贪婪模式:regan*或regan+匹配的字符,越少越好。


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

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 = 1[3456789]\d{9},这个正则表达式的意思是第一位是一,第二位可以是三到九,后面九位为任意数字。

下面来讲讲这段代码:

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

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


下面再来介绍一点细节:

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。