1、爬百度贴吧并发版

示例:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "strconv"
  8. )
  9.  
  10. //爬取网页内容
  11. func HttpGet(url string) (result string, err error) {
  12. resp, err1 := http.Get(url)
  13. if err1 != nil {
  14. err = err1
  15. return
  16. }
  17.  
  18. defer resp.Body.Close()
  19.  
  20. //读取网页body内容
  21. buf := make([]byte, 1024*4)
  22. for {
  23. n, _ := resp.Body.Read(buf)
  24. if n == 0 { //读取结束,或者,出问题
  25. //fmt.Println("resp.Body.Read err = ", err)
  26. break
  27. }
  28.  
  29. result += string(buf[:n])
  30. }
  31.  
  32. return
  33. }
  34.  
  35. //爬取一个网页
  36. func SpiderPage(i int, page chan int) {
  37. url := "http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&ie=utf-8&pn=" + strconv.Itoa((i-1)*50)
  38. fmt.Printf("正在爬第%d页网页: %s\n", i, url)
  39.  
  40. //2) 爬 (将所有的网站的内容全部爬下来)
  41. result, err := HttpGet(url)
  42. if err != nil {
  43. fmt.Println("HttpGet err = ", err)
  44. return
  45. }
  46.  
  47. //把内容写入到文件
  48. fileName := strconv.Itoa(i) + ".html"
  49. f, err1 := os.Create(fileName)
  50. if err1 != nil {
  51. fmt.Println("os.Create err1 = ", err1)
  52. return
  53. }
  54.  
  55. f.WriteString(result) //写内容
  56.  
  57. f.Close() //关闭文件
  58.  
  59. page <- i
  60. }
  61.  
  62. func DoWork(start, end int) {
  63. fmt.Printf("正在爬取 %d 到 %d 的页面\n", start, end)
  64.  
  65. page := make(chan int)
  66. //明确目标 (要知道你准备在哪个范围或者网站去搜索)
  67. for i := start; i <= end; i++ {
  68. go SpiderPage(i, page)
  69. }
  70.  
  71. for i := start; i <= end; i++ {
  72. fmt.Printf("%第%d个页面爬取完成\n", <-page)
  73. }
  74. }
  75.  
  76. func main() {
  77. var start, end int
  78. fmt.Printf("请输入起始页( >= 1) :")
  79. fmt.Scan(&start)
  80. fmt.Printf("请输入终止页( >= 起始页) :")
  81. fmt.Scan(&end)
  82.  
  83. DoWork(start, end)
  84. }

执行结果:

  1. D:\GoFiles\src\hello_01>go run get_web.go
  2. 请输入起始页( >= 1) :1
  3. 请输入终止页( >= 起始页) :10
  4. 正在爬取 1 10 的页面
  5. 正在爬第3页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  6. F&ie=utf-8&pn=100
  7. 正在爬第10页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%
  8. 9F&ie=utf-8&pn=450
  9. 正在爬第6页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  10. F&ie=utf-8&pn=250
  11. 正在爬第7页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  12. F&ie=utf-8&pn=300
  13. 正在爬第8页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  14. F&ie=utf-8&pn=350
  15. 正在爬第9页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  16. F&ie=utf-8&pn=400
  17. 正在爬第2页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  18. F&ie=utf-8&pn=50
  19. 正在爬第4页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  20. F&ie=utf-8&pn=150
  21. 正在爬第5页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  22. F&ie=utf-8&pn=200
  23. 正在爬第1页网页: http://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9
  24. F&ie=utf-8&pn=0
  25. %!第(int=4)%!d(MISSING)个页面爬取完成
  26. %!第(int=9)%!d(MISSING)个页面爬取完成
  27. %!第(int=3)%!d(MISSING)个页面爬取完成
  28. %!第(int=8)%!d(MISSING)个页面爬取完成
  29. %!第(int=10)%!d(MISSING)个页面爬取完成
  30. %!第(int=1)%!d(MISSING)个页面爬取完成
  31. %!第(int=5)%!d(MISSING)个页面爬取完成
  32. %!第(int=2)%!d(MISSING)个页面爬取完成
  33. %!第(int=7)%!d(MISSING)个页面爬取完成
  34. %!第(int=6)%!d(MISSING)个页面爬取完成

  

Go语言之进阶篇爬百度贴吧并发版的更多相关文章

  1. go语音之进阶篇爬百度贴吧单线程版本

    一.爬什么? 1.明确目标 : 知道你准备在那个范围或者网站去搜索 2.爬: 将所有的网站的内容全部爬下来 3.取:去掉对我们没用处的数据 4.处理数据:按照我们想要的方式存储或使用 二.百度贴吧小爬 ...

  2. Go语言之进阶篇爬捧腹网

    1.爬捧腹网 网页规律: https://www.pengfu.com/xiaohua_1.html   下一页 +1 https://www.pengfu.com/xiaohua_2.html 主页 ...

  3. go语言之进阶篇接口转换

    1.go语音之进阶篇 示例: package main import "fmt" type Humaner interface { //子集 sayhi() } type Pers ...

  4. go语言之进阶篇通过select实现斐波那契数列

    一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选 ...

  5. go语言之进阶篇创建goroutine协程

    1.goroutine是什么 goroutine是Go并行设计的核心.goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现 ...

  6. go语言之进阶篇并行和并发的区别与go语言并发优势

    1.并行和并发的概念 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行. 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在 ...

  7. go语言之进阶篇JSON处理

    一.JSON处理 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaScr ...

  8. go语言之进阶篇正则表达式

    正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具.虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活.按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符 ...

  9. go语言之进阶篇面向对象编程

    1.面向对象编程 对于面向对象编程的支持Go 语言设计得非常简洁而优雅.因为, Go语言并没有沿袭传统面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继 ...

随机推荐

  1. VA插件突然不能使用,彈出“the security key for....”

    昨天打開VS莫名其妙地彈出下面的錯誤框: "the security key for this program currently stored on your system does no ...

  2. 关于操作Access数据库jdk选择问题

    关于操作Access数据库,使用jdk64位无法通过ODBC无法获取数据,只能通过jdk32位进行开发.

  3. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) B. Verse Pattern 水题

    B. Verse Pattern 题目连接: http://codeforces.com/contest/722/problem/B Description You are given a text ...

  4. 回顾JavsScript对象的克隆

    JS对象的数据类型分为两大类:原始类型(string, boolean, number,undefined, function)和 对象类型(array, object, null). 1.浅度克隆 ...

  5. CentOS下使用LVM进行分区(转)

    说明:为什么抄,因为这篇文章图文并茂,所有测试都在CentOS 6和7测试过. 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统 ...

  6. YAML文件中在单一文件中区分多个文件

    1.在单一文件中,可用连续三个连字号(---)区分多个文件. 2.另外,还有选择性的连续三个点号( ... )用来表示文件结尾. 题外:YAML其实语法很多也很灵活,但是针对Spring支持的语法其实 ...

  7. [Ubuntu] 编译安装 PHP 依赖库

    编译环境 sudo apt-get -y install build-essential xml sudo apt-get -y install libxml2-dev pcre sudo apt-g ...

  8. 【Go命令教程】5. go clean

    执行 go clean 命令会删除掉执行其它命令时产生的一些文件和目录,包括: 在使用 go build 命令时在当前代码包下生成的与包名同名或者与Go源码文件同名的可执行文件.在Windows下,则 ...

  9. kernel logo到开机动画之间闪现黑屏(android 5.X)

    在BootAnimation開始画图之前,会先做一次clear screen的动作,避免出现前面的图干扰到BootAnimation的显示. 通过check main_log先确认播放开机动画是哪个f ...

  10. [Winform]通过钩子监控键盘操作和鼠标移动

    摘要 有这样一个需求,在程序隐藏之后,需要监控当前电脑是否有操作,如果1分钟内,无操作,则弹出视频,循环播放. 解决办法 从网上找的一个解决办法,可以通过钩子的方式实现,这里记录一下. /// < ...