基于 Golang 的 HTTP 客户端,爬虫工具 direwolf - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wnanbei

基于 Golang 的 HTTP 客户端,爬虫工具 direwolf

  wnanbei Dec 2, 2019 5145 views
This topic created in 2338 days ago, the information mentioned may be changed or developed.

写了一个基于 Golang 的 HTTP 客户端,可以做为爬虫工具。因为用 Golang 发请求的时候发现有些设置很麻烦,所以参考 Python 的 Requests,写了这个工具。

地址: https://wnanbei.github.io/direwolf/

网站中有完整的中文文档,后续会继续完善和添加新的功能。有兴趣的朋友欢迎在 Gayhub 点个 star,如果有 BUG、问题或者建议,也可以在 Gayhub 的 Issues 页面与我讨论。

特性:

  • 简单方便的 API 接口
  • 非常方便的设置 Headers,Cookies,URL 参数,Post 表单 等请求选项
  • 可以设置到单个请求的超时、代理、重定向控制
  • Cookie 的自动管理与存储
  • 内置连接池,复用 TCP 连接
  • 支持用正则或 CSS 选择器提取响应数据
  • 响应编码控制

以下是部分简单用法的展示:

你可以像下方这样非常简单的发起一个请求:

import ( "fmt" dw "github.com/wnanbei/direwolf" ) func main() { resp, err := dw.Get("http://httpbin.org/get") if err != nil { return } fmt.Println(resp.Text()) } 

输出:

{ "args": {}, "headers": { "Accept-Encoding": "gzip", "Host": "httpbin.org", "User-Agent": "direwolf - winter is coming" }, "origin": "171.217.52.188, 171.217.52.188", "url": "https://httpbin.org/get" } 

除此之外,direwolf 可以很方便的给一个请求添加参数,例如 Headers、Cookies、Params。

import ( "fmt" dw "github.com/wnanbei/direwolf" ) func main() { headers := dw.NewHeaders( "User-Agent", "direwolf", ) params := dw.NewParams( "name", "wnanbei", "age", "18", ) cookies := dw.NewCookies( "sign", "kzhxciuvyqwekhiuxcyvnkjdhiue", ) resp, err := dw.Get("https://httpbin.org/get", headers, params, cookies) if err != nil { return } fmt.Println(resp.Text()) } 

输出:

{ "args": { "age": "18", "name": "wnanbei" }, "headers": { "Accept-Encoding": "gzip", "Cookie": "sign=kzhxciuvyqwekhiuxcyvnkjdhiue", "Host": "httpbin.org", "User-Agent": "direwolf" }, "origin": "1.1.1.1, 1.1.1.1", "url": "https://httpbin.org/get?age=18&name=wnanbei" } 
23 replies    2019-12-04 00:24:01 +08:00
meteor957
    1
meteor957  
   Dec 2, 2019
感觉 go 的轮子还挺多....
wnanbei
    2
wnanbei  
OP
   Dec 2, 2019
@meteor957 觉得它好用,愿意造轮子的就多了
Wenco
    3
Wenco  
   Dec 2, 2019
wnanbei
    4
wnanbei  
OP
   Dec 2, 2019
@Wenco 就是觉得这个东西很...我才自己写的
realpg
    5
realpg &nbp;
PRO
   Dec 2, 2019
V 站 天天又是版权又是 TOS 的

为啥搞起来违法的爬虫一个比一个精神
wnanbei
    6
wnanbei  
OP
   Dec 2, 2019
@realpg 朋友,先去看看爬虫的定义,然后再去看看法律,再回来说什么是违法的
realpg
    7
realpg  
PRO
   Dec 2, 2019
@wnanbei #6
我就告诉你一件事
你写的东西当然不违法
但是实际用起来 99.99999%都是违反人家 TOS 的
wnanbei
    8
wnanbei  
OP
   Dec 2, 2019
@realpg 夸张了,爬虫本质上只是网络请求,能做的事情很多,不能因为其被一部分人用于违法的,就把爬虫整个定义为违法的。
yaoye555
    9
yaoye555  
   Dec 2, 2019
算了,兄 die,在 v 站里 爬虫 == 违法 == 坐牢. 我就纳闷为啥大厂都在明目张胆的招
u823tg
    10
u823tg  
   Dec 2, 2019
加油,保持更新。
wnanbei
    11
wnanbei  
OP
   Dec 2, 2019
@yaoye555 算了,也不辨这些,跟我也没关系。本来只是提一句可以用来写爬虫的。
我写的是 HTTP 客户端,用来发请求的,跟 python 的 requests 差不多,爱拿来干啥干啥。
wnanbei
    12
wnanbei  
OP
   Dec 2, 2019
@u823tg 谢谢,会保持更新的
faceair
    13
faceair  
   Dec 2, 2019
wnanbei
    14
wnanbei  
OP
   Dec 2, 2019
@faceair 参考的对象应该都是 python 的 requests
wsseo
    15
wsseo  
   Dec 2, 2019
这么多 http client,改选哪一个?
ershisi
    16
ershisi  
   Dec 2, 2019
@yaoye555 你可以爬可以自己偷偷摸摸用,但是你不能分享不能用这个数据去卖钱。就这么简单。。。
yaoye555
    17
yaoye555  
   Dec 2, 2019
@ershisi 我只是好奇猪场招爬虫是干什么的,坐标广州
wnanbei
    18
wnanbei  
OP
   Dec 2, 2019
@wsseo 你问我的话,那我肯定说选 direwolf 呀,哈哈哈
wnanbei
    19
wnanbei  
OP
   Dec 3, 2019
@yaoye555 其实蛮多地方都会零零碎碎的需要爬虫的吧
locoz
    20
locoz  
   Dec 3, 2019
@realpg #7 任何东西都要讲量的,与使劲调开放平台的 API 一样可以达到 DDOS 的效果同理。
@yaoye555 #9 大厂招爬虫是因为需要,数据分析相关的业务只要涉及外部公开数据就会需要爬虫,毕竟别人的数据可不会随便拿出来卖。
locoz
    21
locoz  
   Dec 3, 2019
我感觉我在 V2 上看到好几个仿 Python 上 requests 库的 Golang 库了
wnanbei
    22
wnanbei  
OP
   Dec 3, 2019
@locoz 可能都是觉得别人写的不够好,就自己写。实际上自己写出来的也没有好到哪里去,哈哈哈。
还有个原因估计是没有长期稳定有效的更新。
reus
    23
reus  
   Dec 4, 2019
@realpg 那百度违法吗?谷歌违法吗?
About     Help     Advertise     Blog     API     FAQ     Solana     3619 Online   Highest 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 84ms UTC 04:37 PVG 12:37 LAX 21:37 JFK 00:37
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86