准备爬取内涵段子的几则笑话,先查看网址: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. UVALive - 4671 K-neighbor substrings (FFT+哈希)

    题意:海明距离的定义:两个相同长度的字符串中不同的字符数.现给出母串A和模式串B,求A中有多少与B海明距离<=k的不同子串 分析:将字符a视作1,b视作0.则A与B中都是a的位置乘积是1.现将B ...

  2. 粗略介绍Java AQS的实现原理

    本文转自 http://www.importnew.com/24006.html 感谢作者 对我很有帮助 ①引言 AQS是JDK1.5提供的一个基于FIFO等待队列一个同步器的基础框架,java中的同 ...

  3. linux pip 查看版本提示

    After upgrading pip (or pip3, in this case) if the following occurs: $ ~ pip3 -V Traceback (most rec ...

  4. HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查

    转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...

  5. 20145303《Java程序设计》实验三实验报告

    20145303<Java程序设计>实验三实验报告 ssh公钥配置及git安装: eclipse中git配置: 队友链接: http://www.cnblogs.com/5321z/p/5 ...

  6. LeetCode (262):Nim Game

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  7. Python遍历字典dict的几种方法

    #!/usr/bin/python dict={"a":"apple","b":"banana","o&quo ...

  8. redis:Invalid input of type: 'bool' type. Convert to a byte,string or number first

    分析:出现此错误的原因是redis版本过高导致的,因此降低redis版本即可 解决: pip install -U redis==2.10.6

  9. rhel7配置链路聚合(双网卡热备)

    team方法 1). nmcli connection add type team con-name team0 ifname team0 config '{"runer":{&q ...

  10. idea 配置http代理

    工作的环境是在局域网,想要访问外网都是通过代理来访问外网的,最近自己在写maven项目,需要用的依赖下载不能直接访问外部网络,需要配置代理 1.首先在idea里面配置代理地址 settings-> ...