创建爬虫程序,爬取百度wow贴吧指定页面全部内容,保存到本地文件,使用协程和管道实现多任务并发爬虫。
源代码
package main
import (
"fmt"
"io"
"net/http"
"os"
"strconv"
)
func main() {
var start, end int
fmt.Println("请输入起始页(>=1):")
fmt.Scan(&start)
fmt.Println("请输入终止页(>=起始页):")
fmt.Scan(&end)
DoWork(start, end)
}
func DoWork(start, end int) {
fmt.Printf("正在爬取 %d 到 %d \n", start, end)
page := make(chan int)
//使用并发爬取,为防止主线程已结束但还没有爬取完成,这里使用管道阻塞
for i := start; i <= end; i++ {
go SpiderPage(i, page)
}
for i := start; i <= end; i++ {
fmt.Printf("第%d个页面爬取完成\n", <-page) //管道在这里阻塞,当一个任务爬完会往管道写数据
}
}
//爬取网页
func SpiderPage(i int, page chan<- int) {
url := "https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=" + strconv.Itoa((i-1)*50)
url1 := "https://www.pengfu.com/index_2.html"
fmt.Printf("正在爬第 %d 页网页:%s \n", i, url)
//爬,把页面所有内容全部爬下来
result, err1 := HttpGet(url1)
if err1 != nil {
fmt.Println("HttpGet err = ", err1)
return
}
//把内容写入文件
fimeName := strconv.Itoa(i) + ".html"
file, err4 := os.Create(fimeName)
if err4 != nil {
fmt.Println("os.Create err4 = ", err4)
return
}
file.WriteString(result)
file.Close()
page <- i //当一个任务爬完往管道写数据
}
//爬取网页内容
func HttpGet(url string) (result string, err error) {
resp, err2 := http.Get(url)
if err2 != nil {
err = err2
return
}
defer resp.Body.Close()
//读取网页body内容
buf := make([]byte, 4*1024)
for {
n, err3 := resp.Body.Read(buf)
if n == 0 {
//读取结束,或出问题
if err3 == io.EOF {
break
}
fmt.Println("resp.Body.Read err3 = ", err3)
break
}
result += string(buf[:n])
}
return
}
打印输出
//打印,爬取30个页面
/*
请输入起始页(>=1):
1
请输入终止页(>=起始页):
30
正在爬取 1 到 30
正在爬第 1 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=0
正在爬第 13 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=600
正在爬第 27 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1300
正在爬第 3 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=100
正在爬第 12 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=550
正在爬第 10 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=450
正在爬第 11 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=500
正在爬第 6 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=250
正在爬第 5 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=200
正在爬第 9 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=400
正在爬第 15 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=700
正在爬第 7 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=300
正在爬第 8 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=350
正在爬第 17 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=800
正在爬第 16 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=750
正在爬第 18 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=850
正在爬第 14 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=650
正在爬第 4 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=150
正在爬第 20 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=950
正在爬第 19 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=900
正在爬第 21 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1000
正在爬第 22 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1050
正在爬第 23 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1100
正在爬第 24 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1150
正在爬第 25 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1200
正在爬第 26 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1250
正在爬第 30 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1450
正在爬第 28 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1350
正在爬第 29 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=1400
正在爬第 2 页网页:https://tieba.baidu.com/f?kw=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&ie=utf-8&pn=50
第8个页面爬取完成
第19个页面爬取完成
第28个页面爬取完成
第7个页面爬取完成
第10个页面爬取完成
第13个页面爬取完成
第29个页面爬取完成
第2个页面爬取完成
第24个页面爬取完成
第21个页面爬取完成
第22个页面爬取完成
第4个页面爬取完成
第17个页面爬取完成
第20个页面爬取完成
第23个页面爬取完成
第6个页面爬取完成
第3个页面爬取完成
第15个页面爬取完成
第1个页面爬取完成
第16个页面爬取完成
第12个页面爬取完成
第5个页面爬取完成
第18个页面爬取完成
第25个页面爬取完成
第30个页面爬取完成
第26个页面爬取完成
第11个页面爬取完成
第9个页面爬取完成
第14个页面爬取完成
第27个页面爬取完成
*/