分享
  1. 首页
  2. 文章

Golang实现http接口调用及web数据抓取[get post模式]

rfyiamcool · · 10538 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前沿:

继续扩展我的golang服务端,这边有些数据库是没有权限的,对方给了我webservices的接口,针对异常的数据,我要去抓数据,再次分析,golang貌似没有python那么多的模拟浏览器访问的模块,还好默认的http就支持。 功能一点都不必urllib2 差。。。


正题!!! 这里是通过golang提供的net/http模块, http.NewRequest来进行数据抓取。 他能实现python下的urllib2的功能 !

原理不多说了,大家直接套用这两个get post的例子吧。

可以任意的加header头,比如怎么加一个浏览器的标识 !

Python
1
2
3
4
5
6
client:=&http.Client{]
req,err:=http.NewRequest("POST","http://127.0.0.1",bytes.NewReader(postData))
req.Header.Add("User-Agent","无敌浏览器")
resp,err:=client.Do(req)
defer resp.Body.Close()

下面是完整的例子,可以加更多的Header

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#http://xiaorui.cc
package main
import(
"net/http"
"io/ioutil"
"fmt"
"net/url"
)
func main(){
client:=&http.Client{}
reqest,_:=http.NewRequest("GET","http://127.0.0.1/",nil)
reqest.Header.Set("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
reqest.Header.Set("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3")
reqest.Header.Set("Accept-Encoding","gzip,deflate,sdch")
reqest.Header.Set("Accept-Language","zh-CN,zh;q=0.8")
reqest.Header.Set("Cache-Control","max-age=0")
reqest.Header.Set("Connection","keep-alive")
reqest.Header.Set("User-Agent","chrome 100")
response,_:=client.Do(reqest)
ifresponse.StatusCode==200{
body,_:=ioutil.ReadAll(response.Body)
bodystr:=string(body);
fmt.Println(bodystr)
}
//reqest,_=http.NewRequest("POST","http:/127.0.0.1/",bytes.NewBufferString(data.Encode()))
/respet1,_:=http.NewRequest("POST","http://127.0.0.1/",url.Values{"key":"Value"})
//reqest1.Header.Set("User-Agent","chrome 100")
//client.Do(reqest1)
}


我们再来测试下 post获取数据 !

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#http://xiaorui.cc
package main
import(
"fmt"
"net/http"
"net/url"
"io/ioutil"
)
func main(){
get()
post()
}
func get(){
response,_:=http.Get("http://127.0.0.1/")
defer response.Body.Close()
body,_:=ioutil.ReadAll(response.Body)
fmt.Println(string(body))
ifresponse.StatusCode==200{=
fmt.Println("ok")
}else{
fmt.Println("error")
}
}
func post(){
//resp,err:=
http.PostForm("http://127.0.0.1",
url.Values{"name":{"ruifengyun"},"blog":{"xiaorui.cc"},
"aihao":{"python golang"},"content":{"nima,fuck "}})
}


我们用http加上golang的runtime可以搞成类似 ab的压力测试工具,我昨天写了一个版本,但是在压倒3k以上的链接数的时候,会出现不少的error,原因可能是linux本身没有做tcp的优化,获取是对端的tornado没有用@gen,所以效率跟不上去,我的压力程序没有做defer panic处理。 今天看了下 golang的 gb压力测试工具,发现主要的思路是相同的,但是很多的细节没有做处理,比如channel的同步是用那种for <-c 的土方法实现的。

我的程序是有问题,但是老外有大牛已经构建了一套类似ab的工具,性能差不多,但是这个支持更多的选项和参数,包括代理,基本认证,请求头header信息,长链接,post,gzip压缩,开启几个cpu核心,cookie的插入。

Python
1
2
3
go get github.com/parkghost/gohttpbench
go build-ogb github.com/parkghost/gohttpbench


用golang实现的搞并发的压力测试工具 !

原文:xiaoruicc

-A="": Add Basic WWW Authentication, the attributes are a colon separated username and password.

-C=[]: Add cookie, eg. ‘Apache=1234. (repeatable)

-G=4: Number of CPU

-H=[]: Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Inserted after all normal header lines. (r

epeatable)

-T="text/plain": Content-type header for POSTing, eg. ‘application/x-www-form-urlencoded’ Default is ‘te

xt/plain’

-c=1: Number of multiple requests to make

-h=false: Display usage information (this message)

-i=false: Use HEAD instead of GET

-k=false: Use HTTP KeepAlive feature

-n=1: Number of requests to perform

-p="": File containing data to POST. Remember also to set -T

-r=false: Don’t exit when errors

-t=0: Seconds to max. wait for responses

-u="": File containing data to PUT. Remember also to set -T

-v=0: How much troubleshooting info to print

-z=false: Use HTTP Gzip feature

wKiom1MybG7Q9OCWAAgXzjPTBo0978.jpg

具体的用法:

wKiom1MybJyxPy2CAAUE_hjCdcE841.jpg

咱们在看看nginx服务端的日志情况:

wKiom1MybvfyFxAyABD8hLgjayk480.jpg


有疑问加站长微信联系(非本文作者)

本文来自:峰云就她了

感谢作者:rfyiamcool

查看原文:Golang实现http接口调用及web数据抓取[get post模式]

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
10538 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏