1. 程式人生 > >go語言模擬網站登入並爬蟲

go語言模擬網站登入並爬蟲


title: go語言模擬網站登入並爬蟲
tags: go,爬蟲

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

下面我將使用我的分發平臺作為演示:

https://866w.cn

打個小小的廣告:簽名、分發、web封裝、安卓破解 諮詢QQ:410258205

需求

我們登入上網站,並且選擇應用管理。

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

獲取cookie

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


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

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

  1. 我先複製下我們的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的爬蟲框架。