Go语言多线程爬虫与代理IP反爬
有个朋友想用Go语言编写一个多线程爬虫,并且使用代理IP来应对反爬措施。多线程在Go中通常是通过goroutine实现的,所以应该使用goroutine来并发处理多个网页的抓取。然后,代理IP的话,可能需要一个代理池,从中随机选择代理来发送请求,避免同一个IP被封锁。大体思路就是这样,具体看我下面实操吧。
以下是一个使用Go语言编写的多线程爬虫程序,结合代理IP和反爬策略的示例代码:
package mainimport ("bufio""crypto/tls""fmt""io/ioutil""math/rand""net""net/http""net/url""os""sync""time"
)var (proxyPool []*url.URLproxyMux sync.MutexuserAgents = []string{"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",}visitedURLs sync.Map
)func main() {// 初始化随机种子rand.Seed(time.Now().UnixNano())// 加载代理列表if err := loadProxies("proxies.txt"); err != nil {fmt.Println("Error loading proxies:", err)return}// 创建任务通道taskChan := make(chan string, 100)// 启动workervar wg sync.WaitGroupworkerCount := 10for i := 0; i < workerCount; i++ {wg.Add(1)go worker(taskChan, &wg)}// 添加初始任务go func() {taskChan <- "https://httpbin.org/ip"taskChan <- "https://example.com"}()// 等待所有worker完成(实际可能需要其他停止机制)wg.Wait()close(taskChan)
}func loadProxies(filename string) error {file, err := os.Open(filename)if err != nil {return err}defer file.Close()scanner := bufio.NewScanner(file)for scanner.Scan() {line := scanner.Text()proxyURL, err := url.Parse("http://" + line)if err != nil {continue}proxyPool = append(proxyPool, proxyURL)}return nil
}func worker(taskChan <-chan string, wg *sync.WaitGroup) {defer wg.Done()for targetURL := range taskChan {// URL去重if _, loaded := visitedURLs.LoadOrStore(targetURL, true); loaded {continue}// 随机延迟(1-3秒)time.Sleep(time.Duration(1+rand.Intn(2)) * time.Second)// 获取随机代理proxy := getRandomProxy()if proxy == nil {fmt.Println("No available proxies")continue}// 创建自定义Transporttransport := &http.Transport{Proxy: http.ProxyURL(proxy),DialContext: (&net.Dialer{Timeout: 10 * time.Second,KeepAlive: 10 * time.Second,}).DialContext,TLSClientConfig: &tls.Config{InsecureSkipVerify: true},MaxIdleConns: 100,IdleConnTimeout: 90 * time.Second,TLSHandshakeTimeout: 10 * time.Second,ExpectContinueTimeout: 1 * time.Second,}// 创建HTTP客户端client := &http.Client{Transport: transport,Timeout: 15 * time.Second,}// 创建请求req, err := http.NewRequest("GET", targetURL, nil)if err != nil {fmt.Printf("Error creating request: %v\n", err)continue}// 设置随机User-Agentreq.Header.Set("User-Agent", userAgents[rand.Intn(len(userAgents))])// 发送请求resp, err := client.Do(req)if err != nil {fmt.Printf("Error fetching %s: %v\n", targetURL, err)markBadProxy(proxy)continue}defer resp.Body.Close()// 处理响应if resp.StatusCode != http.StatusOK {fmt.Printf("Non-200 status code: %d for %s\n", resp.StatusCode, targetURL)continue}// 读取响应内容body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("Error reading response body: %v\n", err)continue}// 处理页面内容(示例:输出内容长度)fmt.Printf("Successfully fetched %s (%d bytes) using proxy %s\n",targetURL, len(body), proxy.Host)// 这里可以添加链接提取和任务添加逻辑// parseLinks(body, taskChan)}
}func getRandomProxy() *url.URL {proxyMux.Lock()defer proxyMux.Unlock()if len(proxyPool) == 0 {return nil}return proxyPool[rand.Intn(len(proxyPool))]
}func markBadProxy(badProxy *url.URL) {proxyMux.Lock()defer proxyMux.Unlock()for i, p := range proxyPool {if p.String() == badProxy.String() {// 移除无效代理proxyPool = append(proxyPool[:i], proxyPool[i+1:]...)fmt.Printf("Removed bad proxy: %s\n", badProxy.String())break}}
}// 示例链接解析函数(需要根据实际情况实现)
func parseLinks(body []byte, taskChan chan<- string) {// 这里可以添加HTML解析逻辑,提取链接并发送到taskChan// 注意:需要处理相对路径转换和域名限制
}
关键特性说明:
-
代理管理:
- 从文件加载代理列表(格式:ip:port)
- 随机选择代理进行请求
- 自动移除失效代理
-
反爬策略:
- 随机User-Agent轮换
- 请求间随机延迟(1-3秒)
- 自动代理失效检测和移除
- 支持HTTPS和跳过证书验证
-
并发控制:
- 使用带缓冲的channel作为任务队列
- 可配置的worker数量
- 自动URL去重(使用sync.Map)
-
健壮性设计:
- 连接超时设置(15秒)
- 自定义Transport参数优化
- 完善的错误处理
使用说明:
- 创建代理文件
proxies.txt
,格式为每行一个代理地址(ip:port) - 根据需求调整以下参数:
workerCount
:并发worker数量taskChan
缓冲大小- 各种超时参数
- 随机延迟时间范围
- 实现
parseLinks
函数来提取新链接 - 添加具体的页面解析逻辑
注意事项:
- 代理质量直接影响爬虫效果,建议使用优质代理服务
- 根据目标网站的robots.txt和版权政策合理使用
- 添加适当的速率限制避免对目标网站造成过大压力
- 对于复杂反爬机制可能需要添加更多策略:
- Cookie管理
- JavaScript渲染支持
- 验证码识别
- 请求头随机化
- 请求参数随机化
上面代码就是我提供了基础的爬虫框架,大家在使用的时候可以根据具体需求进行扩展和优化,有了这样的代码示例能让你们省很多事情。
相关文章:

Go语言多线程爬虫与代理IP反爬
有个朋友想用Go语言编写一个多线程爬虫,并且使用代理IP来应对反爬措施。多线程在Go中通常是通过goroutine实现的,所以应该使用goroutine来并发处理多个网页的抓取。然后,代理IP的话,可能需要一个代理池,从中随机选择代…...
配置集群(yarn)
在配置 YARN 集群前,要先完成以下准备工作: 集群环境规划:明确各节点的角色,如 ResourceManager、NodeManager 等。网络环境搭建:保证各个节点之间能够通过网络互通。时间同步设置:安装 NTP 服务࿰…...

node.js 实战——express图片保存到本地或服务器(七牛云、腾讯云、阿里云)
本地 ✅ 使用formidable 读取表单内容 npm i formidable ✅ 使用mime-types 获取图片后缀 npm install mime-types✅ js 中提交form表单 document.getElementById(uploadForm).addEventListener(submit, function(e){e.preventDefault();const blob preview._blob;if(!blob)…...
CSS3 伪类和使用场景
CSS3 伪类(Pseudo-classes)大全 CSS3 引入了许多新的伪类,以下是完整的 CSS3 伪类分类列表(包括 CSS2 的伪类): 一、结构性伪类(Structural Pseudo-classes) 这些伪类根据元素在文…...

Shadertoy着色器移植到Three.js经验总结
Shadertoy是一个流行的在线平台,用于创建和分享WebGL片段着色器。里面有很多令人惊叹的画面,甚至3D场景。本人也移植了几个ShaderToy上的着色器。本文将详细介绍移植过程中需要注意的关键点。 1. 基本结构差异 想要移植ShaderToy的shader到three.js&am…...

电脑端音乐播放器推荐:提升你的听歌体验!
在快节奏的职场环境中,许多上班族都喜欢用音乐为工作时光增添色彩。今天要分享的这款音乐工具,或许能为你的办公时光带来意想不到的惊喜。 一、软件介绍-澎湃 澎湃音乐看似是个普通的播放器,实则藏着强大的资源整合能力。左侧功能栏清晰陈列着…...

VIC-2D 7.0 为平面样件机械试验提供全视野位移及应变数据软件
The VIC-2D系统是一个完全集成的解决方案,它基于优化的相关算法为平面试样的力学测试提供非接触、全场的二维位移和应变数据,可测量关注区域内的每个像素子集的面内位移,并通过多种张量选项计算全场应变。The VIC-2D 系统可测量超过 2000%变形…...

一周学完计算机网络之三:1、数据链路层概述
简单的概述 数据链路层是计算机网络体系结构中的第二层,它在物理层提供的基本服务基础上,负责将数据从一个节点可靠地传输到相邻节点。可以将其想象成一个负责在两个相邻的网络设备之间进行数据 “搬运” 和 “整理” 的 “快递中转站”。 几个重要概念…...
网卡网孔速率的协商是如何进行的?
网卡与交换机等网络设备之间的速率协商主要通过**自动协商(Auto-Negotiation)**机制实现,其核心是物理层(PHY)芯片之间的信息交互。以下是协商过程的详细解析: 一、自动协商的核心流程 1. 发送配置帧&am…...

单片机-STM32部分:13-1、蜂鸣器
飞书文档https://x509p6c8to.feishu.cn/wiki/V8rpwIlYIiEuXLkUljTcXWiKnSc 一、应用场景 大部分的电子产品、家电(风扇、空调、电水壶)都会有蜂鸣器,用于提示设备的工作状态 二、原理 蜂鸣器是一种将电信号转换为声音信号的器件࿰…...

动态IP技术赋能业务创新:解锁企业数字化转型新维度
在数字经济高速发展的今天,IP地址已不再是简单的网络标识符,而是演变为支撑企业数字化转型的核心基础设施之一。动态IP技术凭借其灵活、高效、安全的特性,正在重塑传统业务模式,催生出诸多创新应用场景。本文将深入剖析动态IP的技…...
使用Python删除PDF中多余或空白的页面
目录 为什么需要删除 PDF 中的多余或空白页面? 所需工具 环境准备 如何使用Python删除PDF中的多余页面 实现思路 详细实现步骤 实现代码 如何使用Python检测并删除PDF中的空白页 实现思路 详细实现步骤 实现代码 在处理 PDF 文件时,常常会遇到…...
英语复习笔记 1
前言 我们知道英语最重要就是单词和阅读理解,因为时间安排和自己懒惰的原因,英语复习实际上进行得非常缓慢。实际上英语复习得比较少,但是我想考一个高分,这样下去肯定是废掉了。所以从今天开始我要好好复习英语。之前有个大佬说…...
UART16550 IP core笔记二
XIN时钟 表示use external clk for baud rate选型,IP核会出现Xin时钟引脚 XIN输入被外部驱动,也就是外部时钟源,那么外部时钟必须要满足特定的要求,就是XIN 的range范围是xin<S_AXI_CLK/2,如果不满足这个条件,那么A…...

TDengine 在金融领域的应用
简介 金融行业正处于数据处理能力革新的关键时期。随着市场数据量的爆炸式增长和复杂性的日益加深,金融机构面临着寻找能够高效处理大规模、高频次以及多样化时序数据的大数据处理系统的迫切需求。这一选择将成为金融机构提高数据处理效率、优化交易响应时间、提高…...

OSCP - Hack The Box - Sau
主要知识点 CVE-2023-27163漏洞利用systemd提权 具体步骤 执行nmap扫描,可以先看一下55555端口 Nmap scan report for 10.10.11.224 Host is up (0.58s latency). Not shown: 65531 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp o…...
大模型的Lora如何训练?
大模型LoRA(Low-Rank Adaptation)训练是一种参数高效的微调方法,通过冻结预训练模型权重并引入低秩矩阵实现轻量化调整。以下是涵盖原理、数据准备、工具、参数设置及优化的全流程指南: 一、LoRA的核心原理 低秩矩阵分解 在原始权重矩阵$ W 旁添加两个低秩矩阵 旁添加两个…...
分词器工作流程和Ik分词器详解
切分词语,normalization 给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行 normalization(时态转换,单复数转换),分词器 recall,召回率:搜索的…...

QT6 源(93)篇三:阅读与注释共用体类 QVariant 及其源代码,本类支持比较运算符 ==、!=。
(9) 本类支持比较运算符 、! : 可见, QString 类型里可存储多个 unicode 字符,即使只存储一个 unicode 字符也不等于 QChar。 (10)本源代码来自于头文件 qvariant . h : #ifndef Q…...

Maven私服搭建与登录全攻略
目录 1.背景2.简介3.安装4.启动总结参考文献 1.背景 回顾下maven的构建流程,如果没有私服,我们所需的所有jar包都需要通过maven的中央仓库或者第三方的maven仓库下载到本地,当一个公司或者一个团队所有人都重复的从maven仓库下载jar包&#…...

力扣210(拓扑排序)
210. 课程表 II - 力扣(LeetCode) 这是一道拓扑排序的模板题。简单来说,给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。如果有向图中有环就没有办法进行拓扑排序了。因此,拓扑排序也是图论中判断有向无环图…...
1.1 文章简介
前因后果链 行业需求 → 技能断层 → 课程设计响应 (高薪岗位要求数学基础) → (符号/公式理解困难) → (聚焦原理与应用) 行业驱动因素 • 前因:机器学习/AI等领域的高薪岗位激增,但数学能力成为主要门槛 • 关键矛盾:算法论文中的数学…...
将本地文件上传到云服务器上
使用 SCP 命令(最常用) # 基本语法 scp [本地文件路径] [用户名][服务器IP]:[目标路径]# 示例:上传单个文件 scp /path/to/local/file.txt root192.168.1.100:/path/to/remote/# 上传整个目录 scp -r /path/to/local/directory root192.168.…...

C++ asio网络编程(5)简单异步echo服务器
上一篇文章:C asio网络编程(4)异步读写操作及注意事项 文章目录 前言一、Session类1.代码2.代码详解3.实现Session类1.构造函数2.handle_read3.介绍一下boost的封装函数和api4.handle_write 二、Server类1.代码2.代码思路详解 三、客户端四、运行截图与流程图 前言 提示&…...

【机器人】复现 UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025
UniGoal的提出了一个通用的零样本目标导航框架,能够统一处理多种类型的导航任务。 支持 对象类别导航、实例图像目标导航和文本目标导航,而无需针对特定任务进行训练或微调。 本文分享UniGoal复现和模型推理的过程~ 查找沙发,模…...
基于大模型预测的吉兰 - 巴雷综合征综合诊疗方案研究报告大纲
目录 一、引言(一)研究背景(二)研究目的与意义二、大模型预测吉兰 - 巴雷综合征的理论基础与技术架构(一)大模型原理概述(二)技术架构设计三、术前预测与手术方案制定(一)术前预测内容(二)手术方案制定依据与策略四、术中监测与麻醉方案调整(一)术中监测指标与数…...

spring中的@PropertySource注解详解
一、核心功能与作用 PropertySource是Spring框架中用于加载外部配置文件的核心注解,主要作用是将属性文件(如.properties、.yml)的键值对加载到Spring的Environment环境中,实现配置与代码的解耦。其核心价值包括: 外部…...
ChromeDriver 技术生态与应用场景深度解析
ChromeDriver 技术生态与应用场景深度解析 随着 Web 自动化测试、运维和数据采集需求的不断增长,ChromeDriver 及其相关技术栈在各行业中扮演着举足轻重的角色。本文将从技术选型、语言适配、典型场景、技术延伸等维度,结合最新行业趋势与实践经验&…...
【NextPilot日志移植】日志写入流程
📝 文件后端日志写入流程详解 当后端选择文件时,日志写入过程主要涉及 LogWriter 和 LogWriterFile 类的协作。以下是详细的日志写入过程解释及涉及的代码: 1. LogWriter 类初始化 在 LogWriter 类的构造函数中,如果配置的后端…...

二极管钳位电路——Multisim电路仿真
目录 二极管钳位电路 2.1 二极管正向钳位电路 二极管压降测试 2.1.1 二极管正向钳位电路图 2.1.2 二极管正向钳位工作原理 2.2 二极管负向钳位电路 2.2.1 二极管负向钳位电路图 2.2.2 二极管负向钳位工作原理 二极管正向反向钳位仿真电路实验结果 2.3 二极管顶部钳位…...