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的话,可能需要一个代理池,从中随机选择代…...
Linux文件编程:操作流程与内核机制
在 Linux 操作系统中,一切皆文件,这意味着从硬盘上的数据文件、设备驱动、到管道、套接字等都以文件的形式存在。Linux 的文件系统将这些不同类型的文件统一抽象成文件对象,允许程序通过文件描述符来访问它们。 一、核心概念解析 文件描述符…...
用短说社区搭建的沉浸式生活方式分享平台
你是否想打造一个融合小红书式种草基因与论坛深度互动的全新社区?本文依托短说社区论坛系统的社区功能规划,一起来规划,如何搭建一个集内容分享、社交互动、消费决策于一体的沉浸式生活社区。 短说社区的界面样式支持普通资讯列表或瀑布流列…...
【ASR学习笔记】:语音识别领域基本术语
一、基础术语 ASR (Automatic Speech Recognition) 自动语音识别,把语音信号转换成文本的技术。 VAD (Voice Activity Detection) 语音活动检测,判断一段音频里哪里是说话,哪里是静音或噪音。 Acoustic Model(声学模型࿰…...
2025年best好用的3dsmax插件和脚本
copitor 可以从一个3dsmax场景里将物体直接复制到另一个场景中 Move to surface 这个插件可以将一些物体放到一个平面上 instancer 实体器,举例:场景中有若干独立的光源,不是实体对象,我们可以使用instancer将他变成实体。 paste …...
电厂除灰系统优化:时序数据库如何降低粉尘排放
在环保要求日益严苛的当下,电厂作为能源生产的重要主体,其除灰系统的运行效率与粉尘排放控制效果紧密相关。传统除灰系统在数据处理和排放控制方面存在一定局限性,而时序数据库凭借对时间序列数据的高效存储、处理和分析能力,为电…...
upload-labs通关笔记-第2关 文件上传之MIME绕过
目录 一、MIME字段 1. MIME 类型的作用 2. 常见的 MIME 类型 二、实验准备 1.构造脚本 2.打开靶场 3.源码分析 三、修改MIME字段渗透法 1.选择shell脚本 2.bp开启拦截 3.上传脚本bp拦包 4.bp改包 5.获取脚本地址 6.获取木马URL 7.hackbar渗透 8.蚁剑渗透 本文通…...
未来技术展望:光子量子计算集成与连续变量可视化
光子量子计算作为量子计算的重要分支,凭借其独特的光子传输优势和连续变量编码方式,正在量子计算领域掀起新的技术革命。以Xanadu公司的Borealis光量子处理器为代表,连续变量量子计算的可视化技术将面临全新的挑战与机遇。以下从技术适配、可视化方法及工具开发三个维度展开…...
vite项目使用i18n-ally未读取到文件
前言 在使用 Vue CLI 创建的Vue 3项目中,语言文件(src/lang/zh.js和en.js)正常加载。 .vscode/settings.json如下:i18n-ally.enabledParsers中增加了js {"i18n-ally.localesPaths": ["src/i18n","src/…...
yarn workspace使用指南
作用 Yarn workspace 是 Yarn 包管理工具中的一个功能,主要用于管理多包项目(monorepo)。它的主要作用如下: 支持多包结构:允许在一个仓库中管理多个独立的包或项目。项目间依赖管理:方便地在不同包之间添…...
Spring Boot 参数验证
一、依赖配置 首先确保在 pom.xml 中添加了以下依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 这个依赖包含了 Hibernate Valida…...
Electron学习大纲
Electron 实际工作学习大纲路线,结合技术原理、实战开发与工程化最佳实践,分为 5 大核心阶段,每个阶段包含关键知识点和实践目标,帮助快速掌握桌面应用开发能力: 阶段一:Electron 基础与环境搭建(1-2周) 核心概念与架构Electron 组成: 主进程(Main Process):控制应…...
Linux 系统中设置开机启动脚本
Linux 系统中设置开机启动脚本有多种方法,适用于不同的场景和需求。以下是几种最常用且详细的方法: 核心理念: 无论哪种方法,核心都是让系统在启动过程中的某个阶段执行你的脚本。 1. 使用 systemd (推荐,现代 Linux 发行版的标准) systemd 是目前大多数主流 Linux 发行…...
如何解决Deepseek服务器繁忙的问题?
在现如今互联网技术飞速发展的时代,AI技术也逐渐开始兴起,Deepseek作为一款强大的AI工具,可以帮助各个行业的用户高效的处理复杂任务,但是,用户在使用这一工具的过程中,可能会遇到服务器繁忙的问题…...
四、STM32 HAL库API完全指南:从功能分类到实战示例
STM32 HAL库API完全指南:从功能分类到实战示例 一、HAL库API的总体架构 STM32 HAL库(Hardware Abstraction Layer)作为STMicroelectronics推出的统一驱动框架,提供了覆盖所有STM32外设的标准化API。HAL库的API设计遵循严格的分层…...
集成学习——Bagging,Boosting
一.什么是集成学习 集成学习的基本思想是通过结合多个基学习器的预测结果,来提高模型的泛化能力和稳定性。这些基学习器可以是相同类型的算法,也可以是不同类型的算法。 当基学习器之间具有一定的差异性时,它们在面对不同的样本子集或特征子…...
如何有效追踪需求的实现情况
有效追踪需求实现情况,需要清晰的需求定义、高效的需求跟踪工具、持续的沟通反馈机制,其中高效的需求跟踪工具尤为关键。 使用需求跟踪工具能确保需求实现进度可视化、提高团队协作效率,并帮助识别和管理潜在风险。例如,使用专业的…...
网页Web端无人机直播RTSP视频流,无需服务器转码,延迟300毫秒
随着无人机技术的飞速发展,全球无人机直播应用市场也快速扩张,从农业植保巡检到应急救援指挥,从大型活动直播到智慧城市安防,实时视频传输已成为刚需。预计到2025年,全球将有超过1000万架商用无人机搭载直播功能&#…...
基于SpringBoot的蜗牛兼职网设计与实现|源码+数据库+开发说明文档
一、项目简介 蜗牛兼职网是一个集职位信息发布、用户申请、企业管理、后台运维于一体的校园类兼职招聘平台,使用 SpringBoot 作为后端核心框架,搭配 Layui Bootstrap 实现前端页面开发,前后端结合,功能齐全。 系统共分为 三种角…...
kafka消费组
Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解_consumergroup-CSDN博客 定义: 消费者组是一组可以协同工作的消费者实例的集合。 每个消费者都属于一个特定…...
每日一题洛谷P8662 [蓝桥杯 2018 省 AB] 全球变暖c++
P8662 [蓝桥杯 2018 省 AB] 全球变暖 - 洛谷 (luogu.com.cn) DFS #include<iostream> using namespace std; char a[1001][1001]; bool s[1001][1001]; int res 0; int n; bool flag true; int dx[4] { -1,0,1,0 }; int dy[4] { 0,-1,0,1 }; void dfs(int x, int y)…...
2025年Energy SCI1区TOP,改进雪消融优化算法ISAO+电池健康状态估计,深度解析+性能实测
目录 1.摘要2.雪消融优化算SAO原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 锂离子电池(LIBs)的健康状态(SOH)估计对于电池健康管理系统至关重要,为了准确估计LIBs的健康状态,本文提出…...
docker使用过程中遇到概念问题
容器和虚拟机的区别 容器共享主机内核;虚拟机占用主机内核硬件容器的启动速度是秒级别;虚拟机的启动速度是分钟级别容器资源占用低,性能接近原生;虚拟机资源占用高,性能有一定的损耗容器是进程级别的隔离;…...
leetcode-hot-100(双指针)
1. 移动零 题目链接:移动 0 题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 解答 类似于签到题&#x…...
力扣HOT100之二叉树:101. 对称二叉树
这道题我本来想着挑战一下自己,尝试着用迭代的方法来做,然后就是用层序遍历,将每一层的元素收集到一个临时的一维向量中,然后再逐层判断每一层是否都是轴对称的,一旦发现某一层不是轴对称的,就直接return f…...
深入解读tcpdump:原理、数据结构与操作手册
一、tcpdump 核心原理 tcpdump 是基于 libpcap 库实现的网络数据包捕获与分析工具,其工作原理可分解为以下层次: 数据包捕获机制 底层依赖:通过操作系统的 数据链路层接口(如 Linux 的 PF_PACKET 套接字或 AF_PACKET 类型&#x…...
HTML5 中实现盒子水平垂直居中的方法
在 HTML5 中,有几种方法可以让一个定位的盒子在父容器中水平垂直居中。以下是几种常用的方法: 使用 Flexbox 布局 <div class"parent"><div class"child">居中内容</div> </div><style>.parent {di…...
个人博客系统测试报告
目录 1 项目背景 2 项目功能 3 项目测试 3.1 测试用例 3.2 登录页面测试 3.3 博客列表页面测试 3.4 博客详情页面测试 3.5 自动化测试 3.5.1 Utils类 3.5.2 登录测试页面类 3.5.3 博客列表页测试类 3.5.4 博客详情页测试类 3.5.5 博客修改页测试类 3.5.6 未登录…...
适配WIN7的最高版本Chrome谷歌浏览器109版本下载
本仓库提供了一个适用于Windows 操作系统的谷歌浏览器109版本的离线安装包。 点击下面链接下载 WIN7的最高版本Chrome谷歌浏览器109版本下载...
从规划到完善,原型标注图全流程设计
一、原型标注图:设计到开发的精准翻译器 1. 设计意图的精准传递 消除模糊性:将设计师的视觉、交互逻辑转化为可量化的数据(尺寸、颜色、动效参数),避免开发“凭感觉还原”。 统一理解标准:通过标注建立团…...
极狐GitLab 通用软件包存储库功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 极狐GitLab 通用软件包存储库 (BASIC ALL) 在项目的软件包库中发布通用文件,如发布二进制文件。然后,…...
系统架构-嵌入式系统架构
原理与特征 嵌入式系统的典型架构可概括为两种模式,即层次化模式架构和递归模式架构 层次化模式架构,位于高层的抽象概念与低层的更加具体的概念之间存在着依赖关系,封闭型层次架构指的是,高层的对象只能调用同一层或下一层对象…...
hive两个表不同数据类型字段关联引发的数据倾斜
不同数据类型引发的Hive数据倾斜解决方案 #### 一、原因分析 当两个表的关联字段存在数据类型不一致时(如int vs string、bigint vs decimal),Hive会触发隐式类型转换引发以下问题: Key值的精度损失:若关联字…...
制作一款打飞机游戏45:简单攻击
粒子系统修复 首先,我们要加载cow(可能是某个项目或资源),然后直接处理粒子系统。你们看到在粒子系统中,我们仍然有X滚动。这现在已经没什么意义了,因为我们正在使用一个奇怪的新系统。所以我们实际上不再…...
《Vuejs设计与实现》第 5 章(非原始值响应式方案) 中
目录 5.4 合理触发响应 5.5 浅响应与深响应 5.6 只读和浅只读 5.4 合理触发响应 为了合理触发响应,我们需要处理一些问题。 首先,当值没有变化时,我们不应该触发响应: const obj = { foo: 1 } const p = new Proxy(obj, { /* ... */ })effect(() => {console.log(p…...
深入理解 Webpack 核心机制与编译流程
🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…...
okhttp3.Interceptor简介-笔记
1. Interceptor 简介 okhttp3.Interceptor 是 OkHttp 提供的一个核心接口,用于拦截 HTTP 请求和响应,允许开发者在请求发送前和响应接收后插入自定义逻辑。它在构建灵活、可扩展的网络请求逻辑中扮演着重要角色。常见的用途包括: 添加请求头…...
交易流水表的分库分表设计
交易流水表的分库分表设计需要结合业务特点、数据增长趋势和查询模式,以下是常见的分库分表策略及实施建议: 一、分库分表核心目标 解决性能瓶颈:应对高并发写入和查询压力。数据均衡分布:避免单库/单表数据倾斜。简化运维&#…...
《AI大模型应知应会100篇》第59篇:Flowise:无代码搭建大模型应用
第59篇:Flowise:无代码搭建大模型应用 摘要:本文将详细探讨 Flowise 无代码平台的核心特性、使用方法和最佳实践,提供从安装到部署的全流程指南,帮助开发者和非技术用户快速构建复杂的大模型应用。文章结合实战案例与配…...
开发环境(Development Environment)
在软件开发与部署过程中,通常会划分 开发环境(Development)、测试环境(Testing)、生产环境(Production) 这三个核心环境,以确保代码在不同阶段的质量和稳定性。以下是它们的详细介绍…...
MySQL的sql_mode详解:从优雅草分发平台故障谈数据库模式配置-优雅草卓伊凡
MySQL的sql_mode详解:从优雅草分发平台故障谈数据库模式配置-优雅草卓伊凡 引言:优雅草分发平台的故障与解决 近日,优雅草分发平台(youyacaocn)在运行过程中遭遇了一次数据库访问故障。在排查过程中,技术…...
PyCharm 快捷键指南
PyCharm 快捷键指南 常用编辑快捷键 代码完成:Ctrl Space 提供基本的代码完成选项(类、方法、属性)导入类:Ctrl Alt Space 快速导入所需类语句完成:Ctrl Shift Enter 自动结束代码(如添加分号&#…...
【数据结构】map_set前传:二叉搜索树(C++)
目录 二叉搜索树K模型的模拟实现 二叉搜索树的结构: Insert()插入: InOrder()中序遍历: Find()查找: Erase()删除: 参考代码: 二叉搜索树K/V模型的模拟实现: K/V模型的简单应用举例&…...
ZYNQ处理器在发热后功耗增加的原因分析及解决方案
Zynq处理器(结合ARM Cortex-A系列CPU和FPGA可编程逻辑)在发热后功耗增大的现象,通常由以下原因导致。以下是系统性分析及解决方案: 1. 根本原因分析 现象物理机制漏电流(Leakage Current)增加温度升高导致…...
Vue学习百日计划-Deepseek版
阶段1:基础夯实(Day 1-30) 目标:掌握HTML/CSS/JavaScript基础,理解Vue核心概念和基础语法。 每日学习内容(2小时): HTML/CSS(Day 1-10) 学习HTML标签语义化…...
DeepSeek-R1-Distill-Qwen-1.5B代表什么含义?
DeepSeek‑R1‑Distill‑Qwen‑1.5B 完整释义与合规须知 一句话先行 这是 DeepSeek‑AI 把自家 R1 大模型 的知识,通过蒸馏压缩进一套 Qwen‑1.5B 架构 的轻量学生网络,并以宽松开源许可证发布的模型权重。 1 | 名字逐段拆解 片段意义备注DeepSee…...
内网服务器之间传输单个大文件最佳解决方案
内网服务器之间传输单个大文件,采用python的http.server模块,结合wget下载文件是最快的传输方案。 笔者在ubuntu与debian之间传输单个单文件进行文件,尝试了scp、sftp、rsync等方案,但传输速度都只有1-3MB/秒;采用pyt…...
Linux常用命令详解(上):目录与文件操作及拷贝移动命令
Linux系统以其强大的命令行工具著称,无论是日常文件管理还是自动化运维,都离不开基础命令的灵活运用。本文将通过功能说明、语法格式、常用选项和实例演示,系统讲解Linux中目录操作、文件操作及拷贝移动的核心命令。 一、目录操作命令 1. c…...
可灵 AI:开启 AI 视频创作新时代
在当今数字化浪潮中,人工智能(AI)技术正以前所未有的速度渗透到各个领域,尤其是在内容创作领域,AI 的应用正引发一场革命性的变革。可灵 AI 作为快手团队精心打造的一款前沿 AI 视频生成工具,宛如一颗璀璨的…...
动态域名解析(DDNS)实战指南,原理、配置与远程访问,附无公网ip方案
本文从实际场景出发,详解如何通过动态域名(DDNS)解决动态IP访问难题,覆盖家庭、企业及IoT场景,并提供动态域名解析、内网端口映射外网远程访问等方案。 一、动态域名(DDNS)是什么?它…...