go爬虫
用一个go爬虫demo从go语言特性里的channal和协程学习如何并发工作
效果展示

分析网站
- 点击下一张图片,发现后面多了个2,往后的下一张直接进行了累加,最终网站为:
.../KPBZ/20191205/15898_{n}.html

单线程处理
crawDemo/craw/craw1.go
单线程爬取

并发处理
crawDemo/craw/craw2.go
crawDemo/main.go
并发爬取


调用耗时5s
可以看到快相差13s了,大幅提升下载速度
关键代码

使用正则表达式匹配我们想要的图片格式

1.将爬取到的图片地址塞到chanImageUrls这个chann,分析到页面url参数的规律是+1.html,多少个页面开启多少个协程完成每个页面的图片地址爬取并塞到chanImageUrls和chanTask这两个chan通道里,第一个chan用于任务通道,第二个chan通过另起一个协程记录页面任务完成情况完成则关闭数据管道。

2.开启5个协程从管道里读取链接并下载

学习Websocket
- WebSocket是一种在单个TCP连接上进行全双工通信的协议
- WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据
- 在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
- 需要安装第三方包:

启动

演示
运行后执行html文件测试



一个 WebSocket 服务器的核心功能,包括处理连接、读写数据以及清理操作
这里调用了
wu.Upgrade 函数,将 HTTP 连接升级为 WebSocket 连接。如果出现错误,函数会直接返回,否则会得到一个 WebSocket 连接对象 ws。创建了一个名为
c 的结构体 connection 的实例,结构体中包含了一个带缓冲的通道 sc、WebSocket 连接对象 ws 和一个 Data 结构体的指针 data将连接
c 发送到管道 h.r 中,用于处理该连接。启动一个新的 Goroutine 来执行
c.writer() 函数,该函数用于向 WebSocket 连接写入数据。调用
c.reader() 函数,该函数用于从 WebSocket 连接读取数据。这是一个阻塞操作,会一直监听连接直到关闭。在函数执行结束时执行一些清理操作,包括将用户从用户列表中删除、将用户信息转换为 JSON 格式并发送到管道
h.b 中、将连接 c 发送到管道 h.r 中。这里使用了 defer 关键字,确保在函数执行完毕后会执行这些清理操作。


