go语言模拟网站登录并爬虫
title: go語言模擬網站登錄并爬蟲
tags: go,爬蟲
想要學習爬蟲的朋友知道,有時候我們需要爬的網站必須登錄,才能獲取到數據,那么我們該怎么模擬登錄呢?
需求
我們登錄上網站,并且選擇應用管理。
我們現在需要爬取我們賬號下的所有APP信息,根據簽名期限,來計算APP剩余的時間(小時)。
獲取cookie
1.打開 https://866w.cn 登錄上網站
2.按F12(不考慮IE瀏覽器),我這里使用的Chrome, 我們選擇Network,再次刷新下網頁
3. 通過截圖我們可以看到 我們等會爬蟲的頁面是
https://866w.cn/index.php/home
為了安全起見我把部分信息使用xxxx進行替換。
查看html 信息
<div class="card app card-ios"><i class="type-icon icon-apple"></i><div class="type-mark"></div><a class="appicon" href="/index.php/each_app/38"><img class="icon ng-isolate-scope" width="100" height="100" src="https://866w.cn/data/attachment/91541742353-1.png?v=1541750743" onerror="this.src='/static/app/iOS.png'"></a><br><p class="appname"><i class="icon-owner"></i><span class="ng-binding">鹿鼎娛樂</span></p><table><tbody><tr><td class="ng-binding">簽名期限:</td><td><span class="ng-binding"><a href="/index.php/sign_app/38">2018-12-10 13:49:16</a></span></td></tr><tr><td class="ng-binding">應用平臺:</td><td><span class="ng-binding">iOS</span></td></tr><tr><td class="ng-binding">應用標識:</td><td><span class="ng-binding">com.baochi.bc</span></td></tr><tr><td class="ng-binding">最新版本:</td><td><span class="ng-binding">1.0(Build 1891)</span></td></tr></tbody></table><div class="action"><a class="ng-binding" href="/index.php/profile_app/38"><i class="icon-pen"></i> 管理</a><a href="https://866w.cn/app.php/38" target="_blank" class="ng-binding"><i class="icon-eye"></i> 預覽</a><button class="btn btn-remove ng-scope" onclick="del_app(38, 1)"><i class="icon icon-trash"></i></button></div></div>通過上面的代碼我們可以看到 我們的app信息都在類為 card app card-ios 的div塊里面, 并且我們的主要信息都在<span class="ng-binding">xxxxx</span>包含著
制作正則表達式
當然我這個正則表達式只是為了偷懶,所有需要爬去的信息都是使用(.*?)來獲取,我這個肯定不是好的方案,你可以自己去嘗試寫一個正則表達式。
這里我定義一個 Reg變量,保存正則表達式。
Reg := `<div class="card app card-ios">(.*?)<span class="ng-binding">(.*?)</span></p><table><tbody><tr><td class="ng-binding">簽名期限:</td><td><span class="ng-binding"><a href="(.*?)">(.*?)</a></span></td></tr><tr><td class="ng-binding">應用平臺:</td><td><span class="ng-binding">iOS</span></td></tr><tr><td class="ng-binding">應用標識:</td><td><span class="ng-binding">(.*?)</span></td></tr><tr><td class="ng-binding">最新版本:</td><td><span class="ng-binding">(.*?)</span></td></tr></tbody></table>(.*?)</div>反爬蟲
有的時候一些網站會有一些反爬蟲機制,判斷你是人工訪問,還是機器訪問,判斷的原則,就是識別user-agent ,這里我們定義一個字符串切片,來保存不同瀏覽器的user-agent。當然有得網站還有IP訪問限制,你可以使用代理解決,這里我們就不討論這種情況了。
- user-agent 數組
- 隨機獲取user-agent
上面我們存儲了不同的瀏覽器user-agent, 現在我們還需要一個函數來隨機調用它們。
func GetRandomUserAgent() string {r := rand.New(rand.NewSource(time.Now().UnixNano()))return userAgentList[r.Intn(len(userAgentList))] }模擬登錄并獲取html代碼
現在我們開始進入重點,有了cookie我們怎么才能模擬登錄,并且怎么才能獲取網站的信息。
func getUrlRespHtml() string {url := "https://866w.cn/index.php/home"client := &http.Client{}req, err := http.NewRequest("GET", url, nil)if err!=nil {fmt.Println("獲取地址錯誤")}req.Header.Set("Cookie", cookie)req.Header.Add("Agent",GetRandomUserAgent() )resp, err := client.Do(req)if err!=nil {fmt.Println("登錄錯誤")}resp_byte, err := ioutil.ReadAll(resp.Body)defer resp.Body.Close()respHtml := string(resp_byte)return respHtml}使用正則表達式篩選信息
當然我們獲取了網站的html 代碼也不行,html的信息太多,我們需要對它進行篩選,我們需要獲取應用名稱、簽名期限、應用標識、最新版本 等信息,并且我們還需要根據簽名期限來計算剩余時間。
func Initialize() {reader := getUrlRespHtml()Reg := `<div class="card app card-ios">(.*?)<span class="ng-binding">(.*?)</span></p><table><tbody><tr><td class="ng-binding">簽名期限:</td><td><span class="ng-binding"><a href="(.*?)">(.*?)</a></span></td></tr><tr><td class="ng-binding">應用平臺:</td><td><span class="ng-binding">iOS</span></td></tr><tr><td class="ng-binding">應用標識:</td><td><span class="ng-binding">(.*?)</span></td></tr><tr><td class="ng-binding">最新版本:</td><td><span class="ng-binding">(.*?)</span></td></tr></tbody></table>(.*?)</div>`rp1 := regexp.MustCompile(Reg)heads := rp1.FindAllStringSubmatch(reader, -1)timeLayout := "2006-01-02 15:04:05" //轉化所需模板loc, _ := time.LoadLocation("Local")for _, v := range heads {theTime, _ := time.ParseInLocation(timeLayout, v[4], loc) //使用模板在對應時區轉化為time.time類型TimeNow := time.Now()left := theTime.Sub(TimeNow)appHours := int(left.Hours())fmt.Printf("應用名稱:%s \n到期時間: %s\n剩余時間 :%s小時\n應用標識:%s\n應用版本:%s\n ",v[2],v[4],strconv.Itoa(appHours),v[5],v[6])fmt.Println()} }運行
func main() {Initialize() }我們可以查看到運行結果。
總結
到此我們的教程已經結束,你可以自己根據你的需求來添加文本保存,或者其他啥的功能。如果你對正則表達式比較頭疼,你也可以選擇一些go的爬蟲框架。
總結
以上是生活随笔為你收集整理的go语言模拟网站登录并爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10分钟就可以秒懂计算机体系结构与CPU
- 下一篇: 装修小常识(200条)