使用 net/http 实现并发爬取多个 url 标题
1. net/http 包相关方法
1.1 http.NewRequestWithContext
- 这个方法用于创建一个新的 HTTP 请求。
- 它接受一个
context.Context
对象,可以用来设置请求的超时、取消等操作。 - 第一个参数是 HTTP 方法,这里是 “GET”。
- 第二个参数是要请求的 URL。
- 第三个参数是请求体,这里传入
nil
表示没有请求体。 - 返回一个
*http.Request
对象和错误对象。
1.2 Request
结构体类型
1.3 http.DefaultClient.Do
http.DefaultClient
是一个全局的*http.Client
对象,它提供了默认的 HTTP 客户端实现。Do
方法用于发送 HTTP 请求并返回响应。- 它接受一个
*http.Request
对象作为参数,表示要发送的请求。 - 返回一个
*http.Response
对象和一个错误对象。
1.4 Response
结构体类型
1.5 http.Response
http.Response
结构表示 HTTP 响应。- 它包含响应状态码、响应头和响应体等信息。
- 在代码中,我们使用
resp.StatusCode
来检查响应的状态码是否为200,以确定请求是否成功。
1.6 http.Response.Body
Body
字段是一个io.ReadCloser
接口,代表响应体。- 在读取完响应体后,我们应该关闭响应体以释放资源。通常使用
defer
关键字来确保在函数退出时关闭响应体。
2. golang.org/x/net/html
包相关方法
2.1 html.Parse
func Parse(r io.Reader) (*Node, error)
- 此函数接受一个实现了
io.Reader
接口的对象作为参数,通常是一个http.Response.Body
或文件等。 - 返回一个
*html.Node
对象和一个error
,表示解析的根节点以及可能发生的错误。
2.2 html.Render
func Render(w io.Writer, n *Node) error
- 此函数接受一个实现了
io.Writer
接口的对象以及一个*html.Node
对象作为参数,将HTML节点 n 以HTML格式写入 w。 - 返回一个
error
,表示可能发生的写入错误。
2.3 html.ParseFragment
func ParseFragment(r io.Reader, context *Node) ([]*Node, error)
- 此函数接受一个实现了
io.Reader
接口的对象以及一个上下文节点*html.Node
对象作为参数。 - 返回解析的HTML片段中的节点切片和一个
error
。
2.4 html.EscapeString
func EscapeString(s string) string
- 此函数接受一个HTML字符串作为参数,返回其在HTML中的转义形式。
2.5 html.UnescapeString
func UnescapeString(s string) string
- 此函数接受一个转义过的HTML字符串作为参数,返回其原始形式。
2.6 html.Node
- HTML文档中的节点表示。
- 每个节点都有一个类型、一系列属性和子节点。
- 可以通过
Type
字段来判断节点的类型,如ElementNode
、TextNode
等。 - 可以通过
Data
字段获取节点的数据,如元素节点的标签名或文本节点的内容。 - 可以通过
Attr
字段获取节点的属性。
3. 具体实现代码
使用 net/http 实现并发爬取多个 url 标题
http://coderedeng.github.io/2024/04/30/Go爬虫 - 手动实现并发爬取多个url标题/