GO爬虫爬取百度贴吧示例
爬虫概念:
访问web服务器,获取指定数据信息的一段程序。
工作流程:
1. 明确目标 Url
2. 发送请求,获取应答数据包。 http.Get(url)
3. 过滤 数据。提取有用信息。
4. 使用、分析得到数据信息。
百度贴吧爬虫实现:
1. 提示用户指定 起始、终止页。 创建working函数
2. 使用 start、end 循环 爬取每一页数据
3. 获取 每一页的 URL —— 下一页 = 前一页 + 50
4. 封装、实现 HttpGet() 函数,爬取一个网页的数据内容,通过 result 返回。
http.Get/ resp.Body.Close/ buf := make(4096)/ for { resp.Body.Read(buf)/ result += string(buf[:n]) return
5. 创建 .html 文件。 使用循环因子 i 命名。
6. 将 result 写入 文件 f.WriteString(result)。 f.close() 不推荐使用 defer 。
package main
import (
"fmt"
"io"
"net/http"
"os"
"strconv"
)
func HttpGet(url string) (result string,err error){
resp,err1 := http.Get(url)
if err1 != nil{
err = err1 //出错时将内部错误传出给调用者
return
}
defer resp.Body.Close()
//循环接收数据
buf := make([]byte,4096)
for{
n,err2 := resp.Body.Read(buf)
if n == 0{
fmt.Println("读取网页完成")
break
}
if err2 != nil && err2 != io.EOF{
err = err2
return
}
result += string(buf[:n])
}
return
}
func working(start int,end int) {
fmt.Printf("正在爬取%d-%d页",start,end)
for i:=start;i < end;i++{
url := "https://tieba.baidu.com/f?kw=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&ie=utf-8&cid=&tab=corearea&pn="+strconv.Itoa((i-1)*50)
result,err := HttpGet(url)
if err != nil{
fmt.Printf("页码%d出错跳过",i)
continue
}
//fmt.Println("result=",result[:10])
//写入文件
fp,err := os.Create("第"+strconv.Itoa(i)+"页.html")
if err != nil{
fmt.Println("创建失败",err)
continue
}
fp.WriteString(result)
fp.Close() //每次都关闭
}
}
func main() {
var start, end int
fmt.Print("请输入要爬取的起始页码:")
fmt.Scan(&start)
fmt.Print("请输入要爬取的结束页码:")
fmt.Scan(&end)
working(start, end)
}