## 一、 爬虫步骤
* 明确目标(确定在哪个范围搜数据)
* 爬(爬下所有内容)
* 取(去掉没用的数据)
* 处理数据(按照业务去处理)
## 二、正则表达式
* 文档:[https://studygolang.com/pkgdoc](https://studygolang.com/pkgdoc)
* API
re := regexp.MustCompile(reStr):根据匹配规则,返回一个正则对象
ret := re.FindAllStringSubmatch(srcStr,-1):src是大字符串,\-1是取所有
* 爬邮箱
* 方法抽取
* 爬超链接
* 爬手机号
http://www.zhaohaowang.com/
* 爬身份证号
http://henan.qq.com/a/20171107/069413.htm
* 爬图片链接
## 三、爬虫实例
~~~
package main
import (
"net/http"
"fmt"
"io/ioutil"
"regexp"
)
/*
re := regexp.MustCompile(reStr):根据匹配规则,返回一个正则对象
ret := re.FindAllStringSubmatch(srcStr,-1):src是大字符串,-1是取所有
*/
var (
reQQEmail = `(\d+)@qq.com`
reEmail = `\w+@\w+\.\w+(\.\w+)?`
reLink = `href="(https?://[\s\S]+?)"`
rePhone = `1[3456789]\d\s?\d{4}\s?\d{4}`
//410222198611270512
reIdcard = `[123456]\d{5}((19\d{2})|(20[01]\d))((0[1-9])|(1[012]))((0[1-9])|([12]\d)|(3[01]))\d{3}[\dXx]`
reImg = `(https?://[^"]+?(\.((jpg)|(png)|(jpeg)|(gif))))`
)
func main() {
//1.爬邮箱
//GetEmail()
//2.方法抽取
//GetEmail2("http://tieba.baidu.com/p/2544042204")
//3.爬超链接
//GetLink("http://www.baidu.com/s?wd=岛国%20留下邮箱")
//4.爬手机号
//GetPhone("https://www.zhaohaowang.com/")
//5.身份证号
//GetIdcard("http://henan.qq.com/a/20171107/069413.htm")
//6.超链接
GetImg("https://www.shejiben.com/")
}
//爬邮箱
func GetEmail() {
//1.爬所有数据
resp, err := http.Get("http://tieba.baidu.com/p/2544042204")
HandleError(err, "http.Get url")
defer resp.Body.Close()
//接收当前页面的数据
pageBytes, err := ioutil.ReadAll(resp.Body)
HandleError(err, "ioutil.Read")
fmt.Println(string(pageBytes))
//2.取数据,通过正则
pageStr := string(pageBytes)
re := regexp.MustCompile(reQQEmail)
ret := re.FindAllStringSubmatch(pageStr, -1)
//遍历数组
for _, result := range ret {
//fmt.Println(result)
fmt.Printf("email=%s qq=%s\n", result[0], result[1])
}
}
//处理异常
func HandleError(err error, why string) {
if err != nil {
fmt.Println(why, err)
}
}
//抽取的爬邮箱
func GetEmail2(url string) {
//获取页面数据
pageStr := GetPageStr(url)
re := regexp.MustCompile(reEmail)
ret := re.FindAllStringSubmatch(pageStr, -1)
for _, result := range ret {
fmt.Println(result)
}
}
//爬页面所有数据
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.Read")
pageStr = string(pageBytes)
return pageStr
}
//爬超链接
func GetLink(url string) {
//获取页面数据
pageStr := GetPageStr(url)
fmt.Println(pageStr)
re := regexp.MustCompile(reLink)
ret := re.FindAllStringSubmatch(pageStr, -1)
fmt.Printf("共找到%d条结果:\n", len(ret))
for _, result := range ret {
fmt.Println(result)
}
}
//爬手机号
func GetPhone(url string) {
//获取页面数据
pageStr := GetPageStr(url)
fmt.Println(pageStr)
re := regexp.MustCompile(rePhone)
ret := re.FindAllStringSubmatch(pageStr, -1)
fmt.Printf("共找到%d条结果:\n", len(ret))
for _, result := range ret {
fmt.Println(result)
}
}
//爬手机号
func GetIdcard(url string) {
//获取页面数据
pageStr := GetPageStr(url)
fmt.Println(pageStr)
re := regexp.MustCompile(reIdcard)
ret := re.FindAllStringSubmatch(pageStr, -1)
fmt.Printf("共找到%d条结果:\n", len(ret))
for _, result := range ret {
fmt.Println(result)
}
}
//爬图片链接
func GetImg(url string) {
//获取页面数据
pageStr := GetPageStr(url)
fmt.Println(pageStr)
re := regexp.MustCompile(reImg)
ret := re.FindAllStringSubmatch(pageStr, -1)
fmt.Printf("共找到%d条结果:\n", len(ret))
for _, result := range ret {
fmt.Println(result)
}
}
~~~
- 一、数组
- 二、切片
- 三、copy
- 四、MAP
- 五、结构体
- 六、结构体参数
- 七、面向”对象“
- 1、匿名字段
- 2、方法
- 3、包和封装
- 4、接口
- 5、异常处理
- 八、Json
- 九、文件操作
- 1、写文件
- 2、读取文件内容
- 3、拷贝文件
- 十、反射
- 1、查看类型,字段和方法
- 2、查看匿名字段
- 3、修改基本类型的值
- 4、修改结构体的值
- 5、调用方法
- 十一、并发编程
- 1、并行和并发
- 2、协程
- 3、runtime包
- 5、channel的使用
- 6、close
- 7、定时器
- 8、select
- 9、协程同步锁
- 十二、socket编程
- 十三、Http编程
- 十四、并发爬虫和数据处理
- 1、简易爬虫实例
- 2、并发爬取图片
- 3、读文件中的数据
- 4、数据清洗
- 其他
- 1、推荐文章