日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go语言模拟网站登录并爬虫

發布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go语言模拟网站登录并爬虫 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

title: go語言模擬網站登錄并爬蟲
tags: go,爬蟲

想要學習爬蟲的朋友知道,有時候我們需要爬的網站必須登錄,才能獲取到數據,那么我們該怎么模擬登錄呢?

需求

我們登錄上網站,并且選擇應用管理。

我們現在需要爬取我們賬號下的所有APP信息,根據簽名期限,來計算APP剩余的時間(小時)。

獲取cookie

1.打開 https://866w.cn 登錄上網站
2.按F12(不考慮IE瀏覽器),我這里使用的Chrome, 我們選擇Network,再次刷新下網頁


3. 通過截圖我們可以看到 我們等會爬蟲的頁面是

https://866w.cn/index.php/home

  • 我先復制下我們的cookie
  • var cookie string ="in_userid=1; in_username=xxxxxqq.com; in_userpassword=xxxxx; in_adminid=3; in_adminname=xxxxxqq.com; in_adminpassword=xxxxx; in_permission=1%2C2%2C3%2C4%2C5%2C6"

    為了安全起見我把部分信息使用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 數組
    var userAgentList = []string{"Mozilla/5.0 (compatible, MSIE 10.0, Windows NT, DigExt)","Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, 360SE)","Mozilla/4.0 (compatible, MSIE 8.0, Windows NT 6.0, Trident/4.0)","Mozilla/5.0 (compatible, MSIE 9.0, Windows NT 6.1, Trident/5.0,","Opera/9.80 (Windows NT 6.1, U, en) Presto/2.8.131 Version/11.11","Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, TencentTraveler 4.0)","Mozilla/5.0 (Windows, U, Windows NT 6.1, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Macintosh, Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/5.0 (Macintosh, U, Intel Mac OS X 10_6_8, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Linux, U, Android 3.0, en-us, Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13","Mozilla/5.0 (iPad, U, CPU OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, Trident/4.0, SE 2.X MetaSr 1.0, SE 2.X MetaSr 1.0, .NET CLR 2.0.50727, SE 2.X MetaSr 1.0)","Mozilla/5.0 (iPhone, U, CPU iPhone OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","MQQBrowser/26 Mozilla/5.0 (Linux, U, Android 2.3.7, zh-cn, MB200 Build/GRJ22, CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"}
    • 隨機獲取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语言模拟网站登录并爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。