V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wnanbei
V2EX  ›  Go 编程语言

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

  •  1
     
  •   wnanbei · 2019-12-02 10:25:31 +08:00 · 4380 次点击
    这是一个创建于 1569 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了一个基于 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 条回复    2019-12-04 00:24:01 +08:00
    meteor957
        1
    meteor957  
       2019-12-02 10:34:51 +08:00
    感觉 go 的轮子还挺多....
    wnanbei
        2
    wnanbei  
    OP
       2019-12-02 10:42:48 +08:00
    @meteor957 觉得它好用,愿意造轮子的就多了
    Wenco
        3
    Wenco  
       2019-12-02 10:47:20 +08:00
    wnanbei
        4
    wnanbei  
    OP
       2019-12-02 10:52:01 +08:00
    @Wenco 就是觉得这个东西很...我才自己写的
    realpg
        5
    realpg  
       2019-12-02 14:28:17 +08:00
    V 站 天天又是版权又是 TOS 的

    为啥搞起来违法的爬虫一个比一个精神
    wnanbei
        6
    wnanbei  
    OP
       2019-12-02 14:43:04 +08:00
    @realpg 朋友,先去看看爬虫的定义,然后再去看看法律,再回来说什么是违法的
    realpg
        7
    realpg  
       2019-12-02 14:44:53 +08:00
    @wnanbei #6
    我就告诉你一件事
    你写的东西当然不违法
    但是实际用起来 99.99999%都是违反人家 TOS 的
    wnanbei
        8
    wnanbei  
    OP
       2019-12-02 14:56:30 +08:00
    @realpg 夸张了,爬虫本质上只是网络请求,能做的事情很多,不能因为其被一部分人用于违法的,就把爬虫整个定义为违法的。
    yaoye555
        9
    yaoye555  
       2019-12-02 15:00:34 +08:00
    算了,兄 die,在 v 站里 爬虫 == 违法 == 坐牢. 我就纳闷为啥大厂都在明目张胆的招
    u823tg
        10
    u823tg  
       2019-12-02 15:07:20 +08:00
    加油,保持更新。
    wnanbei
        11
    wnanbei  
    OP
       2019-12-02 15:08:02 +08:00
    @yaoye555 算了,也不辨这些,跟我也没关系。本来只是提一句可以用来写爬虫的。
    我写的是 HTTP 客户端,用来发请求的,跟 python 的 requests 差不多,爱拿来干啥干啥。
    wnanbei
        12
    wnanbei  
    OP
       2019-12-02 15:08:38 +08:00
    @u823tg 谢谢,会保持更新的
    faceair
        13
    faceair  
       2019-12-02 15:32:18 +08:00
    wnanbei
        14
    wnanbei  
    OP
       2019-12-02 17:20:17 +08:00
    @faceair 参考的对象应该都是 python 的 requests
    wsseo
        15
    wsseo  
       2019-12-02 17:37:46 +08:00
    这么多 http client,改选哪一个?
    ershisi
        16
    ershisi  
       2019-12-02 17:42:06 +08:00
    @yaoye555 你可以爬可以自己偷偷摸摸用,但是你不能分享不能用这个数据去卖钱。就这么简单。。。
    yaoye555
        17
    yaoye555  
       2019-12-02 18:06:50 +08:00
    @ershisi 我只是好奇猪场招爬虫是干什么的,坐标广州
    wnanbei
        18
    wnanbei  
    OP
       2019-12-02 18:44:12 +08:00
    @wsseo 你问我的话,那我肯定说选 direwolf 呀,哈哈哈
    wnanbei
        19
    wnanbei  
    OP
       2019-12-03 09:44:08 +08:00
    @yaoye555 其实蛮多地方都会零零碎碎的需要爬虫的吧
    locoz
        20
    locoz  
       2019-12-03 10:00:52 +08:00
    @realpg #7 任何东西都要讲量的,与使劲调开放平台的 API 一样可以达到 DDOS 的效果同理。
    @yaoye555 #9 大厂招爬虫是因为需要,数据分析相关的业务只要涉及外部公开数据就会需要爬虫,毕竟别人的数据可不会随便拿出来卖。
    locoz
        21
    locoz  
       2019-12-03 10:02:48 +08:00
    我感觉我在 V2 上看到好几个仿 Python 上 requests 库的 Golang 库了
    wnanbei
        22
    wnanbei  
    OP
       2019-12-03 10:12:39 +08:00
    @locoz 可能都是觉得别人写的不够好,就自己写。实际上自己写出来的也没有好到哪里去,哈哈哈。
    还有个原因估计是没有长期稳定有效的更新。
    reus
        23
    reus  
       2019-12-04 00:24:01 +08:00
    @realpg 那百度违法吗?谷歌违法吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5369 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:41 · PVG 15:41 · LAX 00:41 · JFK 03:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.