使用GoQuery实现头条新闻采集

概述
在本文中,我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序,用于抓取头条新闻的网页内容。我们还将使用爬虫代理服务,提高爬虫程序的性能和安全性。我们将使用多线程技术,提高采集效率。最后,我们将展示爬虫程序的运行结果和代码。
正文
GoQuery简介
GoQuery是一个Go语言的库,用于解析和操作HTML文档。它提供了类似于jQuery的API,让我们可以方便地查询和处理网页元素。GoQuery可以从本地文件、字符串或者网络请求中加载HTML文档,并返回一个文档对象。我们可以使用选择器、过滤器、遍历器等方法来操作文档对象中的节点。GoQuery还支持链式调用,让我们可以编写更简洁和优雅的代码。
爬虫代理服务简介
爬虫代理服务是一个专业的代理IP服务商,提供高质量、高速度、高稳定性的代理IP资源。爬虫代理服务可以帮助我们隐藏真实的IP地址,避免被目标网站屏蔽或者限制。爬虫代理服务还提供了多种认证方式、多种协议支持、多种地域选择等功能,满足不同的爬虫需求。
多线程技术简介
多线程技术是一种编程技术,用于在同一时间执行多个任务。多线程技术可以提高程序的并发性和效率,特别是在处理网络请求等耗时操作时。Go语言提供了goroutine和channel等机制,让我们可以轻松地实现多线程编程。goroutine是一种轻量级的线程,可以在同一个进程中并发执行。channel是一种通信机制,可以在不同的goroutine之间传递数据。
头条新闻抓取流程
我们的目标是抓取头条新闻的网页内容,并提取出每条新闻的标题、链接、摘要、图片等信息。我们将使用Go语言和GoQuery库来实现这个功能。我们还将使用爬虫代理服务来获取代理IP,并使用多线程技术来提高采集效率。具体的流程如下:
- 从爬虫代理(亿牛云)服务获取代理IP地址、端口、用户名和密码。
- 使用代理IP地址和端口创建一个HTTP客户端。
- 使用HTTP客户端发送请求到头条新闻的首页。
- 使用GoQuery从响应中加载HTML文档,并返回一个文档对象。
- 使用选择器从文档对象中找到所有包含新闻信息的节点,并遍历每个节点。
- 从每个节点中提取出新闻的标题、链接、摘要、图片等信息,并保存到一个结构体中。
- 将结构体添加到一个切片中,作为最终的结果。
- 重复上述步骤,直到抓取完所有想要的新闻或者遇到错误。
- 打印或者输出最终的结果。
头条新闻抓取代码
以下是根据上述流程编写的代码示例,请注意,这个示例仅用于演示目的,您可能需要根据实际需求进行调整。在实际应用中,您应该考虑使用更复杂的代理服务器和更严格的安全设置。
package mainimport ("fmt""log""net/http""net/url""sync""github.com/PuerkitoBio/goquery"
)// News 结构体用于存储新闻信息
type News struct {Title string // 新闻标题Link string // 新闻链接Summary string // 新闻摘要Image string // 新闻图片
}// getProxy 函数用于从代理服务获取代理IP地址和端口
func getProxy() (string, error) {// 使用亿牛云爬虫代理 设置代理IP的域名、端口、用户名和密码proxyHost := "www.16yun.cn"proxyPort := "8100"proxyUser := "16XXXX"proxyPass := "IPXXXX"// 构造代理请求的URLrequestURL := fmt.Sprintf("http://%s:%s/getip?num=1&type=1&pro=&city=0&yys=0&port=11&pack=%s&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1®ions=", proxyHost, proxyPort, proxyUser)// 发送请求到代理服务resp, err := http.Get(requestURL)if err != nil {return "", err}defer resp.Body.Close()// 从响应中读取代理IP地址和端口var proxy stringfmt.Fscanf(resp.Body, "%s", &proxy)return proxy, nil
}// getNews 函数用于抓取新闻信息
func getNews(proxy string, wg *sync.WaitGroup, result *[]News) {defer wg.Done()// 使用代理IP地址创建HTTP客户端client := &http.Client{Transport: &http.Transport{Proxy: func(req *http.Request) (*url.URL, error) {return url.Parse("http://" + proxy)},},}// 发送请求到头条新闻首页resp, err := client.Get("https://www.toutiao.com/")if err != nil {log.Println(err)return}defer resp.Body.Close()// 解析HTML文档doc, err := goquery.NewDocumentFromReader(resp.Body)if err != nil {log.Println(err)return}// 查找新闻信息节点并遍历doc.Find(".single-mode-rbox").Each(func(i int, s *goquery.Selection) {var news Newsnews.Title = s.Find(".title-box a").Text()news.Link, _ = s.Find(".title-box a").Attr("href")news.Summary = s.Find(".abstract").Text()news.Image, _ = s.Find(".img-wrap img").Attr("src")fmt.Println(news)*result = append(*result, news)})
}func main() {var wg sync.WaitGroupvar result []Newsvar threadNum int = 10for i := 0; i < threadNum; i++ {wg.Add(1)proxy, err := getProxy()if err != nil {log.Println("无法获取代理:", err)} else {go getNews(proxy, &wg, &result)}}wg.Wait()fmt.Println("抓取到的新闻:")for i, news := range result {fmt.Printf("新闻 %d:\n", i+1)fmt.Printf("标题: %s\n", news.Title)fmt.Printf("链接: %s\n", news.Link)fmt.Printf("摘要: %s\n", news.Summary)fmt.Printf("图片: %s\n", news.Image)}
}
结语
总的来说,本文提供了一个起点,可以帮助您开始开发自己的爬虫程序,但请注意在实际应用中,需要考虑更复杂的爬虫策略和安全性措施,以确保程序的可靠性和合法性。希望本文对您在爬虫开发方面有所帮助。
相关文章:
使用GoQuery实现头条新闻采集
概述 在本文中,我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序,用于抓取头条新闻的网页内容。我们还将使用爬虫代理服务,提高爬虫程序的性能和安全性。我们将使用多线程技术,提高采集效率。最后,我们将展…...
“一带一路”十周年:用英语讲好中华传统故事
图为周明霏小选手 2023年是“一带一路”倡议提出十周年。十年来,中国的“友谊圈”已经扩展到亚洲、非洲、欧洲、大洋洲和拉丁美洲,这一倡议已经成为提升我国文化软实力、传播中华传统文化的重要策略和途径之一。在这个广阔的交流平台上,使用…...
机器视觉兄弟们还有几个月就拿到年终奖了,但我想跑路了
大聪明的我一般会把年终奖拿了,再走。听说有人还没有年终奖,太伤心了,赶紧跑吧。注意,机器视觉小白不要轻举妄动。 今年太难了,真的是让人很难过,很不爽,很不舒服。 公司难,机器视…...
base_lcoal_planner的LocalPlannerUtil类中getLocalPlan函数详解
本文主要介绍base_lcoal_planner功能包中LocalPlannerUtil类的getLocalPlan函数,以及其调用的transformGlobalPlan函数、prunePlan函数的相关内容 一、getLocalPlan函数 getLocalPlan函数的源码如下: bool LocalPlannerUtil::getLocalPlan(const geomet…...
elasticSearch put全局更新和单个字段更新语法
1、如下:更新改类型未doc(文档)的全局字段数据 注意:如果你使用的是上面的语句,但是只写了id和title并赋值,图片上其他字段没有填写,执行命令后,则会把原文档中的其他字段都给删除了,你会发现查…...
记录一次时序数据库的实战测试
0x1.前言 本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台。 0x2.背景 在某…...
HTML中文本框\单选框\按钮\多选框
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <h1>登录注册</h1> <form action"第一个网页.html" method"post&quo…...
解释器模式——化繁为简的翻译机
● 解释器模式介绍 解释器模式(Interpreter Pattern)是一种用的比较少的行为型模式,其提供了一种解释语言的语法或表达的方式,该模式定义了一个表达式接口,通过该接口解释一个特定的上下文。在这么多的设计模式中&…...
【凡人修仙传】定档,四女神出场,韩立遭极阴岛陷阱,蛮胡子亮相
【侵权联系删除】【文/郑尔巴金】 距离凡人修仙传动画星海飞驰序章完结,已经过去了两个月的时间,相信大家等待的心情相当难熬,而且也愈发期待韩立结丹后在乱星海发生的故事。按照官方当初立下的FLAG,新年番动画即将在金秋十一月上…...
【解决】设置pip安装依赖包路径默认路径在conda路径下,而不是C盘路径下
【解决】设置pip安装依赖包路径默认路径在conda路径下,而不是C盘路径下 问题描述 在win11下安装miniconda,在conda环境里使用pip安装,依赖包总是安装到C盘路径,如 C:\Users\Jimmy\AppData\Local\Programs\Python\Python311\Lib\…...
JoySSL-新兴国产品牌数字证书
随着我国对数据安全重视程度的不断提升,国产SSL证书越来越受到广大政府机关和企业的青睐,成为提升网站数据安全能力的重要技术手段。那么什么是国产SSL证书?国产SSL证书和普通SSL证书又有什么区别呢? 什么是国产SSL证书ÿ…...
kafka3.X基本概念和使用
kafka基本概念和使用 文章目录 kafka基本概念和使用 kafka的概念基本概念Kafka的使用 首先kafka的安装kafka的简单实用和理解搭建集群(3个节点)windows版本环境搭建 本文"kafka的概念"部分是在[初谈Kafka][ https://juejin.im/post/5a8e7f…...
用低代码平台代替Excel搭建进销存管理系统
目录 一、用低代码平台搭建系统 1.需求调研 2.基于痛点梳理业务流程 3.低代码实现 (1)基础资料模块 (2)采购管理模块 (3)销售管理模块 (4)库存管理模块 (5&…...
Redis和Memcached网络模型详解
1. Redis单线程单Reactor网络模型 1.1 redis单线程里不能执行十分耗时的流程,不然会客户端响应不及时 解决方法一: beforesleep里删除过期键操作若存在大量过期键时,会耗费大量时间,redis采用的策略之一就是采用timelimit方案超过…...
二叉搜索树的实现(递归方式)
目录 实现思路 插入操作 删除操作 完整代码 测试案例 总结 二叉搜索树(Binary Search Tree,BST)是一种常用的数据结构,它具有以下特点: 左子树上所有节点的值均小于它的根节点的值右子树上所有节点的值均大于它的…...
NetCore IIS Redis JMeter 登录压力测试
近期,由于某项目验收需要,需要登录接口同时满足至少400个账号同时并发登录,于是开始编写测试代码,以满足项目业务需要。首先,安装jdk,由于本机已安装jdk8: 如果你机器上没有安装jdk,…...
进一步了解视频美颜SDK:美颜SDK的技术原理
美颜技术在当今的数字世界中变得越来越流行,尤其是在视频直播、社交媒体和视频通话应用中。用户寻求通过美颜效果增强自己的外观,这种需求催生了众多美颜SDK(软件开发工具包)的出现。这些SDK使开发者能够轻松地将美颜功能集成到他…...
【Qt之QSetting】介绍及使用
概述 QSettings类提供了一种持久的、与平台无关的应用程序设置存储功能。 用户通常期望一个应用能在不同会话中记住其设置(窗口大小和位置,选项等)。在Windows上,这些信息通常存储在系统注册表中;在macOS和iOS上&…...
基于WebRTC构建的程序因虚拟内存不足导致闪退问题的排查以及解决办法的探究
目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上,没有感知到异常或中断 3.2、Windbg感知到了中断,中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …...
通过jdk自制https证书并配置到nginx并配置http2
生成证书 这里使用自己生成的免费证书。在${JAVA_HOME}/bin 下可以看到keytool.exe,在改目录打开cmd然后输入: keytool -genkey -v -alias lgq.com -keyalg RSA -keystore d:/zj/ssl/fastfly.com.keystore -validity 3650生成证书过程中:【你的名字】对…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
