golang爬虫登录(四-进阶版)以及利用fiddler抓包

前几篇文章摸索了如何用golang模拟登录;对简单的情况,甚至可以用GET方式代替POST方式登录。

但现在想抓取公司泛微OA系统的网页,就遇到一些困难。

难点:

1、登录页POST提交后,会有http 302跳转。后来发现不是问题,因为用http.Client.Do会自动处理跳转。

2、网站使用了FrameSet,还有大量jquery动态生成加载内容,这个处理起来比较困难,链接也是JS生成,只能针对具体问题具体分析。

3、用chrome控制台抓到的header提交不成功,于是想到fiddler抓包,正好电脑上曾经下载过一个汉化版。

过程(主要是解决了POST登录问题):

1、参考https://blog.csdn.net/qq_24373725/article/details/80584810  用fiddler抓包(我下载的汉化版本一启动就自动抓所有包,感觉很方便,就是不知道有无后门),在过滤器中设置服务器网址:192.168.132.80;在 规则-自动断点处-勾选 在请求之前。

2、在IE中从登录页输入用户名、密码后提交登录。就会在fiddler中抓到表单对应的提交网址:/login/VerifyLogin.jsp,接着在断点处中断了。点击相应的: 运行到结束,或:中断响应(对于rameset中的一些页面可以中断响应,框架网页的一部分会显示空白),经过几次鼠标点击操作,一串页面先后执行完毕。

3、最重要的还是form表单对应的/login/VerifyLogin.jsp页(其他网页其实没什么用),查看抓包到的原始数据为(我将用户名和密码改了:-)

POST http://192.168.132.80/login/VerifyLogin.jsp HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://192.168.132.80/wui/theme/ecology7/page/login.jsp?templateId=6&logintype=1&gopage=&languageid=7&message=16
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 192.168.132.80
Content-Length: 284
Connection: Keep-Alive
Pragma: no-cache
Cookie: logincookiecheck=1581132245967+C1D3FCB434C8223BE9C4CE5AD9497183; JSESSIONID=abc67CXfxpBtu9aM2VR-w; testBanCookie=test; loginfileweaver=%2Fwui%2Ftheme%2Fecology7%2Fpage%2Flogin.jsp%3FtemplateId%3D6%26logintype%3D1%26gopage%3D; loginidweaver=114; languageidweaver=7

loginfile=%2Fwui%2Ftheme%2Fecology7%2Fpage%2Flogin.jsp%3FtemplateId%3D6%26logintype%3D1%26gopage%3D&logintype=1&fontName=%CE%A2%EF%BF%BD%EF%BF%BD%EF%BF%BD%C5%BA%EF%BF%BD&message=16&gopage=&formmethod=post&rnd=&serial=&username=&isie=true&loginid=admin&userpassword=1234&submit=

4、试着将上述数据写入go代码中,直接上代码:

//参考:https://blog.csdn.net/kenkao/article/details/88844212
//http.Get  http.Post http.PostForm http.Client.Do四种请求方式
//https://blog.csdn.net/qq_24373725/article/details/80584810
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/http/cookiejar"

    //    "net/url"
    "strings"
    "time"

    "golang.org/x/text/encoding/simplifiedchinese"
)

type MySpider struct {
    indexUrl string
    cleint   *http.Client
}

//登录,用POST请求
func (this MySpider) login() (string, error) {
    //访问首页
    resp, err := this.cleint.Get(this.indexUrl)
    defer resp.Body.Close()
    time.Sleep(time.Duration(300) * time.Microsecond)

    //POST提交
    //post_arg := url.Values{"loginid": {"admin"}, "userpassword": {"1234"}}
    post_arg := "loginfile=%2Fwui%2Ftheme%2Fecology7%2Fpage%2Flogin.jsp%3FtemplateId%3D6%26logintype%3D1%26gopage%3D&logintype=1&fontName=%CE%A2%EF%BF%BD%EF%BF%BD%EF%BF%BD%C5%BA%EF%BF%BD&message=16&gopage=&formmethod=post&rnd=&serial=&username=&isie=true&loginid=admin&userpassword=1234&submit="
    //fmt.Println(post_arg.Encode())
    //req, err := http.NewRequest("POST", "http://192.168.132.80/login/VerifyLogin.jsp", strings.NewReader(post_arg.Encode()))
    req, err := http.NewRequest("POST", "http://192.168.132.80/login/VerifyLogin.jsp", strings.NewReader(post_arg))
    if err != nil {
        // handle error
    }
    req.Header.Set("Accept", "text/html, application/xhtml+xml, */*")
    req.Header.Set("Referer", "http://192.168.132.80/wui/theme/ecology7/page/login.jsp?templateId=6&logintype=1&gopage=&languageid=7&message=16")
    req.Header.Set("Accept-Language", "zh-CN")
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Accept-Encoding", "gzip, deflate")
    req.Header.Set("Host", "192.168.132.80")
    req.Header.Set("Content-Length", "284")
    req.Header.Set("Connection", "keep-alive")
    req.Header.Set("Pragma", "no-cache")
    req.Header.Set("Cookie", "logincookiecheck=1581132245967+C1D3FCB434C8223BE9C4CE5AD9497183; JSESSIONID=abc67CXfxpBtu9aM2VR-w; testBanCookie=test; loginfileweaver=%2Fwui%2Ftheme%2Fecology7%2Fpage%2Flogin.jsp%3FtemplateId%3D6%26logintype%3D1%26gopage%3D; loginidweaver=114; languageidweaver=7")

    //req.Header.Set("Cache-Control", "no-cache")
    //req.Header.Set("Origin", "http://192.168.132.80")

    //req.Header.Set("Upgrade-Insecure-Requests:", "1")
    a := req.Header.Get("Referer")
    fmt.Println(string(a))
    //b, err := ioutil.ReadAll(req.Body)
    //fmt.Println(string(b))
    resp, err = this.cleint.Do(req)
    defer resp.Body.Close()
    reader := simplifiedchinese.GB18030.NewDecoder().Reader(resp.Body)
    body, err := ioutil.ReadAll(reader)
    if err != nil {
        // handle error
    }
    fmt.Println(string(body))

    //访问登录后才能访问的页面
    resp, err = this.cleint.Get("http://192.168.132.80/CRM/data/CustomerBrowser.jsp?splitflag=")
    defer resp.Body.Close()
    //time.Sleep(time.Duration(1000) * time.Microsecond)
    reader = simplifiedchinese.GB18030.NewDecoder().Reader(resp.Body)
    body, err = ioutil.ReadAll(reader)
    fmt.Println(string(body))

    return "", err
}

//运行
func (this MySpider) run() string {
    //生成可复用的client
    var client http.Client
    jar, err := cookiejar.New(nil)
    if err != nil {
        panic(err)
    }
    client.Jar = jar
    this.cleint = &client
    //登录,用GET代替POST请求
    this.login()
    return ""
}

func main() {
    //爬虫实例
    ms := new(MySpider)
    //入口地址http://192.168.133.16:8080
    ms.indexUrl = "http://192.168.132.80/wui/theme/ecology7/page/login.jsp"
    ms.run()
}

让人感到高兴的是,代码中:

1.http.NewRequest 所需参数,也就是表单数据,应该叫body部分吧(与http头 有一个空行间隔开),可以直接从抓包到的 原始 数据 中一次复制出来。见代码中的post_arg变量值。

2.http header(请求头部分)也可直观在从抓包到的 原始 数据 中看到。即代码中req.Header.Set设置的那些http头内容。

当然,遗留的问题还是难以解决,如:获取jquery延迟加载的数据,打开javascript链接对应的网址、找frameset中的元素。解决办法应该还是要用headless无头浏览器处理。

原文地址:https://www.cnblogs.com/pu369/p/12283458.html

时间: 2024-08-06 05:45:28

golang爬虫登录(四-进阶版)以及利用fiddler抓包的相关文章

利用Wireshark抓包登录博客园

1,打开WireShark,选择本地网卡. 2,在filter中输入过滤条件Http. 3,找到http包中的get 和post的包,这时你可以找到你登录的用户名和密码了,这个用户名和密码通过表单进行验证. 利用Wireshark抓包登录博客园,布布扣,bubuko.com

利用fiddler抓取Android app数据包

前言 做Android开发的朋友经常需要做网络数据的获取和提交表单数据等操作,然而对于调试程序而言,很难知道我们的数据到底是以怎样的形式发送的,是否发送成功,如果发送失败有是什么原因引起的.fiddler工具为我们提供了很方便的抓包操作,可以轻松抓取浏览器的发出的数据,不管是手机APP,还是web浏览器,都是可以的. 什么是fiddler 百度百科上是这样说的:Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出&quo

利用Fiddler抓取websocket包

一.利用fiddler抓取websockt包 打开Fiddler,点开菜单栏的Rules,选择Customize Rules... 这时会打开CustomRules.js文件,在class Handlers中加入以下代码 static function OnWebSocketMessage(oMsg: WebSocketMessage) { // Log Message to the LOG tab FiddlerApplication.Log.LogString(oMsg.ToString()

FTP协议的粗浅学习--利用wireshark抓包分析相关tcp连接

一.为什么写这个 昨天遇到个ftp相关的问题,关于ftp匿名访问的.花费了大量的脑细胞后,终于搞定了服务端的配置,现在客户端可以像下图一样,直接在浏览器输入url,即可直接访问. 期间不会弹出输入用户名密码来登录的窗口. 今天我主要是有点好奇,在此过程中,究竟是否是用匿名账户“anonymous”该账户登录了,还是根本不需要登录呢? 于是用wireshark抓包了一下. 二.抓包过程 我这边直接用了捕获过滤器抓本机和ftp之间的包.抓包后直接ctrl+F进行文本查找. 果然发现是发送了USER

九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import json import random import re import urllib.error def hq_html(hq_url): """ hq_html()封装的爬虫函数,自动启用了用户代理和ip代理 接收一个参数url,要爬取页面的url,返回html源码 "

DOS下利用dumpcap抓包

wireshark是一款非常好用的抓包工具,一般可直接通过界面配置方式进行抓包. 当需要长时间进行抓包时,可利用dumpcap.exe工具并设置抓包条件进行抓包. 主要分为一下三步: 1. 进入wireshark目录 cd d:\wireshark 2. 查看抓包网卡 dumpcap.exe -D 3. 进行抓包 dumpcap.exe -i 1(网卡)-s 0(长度)-B 256(缓存) filesize:100000(大小) -w f:\1.pcap(路径) -f "host 1.2.3.4

利用rawcap抓包(自己发给自己的包裹)

恰逢需要实现一个简单的web服务器,在调试中发现使用chrome访问的时候,似乎会发出3个包裹,只有一个有效,其他两个不知道是干啥的,于是准备用wireshark抓包 期间了解到ping使用icmp协议,抓包中发现,不管是TCP/IP还是ICMP,都没有自己发给自己的包 无奈用google一搜寻,才发现 类似发给127.0.0.1的包,是发给回环设备的,wireshark并不能抓到, 参见 https://wiki.wireshark.org/CaptureSetup/Loopback 需要使用

爬虫——Scrapy框架案例一:手机APP抓包

以爬取斗鱼直播上的信息为例: URL地址:http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=0 爬取字段:房间ID.房间名.图片链接.存储在本地的图片路径.昵称.在线人数.城市 1.items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.s

wireshark抓包图解-tcp三次握手四次挥手详解/

http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B%E8%AF%A6%E8%A7%A3/ wireshark抓包图解-tcp三次握手四次挥手详解/ tcpdump抓包命令使用方法及内容解析/