使用GoQuery实现头条新闻采集

news2024/10/5 22:24:14

亿牛云.png

概述

在本文中,我们将介绍如何使用Go语言和GoQuery库实现一个简单的爬虫程序,用于抓取头条新闻的网页内容。我们还将使用爬虫代理服务,提高爬虫程序的性能和安全性。我们将使用多线程技术,提高采集效率。最后,我们将展示爬虫程序的运行结果和代码。

正文

GoQuery简介

GoQuery是一个Go语言的库,用于解析和操作HTML文档。它提供了类似于jQuery的API,让我们可以方便地查询和处理网页元素。GoQuery可以从本地文件、字符串或者网络请求中加载HTML文档,并返回一个文档对象。我们可以使用选择器、过滤器、遍历器等方法来操作文档对象中的节点。GoQuery还支持链式调用,让我们可以编写更简洁和优雅的代码。

爬虫代理服务简介

爬虫代理服务是一个专业的代理IP服务商,提供高质量、高速度、高稳定性的代理IP资源。爬虫代理服务可以帮助我们隐藏真实的IP地址,避免被目标网站屏蔽或者限制。爬虫代理服务还提供了多种认证方式、多种协议支持、多种地域选择等功能,满足不同的爬虫需求。

多线程技术简介

多线程技术是一种编程技术,用于在同一时间执行多个任务。多线程技术可以提高程序的并发性和效率,特别是在处理网络请求等耗时操作时。Go语言提供了goroutine和channel等机制,让我们可以轻松地实现多线程编程。goroutine是一种轻量级的线程,可以在同一个进程中并发执行。channel是一种通信机制,可以在不同的goroutine之间传递数据。

头条新闻抓取流程

我们的目标是抓取头条新闻的网页内容,并提取出每条新闻的标题、链接、摘要、图片等信息。我们将使用Go语言和GoQuery库来实现这个功能。我们还将使用爬虫代理服务来获取代理IP,并使用多线程技术来提高采集效率。具体的流程如下:

  1. 从爬虫代理(亿牛云)服务获取代理IP地址、端口、用户名和密码。
  2. 使用代理IP地址和端口创建一个HTTP客户端。
  3. 使用HTTP客户端发送请求到头条新闻的首页。
  4. 使用GoQuery从响应中加载HTML文档,并返回一个文档对象。
  5. 使用选择器从文档对象中找到所有包含新闻信息的节点,并遍历每个节点。
  6. 从每个节点中提取出新闻的标题、链接、摘要、图片等信息,并保存到一个结构体中。
  7. 将结构体添加到一个切片中,作为最终的结果。
  8. 重复上述步骤,直到抓取完所有想要的新闻或者遇到错误。
  9. 打印或者输出最终的结果。

头条新闻抓取代码

以下是根据上述流程编写的代码示例,请注意,这个示例仅用于演示目的,您可能需要根据实际需求进行调整。在实际应用中,您应该考虑使用更复杂的代理服务器和更严格的安全设置。

package main

import (
	"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"

	// 构造代理请求的URL
	requestURL := 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&regions=", proxyHost, proxyPort, proxyUser)

	// 发送请求到代理服务
	resp, err := http.Get(requestURL)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	// 从响应中读取代理IP地址和端口
	var proxy string
	fmt.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 News
		news.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.WaitGroup
	var result []News
	var threadNum int = 10

	for 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)
	}
}

结语

总的来说,本文提供了一个起点,可以帮助您开始开发自己的爬虫程序,但请注意在实际应用中,需要考虑更复杂的爬虫策略和安全性措施,以确保程序的可靠性和合法性。希望本文对您在爬虫开发方面有所帮助。

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

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

相关文章

火锅食材店配送小程序商城的作用是什么

每个城市中都有大量火锅店、自助转转店&#xff0c;当然还包括个人在家中涮菜&#xff0c;其对火锅食材的需求量非常高&#xff0c;而在市场中也有很多专营店或超市经营&#xff0c;行业中也不乏头部品牌。 对火锅食材店来说&#xff0c;长期经营及生意好的因素除了食品新鲜质…

移动端之Unity嵌入Android项目开发

目录 前言1 搭建开发环境2 创建Unity项目 2.1 新建项目2.2 Unity构建配置2.3 Android环境相关配置2.4 导出Unity库文件3 创建Android项目 3.1 新建Android项目3.2 Android环境相关配置3.2 导入Unity相关的库3.3 Android中跳转到Unity视图4 进阶扩展 4.1 包体积优化 4.1.1 mono…

Babylonjs学习笔记(六)——贴图的使用

书接上回&#xff0c;这里讨论贴图的运用&#xff01;&#xff01;&#xff01; // 创建球网格const ball MeshBuilder.CreateSphere(ball,{diameter:1},scene)ball.position new Vector3(0,1,0)// 创建PRB材质const ballMat new PBRMaterial(pbr,scene)// albedoTexture 反…

通过实例理解Go Web身份认证的几种方式

在2023年Q1 Go官方用户调查报告[1]中&#xff0c;API/RPC services、Websites/web services都位于使用Go开发的应用类别的头部(如下图)&#xff1a; 我个人使用Go开发已很多年&#xff0c;但一直从事底层基础设施、分布式中间件等方向&#xff0c;Web应用开发领域涉及较少&…

14 结构性模式-适配器模式

1 适配器模式介绍 适配器模式(adapter pattern )的原始定义是&#xff1a;将类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。 2 适配器模式原理 3 适配器模式应用实例 /*** SD卡接口**/ public interface SDCard {//读取SD卡Strin…

【Docker】什么是Docker?看这一篇干货文章就够了!

目录 前言 容器技术的起源 容器技术 vs 虚拟机 什么是容器 什么是docker 如何使用docker docker的底层实现 总结 前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或…

斯德博STOBER伺服驱动器维修MDS5040A

STOBER斯德博驱动器常见故障维修如下&#xff1a; 当伺服驱动器给出移动指令而机床不移动&#xff0c;则伺服器维修故障原因可能是&#xff1a;机械传动卡住。如果故障发生在垂直轴控制时&#xff0c;则故障为伺服电动机的电磁制动回路。伺服电动机及动力线有断相故障或伺服电…

2024通信保研-电磁场电磁波复习

标量场的梯度的旋度恒等于0&#xff0c;旋度的散度等于0。 旋度&#xff1a; rot ⁡ F ( e x ∂ ∂ x e y ∂ ∂ y e z ∂ ∂ z ) ( e x F x e y F y e z F z ) e x ( ∂ F z ∂ y − ∂ F y ∂ z ) e y ( ∂ F x ∂ z − ∂ F z ∂ x ) e x ( ∂ F y ∂ x − ∂ F x …

『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程

『Jmeter入门万字长文』 | 从环境搭建、脚本设计、执行步骤到生成监控报告完整过程 1 Jmeter安装1.1 下载安装1.2 Jmeter汉化1.2.1 临时修改1.2.2 永久修改 1.3 验证环境 2 测试对象2.1 测试对象说明2.2 测试对象安装2.2.1 下载安装2.2.2 启动测试对象服务2.2.3 访问测试对象2.…

JAVA 版多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C产品概述 商城免费搭建

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

美团圈圈私域社群app拉新怎么做,申请推广渠道

首先说下美团私域社群app拉新申请渠道&#xff0c;可以通过“聚量推客”进行申请聚量推客首码邀请&#xff1a;000000 1、流程&#xff1a;用户点击活动专属链接进入扫码进群页面&#xff0c;长按二维码进入美团圈 圈多重福利群&#xff0c;用户首次进群且保持 10 天不退群即符…

地方门户系统源码 同城信息系统源码 家政外卖跑腿同城信息门户源码

地方门户系统源码 同城信息系统源码 家政外卖跑腿同城信息门户源码 系统介绍&#xff1a; 一&#xff1a;系统 后台设置:菜单列表 管理员管理:角色管理,操作日志,禁止访问IP段列表,管理员登录日志 二&#xff1a;设置 基础设置&#xff1a;站点设置&#xff0c;附件设置&a…

转岗项目经理后,我是如何分析需求的

项目经理有一项工作就是需求分析&#xff0c;需求的本质是根据认知进行假设&#xff0c;然后给出判断。如果需求分析的结果出了问题&#xff0c;那么产品也必然会失败。本文针对如何进行需求分析展开分析&#xff0c;希望能对你有所启发。 一、什么是需求 为什么要明确需求的…

笔记本触摸板怎么开?教你5个实用方法!

“新买了一个笔记本&#xff0c;但是触摸板一直无法打开&#xff0c;应该怎么进行操作呢&#xff1f;有什么方法可以打开笔记本触摸板吗&#xff1f;” 为了方便办公和使用笔记本&#xff0c;笔记本电脑上通常都会有一个触摸板。我们可以用它代替鼠标&#xff0c;更好地进行操作…

可视化沟通解析

如果我们去吃饭看到如下菜单 我想对于当事人而言&#xff0c;这个绝对不是点菜吃饭&#xff0c;而是一场韩语考试。 但是我们看到如下这个菜单会怎么样 如果我们看到这种菜单&#xff0c;即使我们不知道菜的名字我们也能很快的做出我们想要的选择&#xff0c;那样得到的菜不会…

JVM进阶(2)

一)方法区: java虚拟机中有一个方法区&#xff0c;该区域被所有的java线程都是共享&#xff0c;虚拟机一启动&#xff0c;运行时数据区就被开辟好了&#xff0c;官网上说了方法区可以不压缩还可以不进行GC&#xff0c;JAVA虚拟机就相当于是接口&#xff0c;具体的HotSpot就是虚…

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …

STM32MP157D BSP

一&#xff0c;全志R16、IMX6ULL和STM32MP157D启动相关 1&#xff0c;IMX6ULL是EMMC启动后&#xff0c;通过uboot fat命令的load进内存进行启动测试 2&#xff0c;openedv应该也是参考的官方的板子&#xff0c;类似调试口等均应该是一致的&#xff0c;所以目前就是用正点原子…

网络扫描与网络监听

前言&#xff1a;前文给大家介绍了网络安全相关方面的基础知识体系&#xff0c;以及什么是黑客&#xff0c;本篇文章笔者就给大家带来“黑客攻击五部曲”中的网络扫描和网络监听 目录 黑客攻击五部曲 网络扫描 按扫描策略分类 按照扫描方式分类 被动式策略 系统用户扫描 …

干货满满,上传多个文件秒变微信翻页电子书

亲们&#xff0c;你们还在为找不到好的制作电子书网站烦恼吗&#xff1f;今天给大家分享一个超级实用的神器&#xff01; 这个神器就是——FLBOOK在线制作电子杂志平台&#xff01;如果你有排版好的电子文档&#xff0c;就能一键上传多个文件秒变微信翻页电子书&#xff0c;是不…