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

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

在这里插入图片描述

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

package main

import (
	"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 <- 1
	defer 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 string
	if 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 string
	if match := strings.MustCompile(`商品名称: (\w+), 价格: (\d+)`).FindStringSubmatch(page); match != nil {
		product = match[1]
		price = match[2]
	}
}

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/179568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

逸学java【初级菜鸟篇】9.5枚举

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 枚举是信息的标志和分类 当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为类型的枚举。 优点&#xff1a;代码可读性好&#xff0c;入参约束严谨&#xff0c;代码优雅&#xff0c;是最好的信息分类技术&#x…

IDEA集成Git

一、配置Git忽略文件 例如&#xff1a;用eclipse创建的项目有其特定的文件&#xff0c;例如&#xff1a;.classpath,.project文件&#xff0c;而用IDEA创建的项目也有其特定的文件&#xff1a;.xml,.iml,.target,我们需要最好忽略他们。 为什么要忽略他们&#xff1f; 与项目…

装饰器设计模式是什么?什么是 Decorator 装饰器设计模式?Python 装饰器设计模式示例代码

什么是 Decorator 装饰器设计模式&#xff1f; 装饰器模式是一种结构型设计模式&#xff0c;它允许向现有对象动态地添加新功能&#xff0c;同时不改变其结构。这种模式实现了对对象的包装&#xff0c;称为装饰器&#xff0c;并且可以在运行时动态地添加、修改或删除对象的行为…

httpd(Web服务器)

名词解释 1、URL&#xff1a;Uniform Resource Locator&#xff0c;统⼀资源定位符 2、⽹址格式&#xff1a;<协议>://<主机或主机名>[:port]/<⽬录资源,路径> 3、主机地址/主机名&#xff1a;主机地址是服务器在因特⽹所在的IP地址。主机名就需要域名解析…

用于计算机屏幕安全摄像头系统:Screen Anytime Crack

Screen Anytime 是一款软件&#xff0c;旨在自动将整个用户会话或 PC/服务器/VM/Kiosk 的 /RDP/Citrix/RemoteApp 会话的屏幕活动记录到视频日志文件中&#xff0c;以用于记录、审核和监控目的。通过重播其高度压缩的视频&#xff0c;您可以轻松回顾单台计算机或一组服务器/PC …

Power Apps-下拉列表控件

插入一个下拉列表控件 设置值的两种方式 1.通过属性items写数组设置 2.通过连接数据表&#xff0c;先在右侧操作面板中选择项目中的数据表 再从Value中选择其中一列&#xff0c;下拉就可以选择该列全部行的值 但是这样会导致有很多重复的字段&#xff0c;所以可以在items属性里…

最近技术圈发生了很多大事,来聊聊

如标题所说&#xff0c;最近这几年全球都大事频发。有事甚至不知道是我更关心社会和时政、还是真的进入一个大变革时代。 可以确认的是&#xff0c;现在这个时代、科技的发展到了一个可感知到越来越快的速度。 … 前几天&#xff0c;当下AI 领域最有知名的人奥特曼被 OpenAI…

Leaflet实现轨迹播放动画效果

效果图如下&#xff1a; <!DOCTYPE html> <html><head><title>轨迹</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><!-- 引入样式 -->…

Sentinel 授权规则 (AuthorityRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

基于深度学习的文本分类

通过构建更复杂的深度学习模型可以提高分类的准确性&#xff0c;即分别基于TextCNN、TextRNN和TextRCNN三种算法实现中文文本分类。 项目地址&#xff1a;zz-zik/NLP-Application-and-Practice: 本项目将《自然语言处理与应用实战》原书中代码进行了实现&#xff0c;并在此基础…

Connect-The-Dots_2

Connect-The-Dots_2 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.148 arp-scan -l端口扫描 nmap -A -p- -sV 192.168.80.148开放端口 21/tcp open ftp vsftpd 2.0.8 or later 80/tcp open http Apache httpd 2.4.38 ((Debian)) 111/tcp …

前缀和——DP34 【模板】前缀和

文章目录 &#x1f34b;1. 题目&#x1f348;2. 算法原理&#x1f348;3. 代码实现 &#x1f34b;1. 题目 题目链接&#xff1a;【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 描述 给定一个长度为n的数组a1,a2,…an. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询…

基于ZLMediaKit的GB28181视频平台demo

GB28181 主要内容 国标的20位id是按照标准来定的&#xff0c;前8位是地域信息&#xff0c;9-10位是行业信息&#xff0c;11-13是设备类型、14是网络标识、后6位为序号 约定以SIP协议作为会话通道的使用标准&#xff0c;以RTP作为语言和视频的载体。联网系统在进行音视频传输及…

ui设计师简历自我评价的范文(合集)

ui设计师简历自我评价的范文篇一 本人毕业于艺术设计专业&#xff0c;具有较高的艺术素养&#xff0c;平时注重设计理论知识的积累&#xff0c;并将理论应用到作品中。了解当下设计的流行趋势&#xff0c;设计注重细节、重视用户体验&#xff0c;对色彩搭配有着浓厚的兴趣&…

简墨的进化之路:打造大模型数据计算系统的云存储底座

10月24日程序员节&#xff0c;「大模型数据计算系统」2023拓数派年度技术论坛在上海圆满落幕&#xff0c;拓数派大模型数据计算系统&#xff08;PieDataComputingSystem&#xff0c;缩写&#xff1a;πDataCS&#xff09;如约而至&#xff01;πDataCS 以云原生技术重构数据存储…

私有化敏感词检测API服务wordscheck

之前有网友在找敏感词检测的应用&#xff0c;这个应该能满足他的需求&#xff1b; 什么是 wordscheck &#xff1f; wordscheck 是敏感词检测 API&#xff0c;提供文本识别、智能鉴黄、涉政检测、谩骂等等敏感词检测过滤服务。 简介 敏感词库从大量样本库整理出来&#xff0c;…

Java 编码

编码: 加密: 通过加密算法和密钥进行 也可通过码表进行加密 对称加密: 缺点:可被截获 元数据---加密算法密钥密文 ----> 解密算法密钥元数据 算法:DES(短 56位),AES(长 128位)破解时间加长 非对称加密: 元数据-加密算法加密密钥 密文 --->加密算法解密密钥元数据 …

1.Qt5.15及其以上的下载

Qt5.15及其以上的下载 简介&#xff1a; ​ Qt是一个跨平台的C库&#xff0c;允许开发人员创建在不同操作系统&#xff08;如Windows、macOS、Linux/Unix&#xff09;和设备上具有本地外观和感觉的应用程序。Qt提供了一套工具和库&#xff0c;用于构建图形用户界面&#xff0…

CNVD-2023-12632:泛微E-cology9 browserjsp SQL注入漏洞复现 [附POC]

文章目录 泛微E-cology9 browserjsp SQL注入漏洞(CNVD-2023-12632)漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 泛微E-cology9 browserjsp SQL注入漏洞(CNVD-2023-12632)漏洞复现 [附POC] 0x…

JavaEE 多线程01

为什么引入多线程? 首先进程已经能很好的完成多任务这个情景下的并发编程了,那为什么又引入多线程呢? 这是因为在一些情景下,我么需要大量的创建和销毁进程来完成一些任务,此时多进程对系统的开销就会很大了. 假设有这样一个场景,服务器同时接收到很多个服务请求,这个时候服务…