go語言模擬網站登入並爬蟲
title: go語言模擬網站登入並爬蟲
tags: go,爬蟲
想要學習爬蟲的朋友知道,有時候我們需要爬的網站必須登入,才能獲取到資料,那麼我們該怎麼模擬登入呢?
下面我將使用我的分發平臺作為演示:
打個小小的廣告:簽名、分發、web封裝、安卓破解 諮詢QQ:410258205
需求
我們登入上網站,並且選擇應用管理。
我們現在需要爬取我們賬號下的所有APP資訊,根據簽名期限,來計算APP剩餘的時間(小時)。
獲取cookie
1.開啟 https://866w.cn 登入上網站
2.按F12(不考慮IE瀏覽器),我這裡使用的Chrome, 我們選擇Network,再次重新整理下網頁
3. 通過截圖我們可以看到 我們等會爬蟲的頁面是
- 我先複製下我們的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的爬蟲框架。