go爬虫

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

效果展示

notion image

分析网站

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

单线程处理

crawDemo/craw/craw1.go

单线程爬取

notion image

并发处理

crawDemo/craw/craw2.go
crawDemo/main.go

并发爬取

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

关键代码

notion image
使用正则表达式匹配我们想要的图片格式
notion image
1.将爬取到的图片地址塞到chanImageUrls这个chann,分析到页面url参数的规律是+1.html,多少个页面开启多少个协程完成每个页面的图片地址爬取并塞到chanImageUrls和chanTask这两个chan通道里,第一个chan用于任务通道,第二个chan通过另起一个协程记录页面任务完成情况完成则关闭数据管道。
notion image
2.开启5个协程从管道里读取链接并下载
notion image

学习Websocket

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

演示

运行后执行html文件测试
notion image
notion image
notion image

一个 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 关键字,确保在函数执行完毕后会执行这些清理操作。
 
 
 
Loading...