爬取百度贴吧的网页

非并发版

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)
}

go-爬虫-百度贴吧(并发版)的更多相关文章

  1. Go语言之进阶篇爬百度贴吧并发版

    1.爬百度贴吧并发版 示例: package main import ( "fmt" "net/http" "os" "strco ...

  2. go并发版爬虫

    并发版爬虫 代码实现 /crawler/main.go package main import ( "learn/crawler/engine" "learn/crawl ...

  3. 【教程】模拟登陆百度之Java代码版

    [背景] 之前已经写了教程,分析模拟登陆百度的逻辑: [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 然后又去用不同的语言: Python的: [教程]模 ...

  4. 【pyhon】nvshens按目录图片批量下载爬虫1.00(多线程版)

    # nvshens按目录图片批量下载爬虫1.00(多线程版) from bs4 import BeautifulSoup import requests import datetime import ...

  5. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内。以及两点间的测距功能

    权声明:本文为博主原创文章,未经博主允许不得转载. 利用百度API(JavaScript 版)实现在地图上绘制任一多边形,并判断给定经纬度是否在多边形范围内.以及两点间的测距功能. 绘制多边形(蓝色) ...

  6. Go HelloWorld 网络版和并发版

    网络版 package main import ( "net/http" "fmt" ) func main() { http.HandleFunc(" ...

  7. mac百度网盘破解版

    以下资源来源于网络收集分享,如有问题请联系我删除!来源入口,后面链接挂了,可去原网址访问! 还在为Mac百度网盘下载速度慢而烦恼吗?百度云盘又是一个非常实用的分享工具,可支持图片.视频.音乐.文档.种 ...

  8. 百度网盘Mac版如何分享链接?创建百度网盘 for Mac分享链接的方法

    想把自己百度网盘里的数据分享给朋友,该怎么操作呢?有很多朋友使用百度网盘,可以很轻松的自己的文件上传到网盘上,并可跨终端随时随地查看和分享.下面Mac down小编就给大家介绍一下创建百度网盘 for ...

  9. Python爬虫-百度模拟登录(二)

    上一篇-Python爬虫-百度模拟登录(一) 接上一篇的继续 参数 codestring codestring jxG9506c1811b44e2fd0220153643013f7e6b1898075 ...

随机推荐

  1. Elasticsearch索引按月划分以及获取所有索引数据

    项目中数据库根据月份水平划分,由于没有用数据库中间件,没办法一下查询所有订单信息,所有用Elasticsearch做订单检索. Elasticsearch索引和数据库分片同步,也是根据月份来建立索引. ...

  2. robot用例执行常用命令(转)

    执行命令 执行一个用例 robot -t “testcase_name“ data_test.robot 按用例文件执行 robot data_test.robot或者 robot --suite “ ...

  3. .net core 2.1 Swagger 配置

    1.先创建 .net core Web 应用程序,选择API 2.安装 Nuget 包:Swashbuckle.AspNetCore Install-Package Swashbuckle.AspNe ...

  4. .Net Core权限认证基于Cookie的认证&授权.Scheme、Policy扩展

    在身份认证中,如果某个Action需要权限才能访问,最开始的想法就是,哪个Action需要权限才能访问,我们写个特性标注到上面即可,[TypeFilter(typeof(CustomAuthorize ...

  5. DBUtils框架的使用(上)

    昨天做了这么多的铺垫,当然就是为了引出今天的DBUtils框架了,它的实现原理跟我们编写的简易框架是类似的. 话不多说,进入正题. commons-dbutils 是 Apache 组织提供的一个开源 ...

  6. iOS常用算法之单链表查找倒数第n个节点(图解)

    拿到题目, 首先要先了解链表数据结构, 如下图: 常规思路: 利用数组, 遍历整个单链表, 将每个节点装入数组中, 最终拿到数组根据索引(数组长度-1-n)就得到了倒数第n个元素, 这里要注意从数组中 ...

  7. [20191031]完善vim的bccalc插件7.txt

    [20191031]完善vim的bccalc插件7.txt --//增加/ 2^16 %2^16功能,输入\tx,例子:1398145029 = /2^16  %2^16 (type and mode ...

  8. Docker 运行一个Web应用

    使用 docker 构建一个 web 应用程序. 我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用 参数说明: -d:让容器在后台运行. -P:将容器内部使用的网 ...

  9. GetPrivateProfileInt 使用方法

    GetPrivateProfileInt =>从ini文件取得数值 <参数> lpApplicationName String,指定在其中查找条目的小节.注意这个字串是不区分大小写的 ...

  10. go语言设计模式之Concurrency barrier

    barrier.go package barrier import ( "fmt" "io/ioutil" "net/http" " ...