colite

package module
v0.1.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 10, 2020 License: Apache-2.0 Imports: 23 Imported by: 0

README

Colite

Colly Lite,Colly精简版,一个Golang实现的轻量、快速、易用的爬虫框架。

一、首先声明

版权归 Colly 所有版权归 Colly 所有版权归 Colly 所有

二、为啥要精简

  • 去掉条件检测、环境参数等非常用功能,实现更加轻便、更加快速。
  • 尽量减少依赖(仅依赖goquery包),压缩程序大小。
  • 重写代码也是学习框架的重要方法。^-^

三、精简的功能

1. 过滤域名和网址(colly.go - Collector.AllowedDomains Collector.URLFilters)

Colite聚焦逻辑比较清晰的网站数据抓取,一般需要限制抓取的域名和网址。

2. 最大抓取深度(colly.go - Collector.MaxDepth)

一般通过程序自行控制数据抓取的深度。

3. 缓存响应数据(colly.go - Collector.CacheDir httpBackend.Cache())

如果不允许重复访问同个网址(默认不允许,设置Collector.AllowURLRevisit启用),缓存响应数据作用不大。

4. 检测Robots.txt文件(colly.go - Collector.IgnoreRobotsTxt)

在抓取网站数据的,很少去检测Robots.txt文件吧。

5. 检测响应数据的符编码(colly.go - Collector.DetectCharset)

可以通过Request.ResponseCharacterEncoding来指定字符编码,去掉自动检查可以减少依赖

6. 发送GET请求之前先发送HEAD请求验证(colly.go - Collector.CheckHead)

一般也不会用到该功能。

7. 从环境变量设置抓取参数(colly.go - envMap)

可以自行通过配置程序来设置抓取的参数。

8. 通过函数设置程序参数(colly.go - CollectorOption)

Collector的参数很多是公开属性,可以直接设置属性进行配置。

9. Google App Engine模式(colly.go - Collector.Appengine())

在国内Google App Engine基本上用不了。

10. glob域名匹配规则(http_backend.go - LimitRule.DomainGlob)

程序中保留了正则表达式的域名匹配规则,去除glob模式可以减少依赖。

11. HTTPTrace(http_trace.go)

HTTPTrace主要用于分析网络请求性能,一般很少用到该功能。

12. 通过Content-Disposition生成安全文件名(response.go)

主要用于下载文件时防止出现乱码文件名,一般很少用到该功能。

13. 解析XML文档(xmlelement.go)

网站的数据大部分是HTML格式,很少用到XML解析功能。

14. 通过结构标签解析HTML文档生成结构(unmarshal.go)

解析结构标签需要使用反射功能,可能影响速度,而且抓取网站数据需要多次清洗数据,很难通过标签直接生成对应结构。

四、使用方法

1. 安装
go get -u gitee.com/i2worker/colite
2. 示例
func main() {
  // 生成Collector
  c := colite.NewCollector()

  // 查找并访问所有链接
  c.OnHTML("a[href]", func(e *colite.HTMLElement) {
    e.Request.Visit(e.Attr("href"))
  })

  // 打印访问的网站
  c.OnRequest(func(r *colite.Request) {
    fmt.Println("Visiting", r.URL)
  })

  // 开始抓取数据
  c.Visit("https://www.baidu.com")
}

详细文档及示例可阅读Colly官方文档

五、程序框架

1. Colite主要类图

Colite主要类图

2. Colite主要流程图

Colite主要流程

Documentation

Index

Constants

View Source
const ProxyURLKey key = iota

ProxyURLKey 代理地址上下文键

Variables

View Source
var (
	// ErrMissingURL 网址为空的错误
	ErrMissingURL = errors.New("Missing URL")

	// ErrAlreadyVisited 访问已经访问过网址的错误
	ErrAlreadyVisited = errors.New("URL already visited")

	// ErrNoPattern 没有定义匹配域名规则的错误
	ErrNoPattern = errors.New("No pattern defined in LimitRule")

	// ErrAbortedAfterHeaders OnResponseHeaders中止传输时返回的错误
	ErrAbortedAfterHeaders = errors.New("Aborted after receiving response headers")

	// ErrNoCookieJar 没有启用Cookie的错误
	ErrNoCookieJar = errors.New("Cookie jar is not available")

	// ErrEmptyProxyURL 代理地址列表为空的错误
	ErrEmptyProxyURL = errors.New("Proxy URL list is empty")

	// ErrQueueFull 请求队列已满的错误
	ErrQueueFull = errors.New("Queue MaxSize reached")
)

Functions

This section is empty.

Types

type Collector

type Collector struct {
	// ID Collector的标识符
	ID uint32

	// UserAgent HTTP请求头User-Agent
	UserAgent string

	// MaxBodySize HTTP响应主体接收最大值,0为无限制,默认为10MB
	MaxBodySize int

	// Async 是否异步抓取,需用c.Wait()等待所有HTTP请求完成
	Async bool

	// AllowURLRevisit 是否允许重复抓取同个网址
	AllowURLRevisit bool

	// ParseHTTPErrorResponse 是否处理非2xx的HTTP响应错误
	ParseHTTPErrorResponse bool
	// contains filtered or unexported fields
}

Collector 数据抓取控制类

func NewCollector

func NewCollector() *Collector

NewCollector 用默认配置创建Collector实例

func (*Collector) Clone

func (c *Collector) Clone() *Collector

Clone 复制Collector(共享HTTP、Cache、Cookie)

func (*Collector) Cookies

func (c *Collector) Cookies(URL string) []*http.Cookie

Cookies 返回指定URL的Cookie

func (*Collector) DisableCookies

func (c *Collector) DisableCookies()

DisableCookies 禁用Cookie

func (*Collector) HasVisited

func (c *Collector) HasVisited(URL string) (bool, error)

HasVisited 检查指定网址是否已经访问

func (*Collector) Head

func (c *Collector) Head(URL string) error

Head 发送HEAD请求

func (*Collector) Init

func (c *Collector) Init()

Init 初始化Collector

func (*Collector) Limit

func (c *Collector) Limit(rule *LimitRule) error

Limit 增加限制规则

func (*Collector) Limits

func (c *Collector) Limits(rules []*LimitRule) error

Limits 增加限制规则组

func (*Collector) OnError

func (c *Collector) OnError(f ErrorCallback)

OnError 注册出错处理回调函数

func (*Collector) OnHTML

func (c *Collector) OnHTML(goquerySelector string, f HTMLCallback)

OnHTML 注册HTML处理回调函数

func (*Collector) OnHTMLDetach

func (c *Collector) OnHTMLDetach(goquerySelector string)

OnHTMLDetach 注销HTML处理回调函数

func (*Collector) OnRequest

func (c *Collector) OnRequest(f RequestCallback)

OnRequest 注册请求处理回调函数

func (*Collector) OnResponse

func (c *Collector) OnResponse(f ResponseCallback)

OnResponse 注册响应处理回调函数

func (*Collector) OnResponseHeaders

func (c *Collector) OnResponseHeaders(f ResponseHeadersCallback)

OnResponseHeaders 注册响应头处理回调函数(响应头已接收但响应主体没有读取时调用)

func (*Collector) OnScraped

func (c *Collector) OnScraped(f ScrapedCallback)

OnScraped 注册抓取完成处理回调函数

func (*Collector) Post

func (c *Collector) Post(URL string, requestData map[string]string) error

Post 发送POST请求(包含提交数据)

func (*Collector) PostMultipart

func (c *Collector) PostMultipart(URL string, requestData map[string][]byte) error

PostMultipart 发送多部分实体POST请求(包含多部分实体数据)

func (*Collector) PostRaw

func (c *Collector) PostRaw(URL string, requestData []byte) error

PostRaw 发送POST请求(包含实体数据)

func (*Collector) Request

func (c *Collector) Request(method, URL string, requestData io.Reader, ctx *Context, hdr http.Header) error

Request 发送指定方法的请求

func (*Collector) SetClient

func (c *Collector) SetClient(client *http.Client)

SetClient 设置http.Client

func (*Collector) SetCookieJar

func (c *Collector) SetCookieJar(j http.CookieJar)

SetCookieJar 设置Cookie

func (*Collector) SetCookies

func (c *Collector) SetCookies(URL string, cookies []*http.Cookie) error

SetCookies 设置指定URL的Cookie

func (*Collector) SetDebugger

func (c *Collector) SetDebugger(d debug.Debugger)

SetDebugger 设置Collector的调试器

func (*Collector) SetProxy

func (c *Collector) SetProxy(proxyURL string) error

SetProxy 设置代理地址

func (*Collector) SetProxyFunc

func (c *Collector) SetProxyFunc(p ProxyFunc)

SetProxyFunc 设置代理处理函数

func (*Collector) SetRedirectHandler

func (c *Collector) SetRedirectHandler(f func(req *http.Request, via []*http.Request) error)

SetRedirectHandler 设置重定向处理器

func (*Collector) SetRequestTimeout

func (c *Collector) SetRequestTimeout(timeout time.Duration)

SetRequestTimeout 设置请求超时时间(默认10秒)

func (*Collector) SetStorage

func (c *Collector) SetStorage(s storage.Storage) error

SetStorage 设置Collector的存储器

func (*Collector) String

func (c *Collector) String() string

String 将Collector转为字符串表示

func (*Collector) UnmarshalRequest

func (c *Collector) UnmarshalRequest(r []byte) (*Request, error)

UnmarshalRequest 从序列化数据中创建请求

func (*Collector) Visit

func (c *Collector) Visit(URL string) error

Visit 发送GET请求(不保留上下文环境)

func (*Collector) Wait

func (c *Collector) Wait()

Wait 异步执行时等待所有请求完成

func (*Collector) WithTransport

func (c *Collector) WithTransport(transport http.RoundTripper)

WithTransport 设置http.RoundTripper

type Context

type Context struct {
	// contains filtered or unexported fields
}

Context 上下文环境类(用于回调函数中传递数据)

func NewContext

func NewContext() *Context

NewContext 创建上下文环境实例

func (*Context) ForEach

func (c *Context) ForEach(fn func(k string, v interface{}) interface{}) []interface{}

ForEach 对保存在上下文环境中的所有键-值执行指定函数

func (*Context) Get

func (c *Context) Get(key string) string

Get 从上下文环境中获取指定键的值(如不存在返回空字符串)

func (*Context) GetAny

func (c *Context) GetAny(key string) interface{}

GetAny 从上下文环境中获取指定键的值(如不存在返回nil)

func (*Context) MarshalBinary

func (c *Context) MarshalBinary() (_ []byte, _ error)

MarshalBinary 编码上下文环境

func (*Context) Put

func (c *Context) Put(key string, value interface{})

Put 保存键-值到上下文环境中

func (*Context) UnmarshalBinary

func (c *Context) UnmarshalBinary(_ []byte) error

UnmarshalBinary 解码上下文环境

type ErrorCallback

type ErrorCallback func(*Response, error)

ErrorCallback OnError回调函数

type HTMLCallback

type HTMLCallback func(*HTMLElement)

HTMLCallback OnHTML回调函数

type HTMLElement

type HTMLElement struct {
	// Index 节点索引
	Index int

	// Name 节点名称
	Name string

	// Text 节点文本内容
	Text string

	// DOM 当前匹配节点
	DOM *goquery.Selection

	// Request 当前请求实例
	Request *Request

	// Response 当前响应实例
	Response *Response
	// contains filtered or unexported fields
}

HTMLElement HTML节点类

func NewHTMLElementFromSelectionNode

func NewHTMLElementFromSelectionNode(resp *Response, s *goquery.Selection, n *html.Node, idx int) *HTMLElement

NewHTMLElementFromSelectionNode 从goquery.Selection节点创建HTMLElement实例

func (*HTMLElement) Attr

func (h *HTMLElement) Attr(k string) string

Attr 获取当前节点指定属性的值(如不存在返回空字符串)

func (*HTMLElement) ChildAttr

func (h *HTMLElement) ChildAttr(goquerySelector, attrName string) string

ChildAttr 获取子节点中第一个匹配标签指定属性的值

func (*HTMLElement) ChildAttrs

func (h *HTMLElement) ChildAttrs(goquerySelector, attrName string) []string

ChildAttrs 获取子节点中所有匹配标签指定属性的值(字符串数组)

func (*HTMLElement) ChildText

func (h *HTMLElement) ChildText(goquerySelector string) string

ChildText 获取子节点中所有匹配标签的文本内容(组合在一起)

func (*HTMLElement) ChildTexts

func (h *HTMLElement) ChildTexts(goquerySelector string) []string

ChildTexts 获取子节点中所有匹配标签的文本内容(字符串数组)

func (*HTMLElement) ForEach

func (h *HTMLElement) ForEach(goquerySelector string, callback func(int, *HTMLElement))

ForEach 每个匹配标签执行指定回调函数

func (*HTMLElement) ForEachWithBreak

func (h *HTMLElement) ForEachWithBreak(goquerySelector string, callback func(int, *HTMLElement) bool)

ForEachWithBreak 每个匹配标签执行指定回调函数(可终止)

type LimitRule

type LimitRule struct {
	// DomainRegexp 匹配域名的正则表达式
	DomainRegexp string

	// Delay 请求之间等待的时间
	Delay time.Duration

	// RandomDelay 请求之间额外随机等待的时间
	RandomDelay time.Duration

	// Parallelism 允许的最大并发请求数
	Parallelism int
	// contains filtered or unexported fields
}

LimitRule 请求限制规则

func (*LimitRule) Init

func (r *LimitRule) Init() error

Init 初始化LimitRule

func (*LimitRule) Match

func (r *LimitRule) Match(domain string) bool

Match 检测指定域名是否符合限制规则

type ProxyFunc

type ProxyFunc func(*http.Request) (*url.URL, error)

ProxyFunc 代理设置函数

type Request

type Request struct {
	// ID 请求标识符
	ID uint32

	// URL 请求网址
	URL *url.URL

	// Method 请求方法
	Method string

	// Headers 请求头
	Headers *http.Header

	// Body 请求主体(POST/PUT)
	Body io.Reader

	// Ctx 上下文环境
	Ctx *Context

	// ResponseCharacterEncoding 响应体字符编码(为空自动检测)
	ResponseCharacterEncoding string

	// ProxyURL 代理地址
	ProxyURL string
	// contains filtered or unexported fields
}

Request 请求类

func (*Request) Abort

func (r *Request) Abort()

Abort 取消请求

func (*Request) AbsoluteURL

func (r *Request) AbsoluteURL(u string) string

AbsoluteURL 解析为绝对网址(不包含Fragment部分)

func (*Request) Do

func (r *Request) Do() error

Do 执行请求

func (*Request) HasVisited

func (r *Request) HasVisited(URL string) (bool, error)

HasVisited 检查指定网址是否已经访问

func (*Request) Marshal

func (r *Request) Marshal() ([]byte, error)

Marshal 将请求序列化为JSON

func (*Request) New

func (r *Request) New(URL, method string, body io.Reader) (*Request, error)

New 在原有请求基础上创建新请求实例(共享Collector、Context)

func (*Request) Post

func (r *Request) Post(URL string, requestData map[string]string) error

Post 发送POST请求(包含提交数据,保留上下文环境)

func (*Request) PostMultipart

func (r *Request) PostMultipart(URL string, requestData map[string][]byte) error

PostMultipart 发送多部分实体POST请求(包含多部分实体数据,保留上下文环境)

func (*Request) PostRaw

func (r *Request) PostRaw(URL string, requestData []byte) error

PostRaw 发送POST请求(包含实体数据,保留上下文环境)

func (*Request) Retry

func (r *Request) Retry() error

Retry 重新提交请求

func (*Request) Visit

func (r *Request) Visit(URL string) error

Visit 发送GET请求(保留上下文环境)

type RequestCallback

type RequestCallback func(*Request)

RequestCallback OnRequest回调函数

type Response

type Response struct {
	// StatusCode 响应状态码
	StatusCode int

	// Headers 响应头
	Headers *http.Header

	// Body 响应主体
	Body []byte

	// Request 当前请求实例
	Request *Request

	// Ctx 上下文环境
	Ctx *Context
}

Response 响应类

type ResponseCallback

type ResponseCallback func(*Response)

ResponseCallback OnResponse回调函数

type ResponseHeadersCallback

type ResponseHeadersCallback func(*Response)

ResponseHeadersCallback OnResponseHeaders回调函数

type ScrapedCallback

type ScrapedCallback func(*Response)

ScrapedCallback OnScraped回调函数

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL