使用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生成证书过程中:【你的名字】对…...
freertos 搭建系统框架
1.freertos官网:FreeRTOS™ - FreeRTOS™ ,下载对应的freertos源码 2.freertos目录结构: FreeRTOS-Kernel/ ├── include/ # 内核公共头文件 ├── portable/ # 移植层(编译器/架构相关代…...
OpenClaw人人养虾:接入iMessage
此方案为旧版 iMessage 接入方式,仅适用于 macOS 且配置复杂。新用户请优先使用 BlueBubbles 方案,它更稳定且功能更丰富。 前置要求 macOS 12 Monterey 或更高版本(仅支持 macOS)已登录 Apple ID 并激活 iMessageHomebrew 包管…...
统信系统下如何管理Mysql?
背景 看到标题很多朋友会打趣的问我:“你不是一直用麒麟操作系统做讲解吗?”,其实DBCS和DESK的兼容性太强了,什么操作系统都行,Windows上最容易了,所以我一般不用Windows,下次我用Ubuntu给大家…...
TAICHI-flet终极排障指南:从新手到高手的完整解决方案
TAICHI-flet终极排障指南:从新手到高手的完整解决方案 【免费下载链接】TAICHI-flet 基于flet的一款windows桌面应用,实现了浏览图片、音乐、小说、漫画、各种资源的功能。 项目地址: https://gitcode.com/GitHub_Trending/ta/TAICHI-flet TAICHI…...
Ubuntu16.04下MINIGUI 3.2.0环境搭建避坑指南:从依赖安装到HelloWorld运行
Ubuntu 16.04下MINIGUI 3.2.0环境搭建全流程与深度优化指南 为什么选择MINIGUI与Ubuntu 16.04的组合 MINIGUI作为国内自主研发的轻量级GUI系统,在嵌入式领域已有二十余年的技术沉淀。3.2.0版本在保持轻量级特性的同时,增强了对现代嵌入式设备的支持。而U…...
Vue 3 响应式系统的解构艺术:深入剖析 toRef 与 toRefs
Vue 3 响应式系统的解构艺术:深入剖析 toRef 与 toRefs 在 Vue 3 的 Composition API 中,响应式系统是其核心魅力之一。ref 和 reactive 为我们提供了强大的数据响应能力,但在实际开发中,尤其是在复杂的组件逻辑和组合式函数&…...
如何突破数据标注瓶颈?Label Studio全攻略:从多模态标注到AI协作
如何突破数据标注瓶颈?Label Studio全攻略:从多模态标注到AI协作 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/l…...
打工人必看!电脑突然罢工?阳光电脑维修上门服务救我于水火[特殊字符]
作为每天靠电脑办公的打工人,最崩溃的事情莫过于——电脑突然罢工,而手里还有紧急工作要赶!前几天晚上加班,台式机突然黑屏,按开机键没反应,键盘鼠标也没亮,急得我差点哭出来,第二天…...
校园网免认证上网?手把手教你用UDP53端口搭建自己的“网络后门”(附服务器配置)
校园网络优化:UDP53端口的高效应用实践 校园网络作为师生日常学习生活的重要基础设施,其稳定性和访问效率直接影响着教学科研活动的开展。本文将深入探讨一种基于UDP53端口的网络优化方案,帮助技术爱好者理解并实现更流畅的网络体验。 1. 校园…...
5步掌握抖音音乐批量下载:douyin-downloader高效使用指南
5步掌握抖音音乐批量下载:douyin-downloader高效使用指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作的浪潮中,背景音乐已成为视频作品的灵魂元素。然而࿰…...
