实战记录Golang使用正则表达式爬取手机号(附代码实例)

大哥大姐,请问一下,实战记录Golang使用正则表达式爬取手机号(附代码实例)
最新回答
耳边情话

2024-09-16 00:16:10

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

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

常用正则规则

\d数字

\D非数字

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

\W非单词字符

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

\S非空白字符

.换行符之外的任意字符

.一个真正的点

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

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

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

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

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

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

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

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

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

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

regan1|regan2regan1或regan2所表示的字段

^reganregan片段匹配全文匹配字符串开始regan片段匹配全文^匹配字符串开始regan片段匹配全文匹配字符串开始匹配字符串结尾

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

正则表达式实战:爬取手机号packagemainimport("fmt""io/ioutil""net/http""os""regexp")var(rephone=`1[3456789]\d{9}`)funcHandleErr(errerror,whenstring){iferr!=nil{fmt.Println(when,err)os.Exit(1)}}funcmain(){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)forj:=0;j<=115;j++{phone_str:=allString[j][0]phone_map[phone_str]=phone_str}fori:=rangephone_map{fmt.Println(phone_map[i])}}

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

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

下面来讲讲这段代码:

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

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

下面再来介绍一点细节:

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

作者:ReganYue著作权归作者所有。