• 使用GoQuery实现头条新闻采集


    亿牛云.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®ions=", 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)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113

    结语

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

  • 相关阅读:
    阿里p9架构专家总结的(OracleRAG:集群+高可用性+备份与恢复)看完就一个字“牛”
    用核心AI资产打造稀缺电竞体验,顺网灵悉背后有一盘大棋
    京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜
    盐湖提锂膜后除硼工艺
    如何设计秒杀系统?双11秒杀架构详解(5大方案)
    #力扣:771. 宝石与石头@FDDLC
    c++ Primer 第七章:类 练习答案记录
    CSDN 五一创作勋章Lv4 勋章_(标签-ar)
    Unity 动画系统基本概念
    SpringCloud Gateway—高并发场景微服务实战(十三)
  • 原文地址:https://blog.csdn.net/ip16yun/article/details/134058221