项目总览:
1.开发语言:GO语言
2.IDE:Goland
3.开发用时:一个小时
4.源码已上传到我的GitHub,链接:https://github.com/2394799692/Crawler-Baidu 或点此跳转
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692
一、项目开发日志
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写入文件:writestring(result)。使用f.close()关闭
二、爬虫简介
1.概念:
访问web服务器,获取指定数据信息的一段程序
2.横向爬取:
在爬取的网站页面中,以“页”为单位,找寻该网站分页器规律。一页一页的爬取网站数据信息。
3.工作流程:
1.明确URL(请求的地址,明确爬什么)
2.发送请求,获取响应数据
3.保存响应数据,提取有用信息
4.处理数据(存储,使用)
三、代码展示
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
}
//累加每一次循环读到的buf数据,存入result;一次性返回。
result += string(buf[:n])
}
return
}
//爬取页面操作
func working(start, end int) {
fmt.Printf("正在爬取第%d页到%d页...\n", start, end)
//循环一次爬取一页
for i := start; i <= end; i++ {
url := "这个地方是你要爬取网页的url" + strconv.Itoa(i)
result, err := HttpGet(url)
if err != nil {
fmt.Println("httpget err:", err)
continue //需要读取多个页,一个页面出错不用return,再读下一页就行了
}
//fmt.Println("result=", result)
//将读到的整网页数据,保存成一个文件
f, err := os.Create("第" + strconv.Itoa(i) + "页" + ".html")
if err != nil {
fmt.Println("os.Create err:", err)
continue //需要读取多个页,一个页面出错不用return,再读下一页就行了
}
f.WriteString(result)
f.Close() //保存好一个文件,关闭一个文件
}
}
func main() {
//指定爬取起始,终止页
var start, end int
fmt.Println("请输入爬取的起始页(>=1):")
fmt.Scan(&start)
fmt.Println("请输入爬取的终止页(>=strart):")
fmt.Scan(&end)
working(start, end)
}
四、效果展示:
1)启动爬虫程序,输入要爬取的页数:
2)点击确认后,等待网络爬取完成:
3)爬取成功后,其对应页面就存储在我们的文件中了:
4)打开本地存储的爬取后的网页与原网页进行对比