Go编程:使用 Colly 库下载Reddit网站的图像

news2024/12/26 9:18:55

亿牛云

概述

Reddit是一个社交新闻网站,用户可以发布各种主题的内容,包括图片。本文将介绍如何使用Go语言和Colly库编写一个简单的爬虫程序,从Reddit网站上下载指定主题的图片,并保存到本地文件夹中。为了避免被目标网站反爬,我们还将使用亿牛云爬虫代理服务,通过动态切换代理IP来提高爬取效率和稳定性。

正文

Colly库简介

Colly是一个用Go语言编写的功能强大的爬虫框架。它提供了简洁的API,拥有强劲的性能,可以自动处理cookie和session,还有提供灵活的扩展机制。Colly支持多种数据格式的解析,如HTML、XML、JSON等,还支持分布式爬取、限速、缓存、重试等功能。

亿牛云爬虫代理简介

亿牛云爬虫代理是一种专业的代理服务,通过固定云代理服务地址,建立专线网络链接,代理平台自动实现海量IP池管理及负载均衡,实时无感的毫秒级代理IP切换,提供企业级云服务的网络稳定性及请求响应速度,同时降低了客户端运算负载压力,避免了爬虫客户在代理IP策略优化上投入精力,整体提升了爬虫效率。

爬虫程序设计

我们的爬虫程序主要分为以下几个步骤:

  • 创建一个Colly实例,并设置相关选项和回调函数
  • 登录亿牛云后台,获取代理相关信息(域名、端口、用户名、密码),并设置到Colly实例中
  • 访问Reddit网站,根据指定的主题(subreddit)和过滤条件(filter),获取图片链接
  • 下载图片,并保存到本地文件夹中

爬虫程序代码

package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
	"os"
	"path/filepath"
	"strings"

	"github.com/gocolly/colly/v2"
)

// 定义常量
const (
	subreddit = "pics" // 主题
	filter    = "top"  // 过滤条件
	limit     = 10     // 图片数量限制
	output    = "images" // 输出文件夹

	// 亿牛云爬虫代理相关信息(需登录后台获取)
	proxyHost = "www.16yun.cn" // 域名
	proxyPort = 6443           // 端口
	proxyUser = "16YUN"        // 用户名
	proxyPass = "16IP"         // 密码
)

func main() {
	// 创建一个Colly实例
	c := colly.NewCollector(
		colly.AllowedDomains("www.reddit.com", "old.reddit.com", "i.redd.it", "i.imgur.com"),
	)

	// 设置代理(使用亿牛云爬虫代理服务)
	err := c.SetProxyFunc(func(r *http.Request) (*url.URL, error) {
		return url.Parse(fmt.Sprintf("http://%s:%s@%s:%d", proxyUser, proxyPass, proxyHost, proxyPort))
	})
	if err != nil {
		log.Fatal(err)
	}

	// 创建一个计数器,用于限制图片数量
	count := 0

	// 注册HTML回调函数,用于解析图片链接
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		// 获取链接地址
		link := e.Attr("href")
		// 过滤非图片链接
		if !strings.HasSuffix(link, ".jpg") && !strings.HasSuffix(link, ".png") {
			return
		}
		// 限制图片数量
		if count >= limit {
			return
		}
		// 访问图片链接
		c.Visit(link)
	})

	// 注册图片回调函数,用于下载图片
	c.OnResponse(func(r *colly.Response) {
		// 获取图片URL
		url := r.Request.URL.String()
		// 获取图片文件名
		filename := filepath.Base(url)
		// 创建输出文件夹(如果不存在)
		if _, err := os.Stat(output); os.IsNotExist(err) {
			os.Mkdir(output, 0755)
		}
		// 创建图片文件
		file, err := os.Create(filepath.Join(output, filename))
		if err != nil {
			log.Fatal(err)
		}
		defer file.Close()
		// 写入图片数据
		file.Write(r.Body)
		fmt.Printf("下载图片:%s\n", url)
		count++
	})

	c.OnError(func(r *colly.Response, err error) {
		fmt.Printf("请求失败:%s\n", r.Request.URL)
		fmt.Println(err)
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Printf("请求开始:%s\n", r.URL)
	})

	c.OnResponse(func(r *colly.Response) {
		fmt.Printf("请求完成:%s\n", r.Request.URL)
	})

	c.OnScraped(func(r *colly.Response) {
		fmt.Println("爬取结束")
	})

	fmt.Println("爬取开始")
	c.Visit(fmt.Sprintf("https://old.reddit.com/r/%s/%s/", subreddit, filter))
}

结语

本文介绍了如何使用Go语言和Colly库编写一个简单的爬虫程序,从Reddit网站上下载指定主题的图片,并保存到本地文件夹中。同时,我们还使用了亿牛云爬虫代理服务,通过动态切换代理IP来提高爬取效率和稳定性,希望本文对你有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

过关斩将法:验证输入的用户信息:

输入用户名、密码、邮箱、如果信息录入正确,则提示注册成功,否则生成异常: 要求: 用户名长度为2或3或4密码的长度为6,要求全是数字 提示:可以自行设计isDigital方法,否则排版则乱邮箱中包含和…

Steam余额红锁的原因,及红锁后申诉办法

安全的余额一般是通过充值卡充值获得,再加上交易手续费再转卖给你。一般便宜不到哪去。 但你别以为余额是安全的,就万事大吉了。照样有被红锁的可能性,比如这三种: 1、Steam市场巡查机制,红锁 平台的巡查机制和原理…

【PCIe Byte Enable】

PCIe Byte Enable 及与TPH关系 Byte Enable PCIe Byte Enable 在mem/IO/Cfg TLP中被应用并且在各种不同TLP中的没有区别,PCIe中Byte Enable与AXI中wstrb类似起到mask的作用,但是PCIe不支持request数据全部字节的mask,只支持数据头和尾部各一…

ASEMI解读KBL610整流桥的使用说明及操作指南

编辑-Z KBL610整流桥是一种功率电子元件,它在电力系统、电力电子设备中有着广泛的应用。然而,对于初次接触或者专业人士来说,明确使用说明和操作更是关键。那么,让我们一起来详解KBL610整流桥的使用说明及操作指南。 KBL610整流桥…

灾害与环境遥感团队本科生在IEEE TGRS 发表高水平论文

2023年9月27日,地球科学和遥感领域顶级期刊《IEEE Transactions on Geoscience and Remote Sensing》(IEEE TGRS)在线预刊发了灾害与环境遥感团队的最新研究成果“A novel spectral index for rapid dust-proof net mapping based on Sentine…

COLE HERSEE 48408 工业4.0、制造业X和元宇宙

COLE HERSEE 48408 工业4.0、制造业X和元宇宙 需要数据来释放工业4.0的全部潜力——价值链中的所有公司都可以访问大量数据。一个新的互联数据生态系统旨在提供解决方案:制造业x。 在德国联邦经济事务和气候行动部以及BDI、VDMA和ZVEI贸易协会的密切合作下,实施制…

性能测试之Mysql数据库调优

一、前言 性能调优前提:无监控不调优,对于mysql性能的监控前几天有文章提到过,有兴趣的朋友可以去看一下 二、Mysql性能指标及问题分析和定位 1、我们在监控图表中关注的性能指标大概有这么几个:CPU、内存、连接数、io读写时间…

一文了解多模态数字人

一、什么是多模态数字人 多模态数字人是一种通过多种传感器获取人体数据,使用计算机技术进行处理和分析,构建出具有多种感知和交互能力的虚拟人。多模态数字人可以通过视觉、听觉、触觉等多种感知方式与人类进行交互,具有高度的仿真度和个性…

Java基础20问(1-5)

1.Java面向对象和面试过程的区别? 面向过程是将一个问题拆解成几个步骤,依次实现每一个步骤,比如实现一个冒泡排序的算法,是为了解决某个非常具体的问题。 而面向对象也是将一个问题拆解成几个步骤,但是先不去实现&a…

华为云云耀云服务器L实例评测|企业项目最佳实践之评测用例(五)

华为云云耀云服务器L实例评测|企业项目最佳实践系列: 华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测|企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

B端设计的核心:助你成功的关键!

B端设计是指针对企业、组织、机构等机构客户的设计服务,通常称为“企业级设计”或“商业设计”,而不是针对消费者的C端设计。B端设计是一个旨在实现企业商业目标的设计过程,旨在满足企业客户的需求,帮助他们增强市场竞争力&#x…

python实现免疫算法,并绘制训练过程

免疫算法同遗传算法相似,不过子代是克隆出来的,而不是交叉,并且引入了抗体间亲和度的概念,算出抗体适应度之后,我们还需要减去抗体间亲和度,从而使得结果不容易陷入局部最优。 注意代码里的n是仅仅x的位数…

华为云云耀云服务器L实例评测|企业项目最佳实践之docker部署及应用(七)

华为云云耀云服务器L实例评测|企业项目最佳实践系列: 华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测|企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

注册大量短视频矩阵账号很简单,这个方法教会你,还有这个批量剪辑神器帮你完成矩阵分发

一个人一天就能注册上百个抖音实名账号,那么是如何做到的呢?其实很简单,只需要一个营业执照就能办到。 一个营业执照可以点亮两个蓝v号,每个蓝v账号可以注册50个员工账号。 员工账号和个人号的实名是不冲突的,所以之前…

关闭VS Code中的鼠标悬停时的提示框(MDN Reference)

在使用VS Code编辑器写html文件时,鼠标悬停在写的某些内容时会弹出一个提示框,如下图: 这个提示是比较烦人的,接下来分享关闭它的教程: 这里是以Win10版的Visual Studio Code为例 1.打开VS Code 的设置界面 2.在扩展…

历史上最愚蠢的代码

目录 1. 马赛勒航天飞机坠毁: ​2. 2000年问题(Y2K Bug): ​3. 阿里亚5号火箭爆炸: 4. Knight Capital Group的交易错误: 在编程历史上,有一些代码错误导致了严重的后果,可以被视…

旧手机热点机改造成服务器方案

如果你也跟我一样有这种想法, 那真的太酷了!!! ok,前提是得有root,不然体验大打折扣 目录 目录 1.做一个能爬墙能走百度直连的热点机(做热点机用) 2.做emby视频服务器 3.做文件服务, 存取文件 4.装青龙面板,跑一些定时任务 5.做远程摄像头监控 6.做web服务器 7.内网穿…

REF615 REU615 RED615 人工智能在工业中的第一步

REF615 REU615 RED615 人工智能在工业中的第一步 工业必须面对广泛的挑战:从气候变化和能源短缺到不稳定的供应链和技能短缺。成功应对这些挑战需要创新技术和明智的经济政策战略。 汉诺威工业博览会2023提供了两者:不仅是工业、立法者、学术界和社会代表之间交流的独特平台&a…