Go语言模拟登录并爬虫


title: Go语言模拟登录并爬虫
tags: go,爬虫
author: Clown95


想要学习爬虫的朋友知道,有时候我们需要爬的网站必须登录,才能获取到数据,那么我们该怎么模拟登录呢?

需求

我们登录上网站,并且选择应用管理。
我们现在需要爬取我们账号下的所有APP信息,根据签名期限,来计算APP剩余的时间(小时)。


获取cookie

1.登录上网站
2.按F12(不考虑IE浏览器),我这里使用的Chrome, 我们选择Network,再次刷新下网页

  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="这边是网站地址。。。" 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的爬虫框架。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容