使用GoQuery实现头条新闻采集

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 在本文中,我们将介绍如何使用Go语言和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&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)
    }
}

结语

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

相关文章
|
存储 弹性计算 Linux
阿里云服务器实例规格CPU内存带宽系统盘等配置选择注意事项
在购买阿里云服务器时,实例规格、CPU、内存、带宽和系统盘等配置都是重要的,合理选择这些配置不仅能够更好地满足我们的需求,提高服务器的性能和稳定性。同时还能尽可能的节约购买成本,本文将对阿里云服务器实例规格CPU内存带宽系统盘等配置选项进行详细解释,并提供一些选择建议及注意事项,以供参考。
1308 0
阿里云服务器实例规格CPU内存带宽系统盘等配置选择注意事项
|
5月前
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
311 23
|
XML 小程序 前端开发
小程序制作教程
小程序制作教程
744 3
小程序制作教程
|
7月前
|
机器学习/深度学习 运维 自然语言处理
深度学习+实时监控:运维不再靠“拍脑袋”!
深度学习+实时监控:运维不再靠“拍脑袋”!
267 3
|
存储 监控 安全
构建高效的个人知识管理系统:技术与实践
【10月更文挑战第5天】在信息爆炸的时代,个人知识管理变得至关重要。本文将介绍如何利用现代技术手段,尤其是开源工具和云服务,构建一个高效的个人知识管理系统。我们将探索不同的知识组织方法,自动化信息的收集与整理流程,以及确保信息安全的策略。通过实际案例和代码示例,本文旨在为读者提供一套可行的解决方案,帮助他们更好地管理个人知识库,提升学习和工作效率。
281 2
|
数据采集 存储 数据挖掘
Python网络爬虫实战:抓取并分析网页数据
使用Python的`requests`和`BeautifulSoup`,本文演示了一个简单的网络爬虫,抓取天气网站数据并进行分析。步骤包括发送HTTP请求获取HTML,解析HTML提取温度和湿度信息,以及计算平均温度。注意事项涉及遵守robots.txt、控制请求频率及处理动态内容。此基础爬虫展示了数据自动收集和初步分析的基础流程。【6月更文挑战第14天】
918 9
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的在线问卷调查系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的在线问卷调查系统的详细设计和实现
412 1
|
传感器 数据采集 网络协议
【MODBUS】Modbus是什么?
【MODBUS】Modbus是什么?
438 1
|
Ubuntu 开发工具 数据安全/隐私保护
C++项目实战-环境的搭建
C++项目实战-环境的搭建
255 0
|
数据采集 Web App开发 存储
如何使用Puppeteer进行新闻网站数据抓取和聚合
数据抓取是指从网页中提取所需的数据,如标题、正文、图片、链接等。数据聚合是指将多个来源的数据整合在一起,形成一个统一的视图或报告。数据抓取和聚合是爬虫技术的常见应用场景,它可以帮助我们获取最新的信息,分析舆情,发现趋势等。
590 0