本爬虫只为了技术学习,不用于窥探网站内容,不能把爬取数据用于商业,不可对网站进对暴利爬取。
直接上可执行的代码:
发贴时这段是可直接获取到的,若你在执行时网网页结构已改变,可根据代码中的逻辑说明自行修改。
package main
import (
"bufio"
"fmt"
"golang.org/x/net/html/charset"
"golang.org/x/text/encoding"
"golang.org/x/text/transform"
"io"
"io/ioutil"
"net/http"
"regexp"
)
func main() {
resp,err := http.Get("http://www.zhenai.com/zhenghun")
if err != nil {
panic(err)
}
defer resp.Body.Close()
//网页的编码是未知的,可能是GBK、UTF8等,所以要是能包装个方法去判断网络编码就好了
//正好golang.org/net/html包中有个chartset.DetermineEncoding方法可以直接拿来使用
//把现在把这个方法给重新包装成DetermineEncoding()来用
e := DetermineEncoding(resp.Body)
//用对应的编码读取网页编码
utf8Reader := transform.NewReader(resp.Body,e.NewDecoder())
if resp.StatusCode != http.StatusOK {
panic("this is bad request !")
}
all,err := ioutil.ReadAll(utf8Reader)
if err != nil {
panic(err)
}
//fmt.Printf("%s\n",all)
//正则功能:获取网页中所有城市的列表
//城市列表网页元素样例特征提取 :
// <a href="http://www.zhenai.com/zhenghun/aba" data-v-5e16505f="">阿坝</a>
// <a href="http://www.zhenai.com/zhenghun/akesu" data-v-5e16505f="">阿克苏</a>
// 。。。。
//
//需求: 提取出所有这样的城市列表
//正则编写: `<a href="http://www.zhenai.com/zhenghun/[a-zA-Z0-9]+"[^>]*>[^<]+</a>`
//正则解读:
// 所有列表前面长的都一样,`<a href="http://www.zhenai.com/zhenghun/`
// 匹配0个或多个非>字符并到第一个>结束,`<a href="http://www.zhenai.com/zhenghun/[a-zA-Z0-9]+"[^>]*>`
// 匹配至少一个字符并到第一个<的地方结束,最包含</a>, <a href="http://www.zhenai.com/zhenghun/aba" data-v-5e16505f="">阿坝</a>
r := regexp.MustCompile(`<a href="http://www.zhenai.com/zhenghun/[a-zA-Z0-9]+"[^>]*>[^<]+</a>`)
cityList := r.FindAll(all,-1)
//fmt.Printf("%s",cityList)
for _,item := range cityList {
fmt.Printf("%s\n",item)
}
}
//判断网络编码
func DetermineEncoding(r io.Reader)encoding.Encoding {
bytes,err := bufio.NewReader(r).Peek(1024)
if err != nil{
panic(err)
}
encode,_,_ := charset.DetermineEncoding(bytes,"")
return encode
}