【Go程序】爬虫获取豆瓣Top250

news/2024/9/25 21:25:07/

        之前在网上下载了一个minigame的开源项目,就是电影日历。里面有一项使用了豆瓣的API,获取豆瓣的Top250的电影。但是由于豆瓣的OpenAPI改版了,又不好申请到OpenAPI的资格,想想也不是什么非法的事情,就稍微搞几部电影名字嘛。

        一般来讲,我们经常用Python写爬虫来解析数据,主要是因为request库和beautifulsoup4库过于好用了点,每次都会忘记怎么用,每次看个例子又能用起来了。今天想想要不用Go来实现把,毕竟现在的程序用go写起来也很顺手了。

        这里需要用到一个库,goquery,功能和bs4一样,用于解析获取到的xml,然后net/http方法用于替代python的request库。动手把。

package mainimport ("fmt""log""math/rand""net/http""time""github.com/PuerkitoBio/goquery"
)// randomUserAgent 返回一个随机的 User-Agent 字符串
func randomUserAgent() string {userAgents := []string{"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:89.0) Gecko/20100101 Firefox/89.0",}rand.Seed(time.Now().UnixNano())return userAgents[rand.Intn(len(userAgents))]
}func fetch(url string) (*goquery.Document, error) {req, err := http.NewRequest("GET", url, nil)if err != nil {return nil, err}userAgent := randomUserAgent()req.Header.Set("User-Agent", userAgent)client := &http.Client{}resp, err := client.Do(req)if err != nil {return nil, err}if resp.StatusCode != http.StatusOK {return nil, fmt.Errorf("request failed with status code: %d", resp.StatusCode)}defer resp.Body.Close()doc, err := goquery.NewDocumentFromReader(resp.Body)if err != nil {return nil, err}return doc, nil
}func main() {baseURL := "https://movie.douban.com/top250"for page := 1; page <= 10; page++ { // 假设每页25部电影,共10页url := fmt.Sprintf("%s?start=%d&filter=", baseURL, (page-1)*25)doc, err := fetch(url)if err != nil {log.Fatal(err)}doc.Find(".item").Each(func(i int, s *goquery.Selection) {title := s.Find(".title").First().Text()rating := s.Find(".rating_num").First().Text()votes := s.Find(".star .pl").First().Prev().Text()fmt.Printf("Movie %d: %s, Rating: %s, Votes: %s\n", i+(page-1)*25+1, title, rating, votes)})}
}

得到结果如下

Movie 1: 肖申克的救赎, Rating: 9.7, Votes: 
Movie 2: 霸王别姬, Rating: 9.6, Votes: 
Movie 3: 阿甘正传, Rating: 9.5, Votes: 
Movie 4: 泰坦尼克号, Rating: 9.5, Votes: 
Movie 5: 千与千寻, Rating: 9.4, Votes: 
Movie 6: 这个杀手不太冷, Rating: 9.4, Votes: 
Movie 7: 美丽人生, Rating: 9.5, Votes: 
…………

我们对代码解释一下:

这段 Go 代码是一个简单的网页爬虫,用于抓取豆瓣电影 Top 250 列表中的电影标题、评分和投票数。下面是代码的详细解释:
1. 导入包:
        main:主包。
        fmt, log, math/rand, net/http, time:标准库包,分别用于格式化输出、日志记录、生成随机数、处理 HTTP 请求和时间操作。
        "github.com/PuerkitoBio/goquery":一个用于解析 HTML 文档的第三方库。
2. randomUserAgent 函数:
        定义了一个字符串切片 userAgents,其中包含了多个不同的 User-Agent 字符串。
        使用 rand.Seed(time.Now().UnixNano()) 初始化随机数生成器。
        函数返回 userAgents 切片中的一个随机元素作为 User-Agent。
3. fetch 函数:

  • 创建一个新的 HTTP GET 请求。
  • 设置请求头的 User-Agent 字段为一个随机值。
  • 使用 http.Client 发送请求并获取响应。
  • 检查 HTTP 响应状态码,如果不是 http.StatusOK(即 200 OK),则返回错误。
  • 使用 goquery.NewDocumentFromReader 从响应体创建一个 goquery.Document 对象。
  • 返回文档对象或错误。

4. main 函数:

  • 定义了豆瓣电影 Top 250 的基础 URL。
  • 循环遍历 10 页(假设每页有 25 部电影)。
  • 构造每一页的完整 URL。
  • 调用 fetch 函数获取页面的 goquery.Document。
  • 使用 doc.Find(".item") 查找所有具有类 .item 的元素,这些元素代表单个电影条目。
  • 对于每个找到的电影条目,提取标题、评分和投票数。
  • 打印提取的信息。

代码中使用了 goquery 库来解析和选择 HTML 元素,以及 log.Fatal 来记录并终止程序在遇到错误时的运行。


http://www.ppmy.cn/news/1499701.html

相关文章

大数据技术--实验03-HBase的安装与使用【实测可行】

1. 配置Vmware虚拟机 参考第2章的配置&#xff0c;配置好虚拟机。 虚拟机配置好后&#xff0c;配置Hbase参考下表的服务分配来配置HBase。 机器名 主节点 ZooKeeper RegionServer master 是 是 否 slave1 备份 是 是 slave2 否 是 是 2. 下载并配置HBase 在…

pytest使用

主要技术内容 1.pytest设计 接口测试 框架设想 common—公共的东西封装 1.request请求 2.Session 3.断言 4.Log 5.全局变量 6.shell命令 ❖ config---配置文件及读取 ❖ Log— ❖ payload—请求参数—*.yaml及读取 ❖ testcases—conftest.py; testcase1.py…….可…

网络学习|Localhost 与 127.0.0.1 的区别

文章目录 1. 名称与IP地址Localhost127.0.0.1 2. DNS解析Localhost127.0.0.1 3. 配置文件Localhost127.0.0.1 4. 使用场景Localhost127.0.0.1 总结 在计算机网络中&#xff0c;“localhost”和“127.0.0.1”常被认为是等价的&#xff0c;它们都指向本地计算机。然而&#xff0c…

Idea如何查看Maven依赖树

1、使用idea自带的功能查看依赖树 2、使用Maven Helper插件 https://zhuanlan.zhihu.com/p/699663369

GraphRAG深入解析

GraphRAG深入解析 GraphRAG 深入解析概述索引查询 索引过程深入解析步骤 1&#xff1a;处理文本块步骤 2&#xff1a;图提取步骤 3&#xff1a;图增强步骤 4&#xff1a;社区总结步骤 5&#xff1a;文件处理步骤 6&#xff1a;网络可视化 查询过程深入解析本地搜索问题生成全局…

企元数智引领新零售合规分销系统免费送

企元数智近日宣布推出全新的新零售合规分销系统&#xff0c;并免费向企业提供这一创新解决方案。这一举措旨在帮助更多企业实现数字化转型&#xff0c;提高管理效率&#xff0c;促进业务增长。 新零售合规分销系统是企元数智引领的一项全新数字解决方案&#xff0c;涵盖了销售数…

Linux——组管理和权限管理

目录 组管理 Linux 组基本介绍 文件/目录所有者 组的创建 查看&修改文件/目录所在组 改变用户所在组 权限管理 基本介绍 rwx 文件/目录权限详解 chmod 修改文件或目录权限 chown 修改文件所有者 组管理 Linux 组基本介绍 关于第二张图中问题&#xff0c;答案…

git面面观,面试题,常见问题

1. 简述什么是Git &#xff1f; Git是一款分布式源代码管理工具(版本控制工具) 。 Git得其数据更像是一系列微型文件系统的快照。使用Git&#xff0c;每次提交或保存项目状态时&#xff0c;Git基本上都会记录当时所有文件的外观&#xff0c;并存储对该快照的引用。为了提高效…