geziyor

geziyorMPL-2.0更新放缓

Go 语言编写的高性能网页爬虫与抓取框架,支持 JS 渲染,适合快速搭建大规模采集任务。

Geziyor, blazing fast web crawling & scraping framework for Go. Supports JS rendering.

暂无版本2,783star153fork同步于 2026-11-07 07:34 UTC

怎么上手

由 README 提炼,执行前请确认
go get -u github.com/geziyor/geziyor
硬件要求按 README 说明

README 未说明显存或 GPU 要求;JS 渲染需本机安装 Chrome,也可通过 BrowserEndpoint 连接外部 Chrome 实例。macOS 下并发超过 256 需调高文件描述符上限。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

Go 语言的高性能网页爬取与抓取框架,支持 JS 渲染,适合数据挖掘与监控

Go 语言编写的高性能网页爬虫与抓取框架,支持 JS 渲染,适合快速搭建大规模采集任务。

核心能力

  • 用 GetRendered 调用本地 Chrome 渲染 JS 页面
  • 通过 Exports 通道自动导出 JSON、CSV 或自定义格式
  • 支持内存、磁盘、LevelDB 多级缓存
  • 按全局或按域名限制并发并设置固定或随机请求延迟
  • 内置 Prometheus、Expvar 指标与轮询代理管理

容易踩的坑

JS 渲染依赖本机已安装 Chrome,否则 GetRendered 无法工作;官方强烈建议使用 go modules 管理依赖;macOS 默认文件描述符上限会限制高并发请求数。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

0 个版本

暂无 release 数据(可能没有发版,或尚未同步)。

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Geziyor

    Geziyor is a blazing fast web crawling and web scraping framework. It can be used to crawl websites and extract structured data from them. Geziyor is useful for a wide range of purposes such as data mining, monitoring and automated testing.

    GoDoc report card Code Coverage

    Features

    • JS Rendering
    • 5.000+ Requests/Sec
    • Caching (Memory/Disk/LevelDB)
    • Automatic Data Exporting (JSON, CSV, or custom)
    • Metrics (Prometheus, Expvar, or custom)
    • Limit Concurrency (Global/Per Domain)
    • Request Delays (Constant/Randomized)
    • Cookies, Middlewares, robots.txt
    • Automatic response decoding to UTF-8
    • Proxy management (Single, Round-Robin, Custom)

    See scraper Options for all custom settings.

    Status

    We highly recommend you to use Geziyor with go modules.

    Usage

    This example extracts all quotes from quotes.toscrape.com and exports to JSON file.

    func main() {
        geziyor.NewGeziyor(&geziyor.Options{
            StartURLs: []string{"http://quotes.toscrape.com/"},
            ParseFunc: quotesParse,
            Exporters: []export.Exporter{&export.JSON{}},
        }).Start()
    }
    
    func quotesParse(g *geziyor.Geziyor, r *client.Response) {
        r.HTMLDoc.Find("div.quote").Each(func(i int, s *goquery.Selection) {
            g.Exports <- map[string]interface{}{
                "text":   s.Find("span.text").Text(),
                "author": s.Find("small.author").Text(),
            }
        })
        if href, ok := r.HTMLDoc.Find("li.next > a").Attr("href"); ok {
            g.Get(r.JoinURL(href), quotesParse)
        }
    }
    

    See tests for more usage examples.

    Documentation

    Installation

    go get -u github.com/geziyor/geziyor
    

    If you want to make JS rendered requests, make sure you have Chrome installed.

    NOTE: macOS limits the maximum number of open file descriptors. If you want to make concurrent requests over 256, you need to increase limits. Read this for more.

    Making Normal Requests

    Initial requests start with StartURLs []string field in Options. Geziyor makes concurrent requests to those URLs. After reading response, ParseFunc func(g *Geziyor, r *Response) called.

    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs: []string{"http://api.ipify.org"},
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            fmt.Println(string(r.Body))
        },
    }).Start()
    

    If you want to manually create first requests, set StartRequestsFunc. StartURLs won't be used if you create requests manually.
    You can make requests using Geziyor methods:

    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
        	g.Get("https://httpbin.org/anything", g.Opt.ParseFunc)
            g.Head("https://httpbin.org/anything", g.Opt.ParseFunc)
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            fmt.Println(string(r.Body))
        },
    }).Start()
    

    Making JS Rendered Requests

    JS Rendered requests can be made using GetRendered method. By default, geziyor uses local Chrome application CLI to start Chrome browser. Set BrowserEndpoint option to use different chrome instance. Such as, "ws://localhost:3000"

    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            g.GetRendered("https://httpbin.org/anything", g.Opt.ParseFunc)
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            fmt.Println(string(r.Body))
        },
        //BrowserEndpoint: "ws://localhost:3000",
    }).Start()
    

    Extracting Data

    We can extract HTML elements using response.HTMLDoc. HTMLDoc is Goquery's Document.

    HTMLDoc can be accessible on Response if response is HTML and can be parsed using Go's built-in HTML parser If response isn't HTML, response.HTMLDoc would be nil.

    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs: []string{"http://quotes.toscrape.com/"},
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            r.HTMLDoc.Find("div.quote").Each(func(_ int, s *goquery.Selection) {
                log.Println(s.Find("span.text").Text(), s.Find("small.author").Text())
            })
        },
    }).Start()
    

    Exporting Data

    You can export data automatically using exporters. Just send data to Geziyor.Exports chan. Available exporters

    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs: []string{"http://quotes.toscrape.com/"},
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            r.HTMLDoc.Find("div.quote").Each(func(_ int, s *goquery.Selection) {
                g.Exports <- map[string]interface{}{
                    "text":   s.Find("span.text").Text(),
                    "author": s.Find("small.author").Text(),
                }
            })
        },
        Exporters: []export.Exporter{&export.JSON{}},
    }).Start()
    

    Custom Requests - Passing Metadata To Callbacks

    You can create custom requests with client.NewRequest

    Use that request on geziyor.Do(request, callback)

    geziyor.NewGeziyor(&geziyor.Options{
        StartRequestsFunc: func(g *geziyor.Geziyor) {
            req, _ := client.NewRequest("GET", "https://httpbin.org/anything", nil)
            req.Meta["key"] = "value"
            g.Do(req, g.Opt.ParseFunc)
        },
        ParseFunc: func(g *geziyor.Geziyor, r *client.Response) {
            fmt.Println("This is our data from request: ", r.Request.Meta["key"])
        },
    }).Start()
    

    Proxy - Use proxy per request

    If you want to use proxy for your requests, and you have 1 proxy, you can just set these env values: HTTP_PROXY HTTPS_PROXY And geziyor will use those proxies.

    Also, you can use in-order proxy per request by setting ProxyFunc option to client.RoundRobinProxy Or any custom proxy selection function that you want. See client/proxy.go on how to implement that kind of custom proxy selection function.

    Proxies can be HTTP, HTTPS and SOCKS5.

    Note: If you use http scheme for proxy, It'll be used for http requests and not for https requests.

    geziyor.NewGeziyor(&geziyor.Options{
        StartURLs:         []string{"http://httpbin.org/anything"},
        ParseFunc:         parseFunc,
        ProxyFunc:         client.RoundRobinProxy("http://some-http-proxy.com", "https://some-https-proxy.com", "socks5://some-socks5-proxy.com"),
    }).Start()
    

    Benchmark

    8748 request per seconds on Macbook Pro 15" 2016

    See tests for this benchmark function:

    >> go test -run none -bench Requests -benchtime 10s
    goos: darwin
    goarch: amd64
    pkg: github.com/geziyor/geziyor
    BenchmarkRequests-8   	  200000	    108710 ns/op
    PASS
    ok  	github.com/geziyor/geziyor	22.861s