序言
今天在工作上面需要用到爬蟲抓取部分信息,之前用Python實現了CSDN博客的抓取,後想到了目前整天面對的Golang,便摸索了一下,實現了一個簡單的抓取豆瓣排行的爬蟲,主要分爲下面幾個步驟.
- 發起Http請求
- 解析Html元素
- 存儲抓取到的數據
發起http請求
在請求方面,直接採用的Golang的"net/http"包來進行開發,步驟如下:初始化
client := &http.Client{}
req, err := http.NewRequest("GET", swoop.url, nil)
set請求信息
for key, value := range swoop.header {
req.Header.Add(key, value)
}
發起請求
resp, err := client.Do(req)
if err != nil {
log.Fatalf("do client err->%v", err)
}
接收響應
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("read resp err->%v", err)
}
解析Html元素設置參數並請求
首先需要定義個設置參數結構體,便於操作:type Swoop struct {
url string
header map[string]string
}
設置參數後發起請求
url := "https://movie.douban.com/top250?start=" + strconv.Itoa(i*25)
swoop := &Swoop{url, header}
html := swoop.get_html_header()
解析Html元素髮起請求後,接收到Html元素,接下來需要做的就是解析Html元素,將其轉化爲我們想要的格式,解析Html格式需要到頁面瀏覽器查看對應的Html元素後再做操作://評價人數
commentCount := `<span>(.*?)評價</span>`
rp2 := regexp.MustCompile(commentCount)
txt2 := rp2.FindAllStringSubmatch(html, -1)
//評分
pattern3 := `property="v:average">(.*?)</span>`
rp3 := regexp.MustCompile(pattern3)
txt3 := rp3.FindAllStringSubmatch(html, -1)
//電影名稱
pattern4 := `img width="(.*?)" alt="(.*?)" src=`
rp4 := regexp.MustCompile(pattern4)
txt4 := rp4.FindAllStringSubmatch(html, -1)
如下Html頁面代碼,其中評價包含在"<\span>"標籤內,所以在解析的時候需要解析<\span>標籤:<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.5</span>
<span property="v:best" content="10.0"></span>
<span>702861人評價</span>
</div>
如下頁面代碼,包含了width、alt、src三個value,則需要拿到title就需要解析<\img>標籤後讀取第二個value值,即alt<img width="100" alt="這個殺手不太冷" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg" class="">
- 運行代碼後效果如下運行中:
運行結束:
### 數據存儲
數據存儲一般根據自己的需要來做,我這裏採用的是csv文件存儲.
如下所示: