当前位置: 首页 > news >正文

Go语言多线程爬虫万能模板它来了!

对于长期从事爬虫行业的技术员来说,通过技术手段实现抓取海量数据并且做到可视化处理,我在想如果能写一个万能的爬虫模板,后期遇到类似的工作只要套用模板就能解决大部分的问题,如此提高工作效率何乐而不为?

在这里插入图片描述

以下是一个基本的 Go 爬虫程序的示例,用于爬取网站并做可视化处理。这个爬虫使用了多线程来提高效率,并使用了代理信息来避免被网站反爬虫机制封锁。

package mainimport ("fmt""net/http""os""strings""sync"
)const (proxyHost = "www.duoip.cn"proxyPort = 8000
)func main() {// 创建一个字典来存储商品信息productMap := make(map[string]string)// 创建一个锁来保护商品字典:= sync.Mutex{}// 创建一个队列来存储要爬取的页面queue := make(chan string)// 创建一个信号量来控制并发数量sem := make(chan int, 10)// 创建一个信号量来控制线程数量threads := make(chan int, 10)// 创建一个信号量来控制线程数量complete := make(chan bool)// 启动一个线程来处理队列go handleQueue(queue, sem, productMap, lock, complete)// 启动10个线程来爬取页面for i := 0; i < 10; i++ {threads <- i}// 关闭信号量来停止线程close(threads)// 关闭信号量来停止线程close(sem)// 关闭信号量来停止爬取close(queue)// 等待所有线程完成for i := 0; i < 10; i++ {<-complete}// 打印商品信息for _, product := range productMap {fmt.Println(product)}
}func handleQueue(queue chan string, sem chan int, productMap map[string]string, lock sync.Mutex, complete chan bool) {// 获取信号量来控制并发数量sem <- 1defer func() {<-sem}()// 从队列中取出一个页面page := <-queue// 使用代理信息进行网络请求resp, err := http.Get(fmt.Sprintf("http://%s:%d/%s", proxyHost, proxyPort, page))if err != nil {fmt.Println(err)return}defer resp.Body.Close()// 检查响应是否成功if resp.StatusCode != http.StatusOK {fmt.Println("Error:", resp.Status)return}// 解析响应体中的商品信息var product stringif err := http.StripPrefix("/product/", resp.Body, &product); err != nil {fmt.Println(err)return}// 使用锁保护商品字典.Lock()defer.Unlock()// 将商品信息添加到字典中productMap[product] = ""// 将信号量发送给下一个线程sem <- 1
}func parsePage(page string) {// 使用正则表达式解析页面中的商品信息// 这里只是一个示例,实际的解析逻辑可能会更复杂var product, price stringif match := strings.MustCompile(`商品名称: (\w+), 价格: (\d+)`).FindStringSubmatch(page); match != nil {product = match[1]price = match[2]}
}

这个程序首先创建了一个商品字典和一个锁来保护字典。然后,它创建了一个队列和一个信号量来控制并发数量和线程数量。接下来,它启动了一个线程来处理队列,以及10个线程来爬取页面。在每个爬取线程中,它从队列中取出一个页面,使用代理信息进行网络请求,解析响应体中的商品信息,并将商品信息添加到商品字典中。

在每个爬取线程完成后,它将信号量发送给下一个线程,以控制并发数量。最后,程序打印出所有爬取到的商品信息。需要注意的是,这只是一个基本的示例,实际的爬虫程序可能会更复杂,需要处理更多的异常情况和错误。

上面的详细程序步骤,是多线程并且可视化处理的爬虫通用模板。利用模版可以解决效率问题,爬虫IP的辅助可以让数据爬取更快捷。如果爬虫代码问题以及爬虫ip问题都可以一起讨论讨论。

相关文章:

  • 多功能回馈式交流电子负载的应用
  • 2023.11.22 IDEA Spring Boot 项目热部署
  • 电脑技巧:推荐八个非常实用的在线网站值得收藏
  • 外贸自建站服务器怎么选?网站搭建的工具?
  • uni-app 跨端开发注意事项
  • 开发板启动进入系统以后再挂载 NFS 文件系统, 这里的NFS文件系统是根据正点原子教程制作的ubuntu_rootfs
  • 【漏洞复现】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上传漏洞 附POC
  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第六章 样式格式化 (Sass配置)
  • AI一点通:卷积神经网络的输出节点大小如何计算?全连接层必要输入大小如何设置
  • 数据库知识点总结(一)
  • Go——二、变量和数据类型
  • C#面试题3
  • 马养殖场建设VR模拟实训教学平台具有灵活性和复用性
  • ES6 — ES14 新特性
  • Python算法——树的拓扑排序
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Bytom交易说明(账户管理模式)
  • echarts花样作死的坑
  • eclipse的离线汉化
  • javascript面向对象之创建对象
  • JavaWeb(学习笔记二)
  • JS学习笔记——闭包
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Phpstorm怎样批量删除空行?
  • spark本地环境的搭建到运行第一个spark程序
  • SpringCloud集成分布式事务LCN (一)
  • text-decoration与color属性
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 编写符合Python风格的对象
  • 测试如何在敏捷团队中工作?
  • 经典排序算法及其 Java 实现
  • 你真的知道 == 和 equals 的区别吗?
  • 悄悄地说一个bug
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用 @font-face
  • 使用API自动生成工具优化前端工作流
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习HTTP相关知识笔记
  • 一些关于Rust在2019年的思考
  • 赢得Docker挑战最佳实践
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 转载:[译] 内容加速黑科技趣谈
  • FaaS 的简单实践
  • # include “ “ 和 # include < >两者的区别
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(一种朴素的计算器实现方法)
  • (20050108)又读《平凡的世界》
  • (4)STL算法之比较
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)hibernate配置管理
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...