go 实现爬虫

时间:2022-11-22 10:55:59

一:使用go获取远程图片存储在本地案例

1>生成随机数

len:=32
bytes:=make([]byte,len)
r:=rand.New(rand.NewSource(time.Now().Unix()))
for i:=0;i<len;i++ {
b:=r.Intn(26)+65
bytes[i]=byte(b)
}
str:= string(bytes)
str1:=strings.ToLower(str)
fmt.Println(str1)

2>获取远程图片存储在本地

len:=32
bytes:=make([]byte,len)
r:=rand.New(rand.NewSource(time.Now().Unix()))
for i:=0;i<len;i++ {
b:=r.Intn(26)+65
bytes[i]=byte(b)
}
str:= string(bytes)
str1:=strings.ToLower(str)
imagPath := "http://img2.bdstatic.com/img/image/166314e251f95cad1c8f496ad547d3e6709c93d5197.jpg"
res,_:=http.Get(imagPath)
defer res.Body.Close()
newFile := "./"+str1+".jpg"
bydata,_:=ioutil.ReadAll(res.Body)
err:=ioutil.WriteFile(newFile,bydata,0666)
if err != nil {
log.Fatal(err)
}

 3>goquery的使用

 一:下载

go get github.com/PuerkitoBio/goquery

二:使用方法

NewDocumentFromReader() 返回了一个*Document和error。Document代表一个将要被操作的HTML文档。

Find()是获取当前匹配元素集中每个元素的子代,参数是x选择器 ,它返回一个包含这些匹配元素的新选择对象。在例子中我们使用的是元素选择器P,它会帮我们匹配出所有的p标签 。

Each() 是迭代器,它会循环遍历选择的节点,它的参数是一个匿名函数,匿名函数拥有2个参数,一个是元素的索引位置,还有一个就是选择的结果集匹配到的内容都在它的里面。

Text() 则是获取匹配元素集中的文本内容

三:选择器

  上面的例子中,我们使用了元素选择器,goquery跟jquery一样都支持很多选择器,我们简单的介绍下常用的选择器

ID 选择器
ID选择器是我们使用最频繁的,假如我们有2个p元素,其实我们只需要其中的一个,那么我们只需要给这个标记一个唯一的id即可,这样我们就可以使用id选择器,精确定位了。
使用方法 :id选择器以#开头,紧跟着元素id的值,使用语法为
dom.Find("#title") ,匹配文档中所有的 id=title的内容

如果多个标签的ID都是title,我们可以指定某一个标签,如dom.Find("p#title")

Class选择器
类选择跟ID选择器一样都是使用很频繁的,我们可以通过类选择器快速筛选到需要的内容。

使用方法 : id选择器以.开头,紧跟着元素class的值,使用语法为dom.Find(".content1"),匹配文档中所有的 id=title的元素。

类选择权器跟ID选择器一样,也可以指定某一个标签dom.Find("div.content1")

属性选择器
一个HTML元素都有自己的属性以及属性值,所以我们也可以通过属性和值筛选元素。

使用方法 :我们可以通过元素的属性和属性值来筛选数据,使用语法为dom.Find("p[class=content1],匹配文档中所有的 p标签的class属性是content1的元素。

当然我们这里以class属性为例,还可以用其他属性,比如href等很多,自定义属性也是可以的。

刚刚我们使用的是完全相等的匹配方式,属性选择器还要很多匹配方式

go 实现爬虫

 

   

parent > child选择器
  筛选出某个元素下的子元素。

  使用方法:使用>符号连接,使用语法 dom.Find("div>p") , 筛选div标签下的p标签

element + next 相邻选择器
  如果要筛选的元素没有规律,但是该元素的上一个元素有规律,我们就可以使用这种下一个相邻选择器来进行选择