准备爬取内涵段子的几则笑话,先查看网址:http://www.budejie.com/text/

简单分析后发现每页的url呈加1趋势

第一页: http://www.budejie.com/text/1

第二页:http://www.budejie.com/text/2

...

每页的段子:

<a href="/detail-28278217.html"> 内容</a>

<a href="/detail-28270675.html"> 内容</a>

....

所以正则表达式的解释规则是<a href="/detail-\d{8}.html">(?s:(.*?))</a>,第一个分组的内容就是需要的文字。

代码如下:

package main
import (
"fmt"
"regexp"
"strconv"
"net/http"
"log"
"os"
"strings"
) func onespider(n int, ch chan int) {
url := "http://www.budejie.com/text/" + strconv.Itoa(n)
resp, err := http.Get(url)
if err != nil {
log.Fatal("get error")
}
defer resp.Body.Close()
reg, err1 := regexp.Compile(`<a href="/detail-\d{8}.html">(?s:(.*?))</a>`)
if err1 != nil {
log.Fatal("compile error")
}
var respstring string
buf := make([]byte, )
for {
n, _ := resp.Body.Read(buf)
if n == {
break
}
respstring += string(buf[:n])
} cont := reg.FindAllStringSubmatch(respstring, -)
file, _ := os.OpenFile("./爬虫/"+"第"+strconv.Itoa(n)+"页爬虫.txt", os.O_RDWR|os.O_TRUNC|os.O_CREATE, )
defer file.CLose()
var i int
for _, value := range cont {
if len(value[]) < {
continue
}
value[] = strings.Replace(value[], "<br />", "\n", -)
index := strconv.Itoa(i+)
file.Write([]byte("第"+index+"则段:\n"+value[]+"\n\n\n"))
i++
}
ch <- n
}
func Spider(s, e int) {
ch := make(chan int)
for i := s; i <= e; i++ {
go onespider(i, ch)
}
for i := s; i <= e; i++ {
n := <- ch
fmt.Printf("第%d页爬取完毕\n", n)
}
}
func main(){
var start, end int
fmt.Println("输入起始页")
fmt.Scan(&start)
fmt.Println("输入终止页")
fmt.Scan(&end)
Spider(start, end)
}

  

运行截图:

效果截图:

最后我发现第2页之后的段子都是重复的。。。

golang版并发爬虫的更多相关文章

  1. golang实现并发爬虫三(用队列调度器实现)

    欲看此文,必先可先看: golang实现并发爬虫一(单任务版本爬虫功能) gollang实现并发爬虫二(简单调度器) 上文中的用简单的调度器实现了并发爬虫. 并且,也提到了这种并发爬虫的实现可以提高爬 ...

  2. golang实现并发爬虫一(单任务版本爬虫功能)

    目的是写一个golang并发爬虫版本的演化过程. 那么在演化之前,当然是先跑通一下单任务版本的架构. 正如人走路之前是一定要学会爬走一般. 首先看一下单任务版本的爬虫架构,如下: 这是单任务版本爬虫的 ...

  3. golang实现并发爬虫二(简单调度器)

    上篇文章当中实现了单任务版爬虫. 那么这篇文章就大概说下,如何在上一个版本中进行升级改造,使之成为一个多任务版本的爬虫.加快我们爬取的速度. 话不多说,先看图: 其实呢,实现方法就是加了一个sched ...

  4. golang的并发

    Golang的并发涉及二个概念: goroutine channel goroutine由关键字go创建. channel由关键字chan定义 channel的理解稍难点, 最简单地, 你把它当成Un ...

  5. Golang版protobuf编译

    官方网址: https://developers.google.com/protocol-buffers/ (需要FQ) 代码仓库: https://github.com/google/protobu ...

  6. golang的并发不等于并行

    先 看下面一道面试题: func main() { runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} wg.Add(20) for i := 0; i < ...

  7. [Golang] kafka集群搭建和golang版生产者和消费者

    一.kafka集群搭建 至于kafka是什么我都不多做介绍了,网上写的已经非常详尽了. 1. 下载zookeeper  https://zookeeper.apache.org/releases.ht ...

  8. Go语言之进阶篇简单版并发服务器

    1.简单版并发服务器 示例1: package main import ( "fmt" "net" "strings" ) //处理用户请求 ...

  9. swing版网络爬虫-丑牛迷你采集器2.0

    swing版网络爬虫-丑牛迷你采集器2.0 http://www.javacoo.com/code/704.jhtml 整合JEECMS http://bbs.jeecms.com/fabu/3186 ...

随机推荐

  1. radio,checkbox,select,input text获取值,设置哪个默认选中

    11 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title& ...

  2. 运维自动化之salt笔记

    1:saltstack的基本介绍 2:salt的安装 1:服务端1:安装2:配置文件3:运行4:注意事项2:客户端1:安装2:配置文件3:运行4:注意事项 3:salt的使用: 1:基础知识1:tar ...

  3. mysql中explain的用法

    mysql中explain的用法 最近在做性能测试中经常遇到一些数据库的问题,通常使用慢查询日志可以找到执行效果比较差的sql,但是仅仅找到这些sql是不行的,我们需要协助开发人员分析问题所在,这就经 ...

  4. iOS 使用markdown 实现编辑和预览文本

    注意要点: 1.在iOS 可以依赖UIWebview 来实现 2.丰富的UI样式依赖 html 的样式, js 调用插入markdown内容呈现出来 3.实现markdown编辑快捷键:参考githu ...

  5. WPS宏不可用解决方法

    在使用WPS Office过程中,遇见宏不可用,在启用宏的过程中提示获取VBA插件 解决方法: 1.下载VBA插件,下载地址:https://pan.baidu.com/s/1LqBmXw37U0km ...

  6. 使用.NET Core和Vue搭建WebSocket聊天室

    博客地址是:https://qinyuanpei.github.io.  WebSocket是HTML5标准中的一部分,从Socket这个字眼我们就可以知道,这是一种网络通信协议.WebSocket是 ...

  7. Oracle中用sql语句取随机数和整数

    --- 应用round(5.678,3)保留小数 应用floor(5.678)保留整数 应用dbms_random.value(30,50)取得随机数 --- dbms_random包 获得随机小数S ...

  8. 找不到resources下的文件

    今天发现一个很坑的问题,浪费了很长的时间排查问题,特此记录下.目录结构如下图所示: 结果加载文件的时候,一直报错: 找不到resource文件夹下的 conf/mybatis/logDb/ 路径下的文 ...

  9. 访问ashx一般应用程序

    浏览器中的地址栏键入要访问页面的地址:回车(是和服务器软件打交道)----向服务器发送请求(以http协议为基础,服务器按照此协议解释理解接收到的数据),服务器接收到发送的请求,根据请求信息知道当前所 ...

  10. openwrt生成的镜像放在哪里

    答:1.打包好之后是放在build_dir/target-$(cross-compile-toolchan-name)/linux-$(chip-series-name)_$(chip-arch)/t ...