写点什么

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

用户头像
Regan Yue
关注
发布于: 2 小时前

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匹配字符串结尾

  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 个匹配项/子匹配项。

发布于: 2 小时前阅读数: 3
用户头像

Regan Yue

关注

还未添加个人签名 2020.08.12 加入

对Go、Python、网络安全、区块链感兴趣. · 华为云云享专家

评论

发布
暂无评论
Golang: 如何使用正则表达式,并实战爬取手机号