爬取百度贴吧的网页

非并发版

package main

import (
"fmt"
"io"
"net/http"
"os"
"strconv"
) func HttpGet(url string) (result string, err error) {
// var result string
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, end int) {
fmt.Printf("正在爬取第%d到第%d页", start, end)
//爬取每一个网页
for i := start; i <= end; i++ {
url := "https://tieba.baidu.com/f?kw=vue&ie=utf-8&pn=" + strconv.Itoa((i-1)*50)
result, err := HttpGet(url)
if err != nil {
fmt.Println("httpGet err", err)
continue
}
// fmt.Println("result", result)
f, err := os.Create("第" + strconv.Itoa(i) + "页" + ".html")
if err != nil {
fmt.Println("HttpGet err", err)
continue
}
f.WriteString(result)
f.Close()
}
} func main() {
var start, end int
fmt.Print("请输入起始页。。。")
fmt.Scan(&start)
fmt.Print("请输入终止页。。。")
fmt.Scan(&end) working(start, end)
}

并发版

这个只是在上面的基础上加了管道和开了协程

package main

import (
"fmt"
"io"
"net/http"
"os"
"strconv"
) func HttpGet(url string) (result string, err error) {
// var result string
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("读取网页完成\n")
break
}
if err2 != nil && err2 != io.EOF {
err = err2
return
}
result += string(buf[:n])
}
return
} func SpiderPage(index int, page chan int) {
fmt.Printf("正在爬取第%d到页\n", index)
//爬取每一个网页
// for i := start; i <= end; i++ {
url := "https://tieba.baidu.com/f?kw=vue&ie=utf-8&pn=" + strconv.Itoa((index-1)*50)
result, err := HttpGet(url)
if err != nil {
fmt.Println("httpGet err", err)
return
}
// fmt.Println("result", result)
f, err := os.Create("第" + strconv.Itoa(index) + "页" + ".html")
if err != nil {
fmt.Println("HttpGet err", err)
return
}
f.WriteString(result)
f.Close()
// } page <- index
} func working2(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 main() {
var start, end int
fmt.Print("请输入起始页。。。")
fmt.Scan(&start)
fmt.Print("请输入终止页。。。")
fmt.Scan(&end) working2(start, end)
}

最新文章

  1. QQ,微信第三方登陆
  2. linux 查找文件与进程常用命令
  3. java实现多线程断点续传,上传下载
  4. springmvc的系统学习之配置方式
  5. Show username instead of &quot;System Account&quot; in SharePoint 2010
  6. Java同步
  7. t
  8. UIView层次管理bringSubviewToFront,sendSubviewToBack
  9. Android读写JSON格式的数据之JsonWriter和JsonReader
  10. MyEclipse2014不支持jre1.8吗
  11. 杭州电 1052 Tian Ji -- The Horse Racing(贪婪)
  12. 好用的JS压缩工具—JSCompress
  13. asp.net web api实现图片点击式图片验证码
  14. MySQL主从复制的配置
  15. Win Form不能响应键盘事件
  16. Mobx使用详解
  17. win10企业版永久激活方法
  18. 一个box四周边框阴影
  19. db2报错 Operation not allowed for reason
  20. SOA总结(脑图图片)

热门文章

  1. Java连载57-equals重写、finalize方法、hashCode方法​
  2. 【一起刷LeetCode】在未排序的数组中找到第 k 个最大的元素
  3. 第11章 UDP:用户数据报协-----读书笔记
  4. Java 后台请求第三方系统接口详解
  5. JavaScript-三种弹窗方式
  6. 操作系统篇之Linux命令操作和redis安装以及基本使用
  7. 【Gradle】Android Gradle 多项目构建
  8. 使用MailKit发送带有内嵌图片的邮件且图片不显示成附件
  9. ListenAndServe源码剖析
  10. 此 iCloud 帐户已经存在。