Colly实现豆瓣电影Top250爬取

使用 Colly 实现 豆瓣电影Top250爬取

package mainimport ("encoding/csv""github.com/PuerkitoBio/goquery""github.com/gocolly/colly""log""os""strings""time"
)type Movie struct {idx    stringtitle  stringyear   stringinfo   stringrating stringurl    string
}func main() {// 存储文件名fName := "douban_movie_top250.csv"file, err := os.Create(fName)if err != nil {log.Fatalf("创建文件失败 %q: %s\n", fName, err)return}defer file.Close()writer := csv.NewWriter(file)defer writer.Flush()// 写CSV头部writer.Write([]string{"Idx", "Title", "Year", "Info", "Rating", "URL"})// 起始UrlstartUrl := "https://movie.douban.com/top250"// 创建Collectorcollector := colly.NewCollector(// 设置用户代理colly.UserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"),)// 设置抓取频率限制collector.Limit(&colly.LimitRule{DomainGlob:  "*",RandomDelay: 5 * time.Second, // 随机延迟})// 异常处理collector.OnError(func(response *colly.Response, err error) {log.Println(err.Error())})collector.OnRequest(func(request *colly.Request) {log.Println("start visit: ", request.URL.String())})// 解析列表collector.OnHTML("ol.grid_view", func(element *colly.HTMLElement) {// 依次遍历所有的li节点element.DOM.Find("li").Each(func(i int, selection *goquery.Selection) {href, found := selection.Find("div.hd > a").Attr("href")// 如果找到了详情页,则继续下一步的处理if found {parseDetail(collector, href, writer)log.Println(href)}})})// 查找下一页collector.OnHTML("div.paginator > span.next", func(element *colly.HTMLElement) {href, found := element.DOM.Find("a").Attr("href")// 如果有下一页,则继续访问if found {element.Request.Visit(element.Request.AbsoluteURL(href))}})// 起始入口collector.Visit(startUrl)
}/*** 处理详情页*/
func parseDetail(collector *colly.Collector, url string, writer *csv.Writer) {collector = collector.Clone()collector.Limit(&colly.LimitRule{DomainGlob:  "*",RandomDelay: 2 * time.Second,})collector.OnRequest(func(request *colly.Request) {log.Println("start visit: ", request.URL.String())})// 解析详情页数据collector.OnHTML("body", func(element *colly.HTMLElement) {selection := element.DOM.Find("div#content")idx := selection.Find("div.top250 > span.top250-no").Text()title := selection.Find("h1 > span").First().Text()year := selection.Find("h1 > span.year").Text()info := selection.Find("div#info").Text()info = strings.ReplaceAll(info, " ", "")info = strings.ReplaceAll(info, "\n", "; ")rating := selection.Find("strong.rating_num").Text()movie := Movie{idx:    idx,title:  title,year:   year,info:   info,rating: rating,url:    element.Request.URL.String(),}writer.Write([]string{idx,title,year,info,rating,element.Request.URL.String(),})log.Printf("%+v", movie)})collector.Visit(url)
}

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

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

相关文章

homework1

一.什么是RUP?二.什么是XP?三.什么是敏捷过程? 一。什么是RUP?RUP是一种完整而且完美的软件过程 1。最佳实践 (1)迭代式开发 (2)管理需求 (3)使用基于构件软件的体系结构 (4&…

编程:休息片刻的好处

原文作者 Axel Rauschmayer 是一位居住在德国慕尼黑的自由软件工程师。他在这篇博文列举了在编程期间休息片刻的一些好处。 你会更精明而不是更卖力地工作。我曾经为了一个功能的实现而卖力工作过。每天12小时,整整工作了两个星期。我付出了很多努力。那两个星期之…

五个温度带的分界线_女神建筑师在拿破仑故乡打造的海景别墅,超美!超有温度!【环球设计2225期】...

生活的温度 法国建筑师阿米莉亚塔维拉(Amelia Tavella)一直对设计充满热情,她出生在阿雅克肖市,在巴黎的建筑学院学习建筑专业,如今她居住普罗旺斯地区的艾克斯。她说:“设计让我涉足很多有趣的领域并能充分发挥我的想象力。这是一…

1118. Birds in Forest (25)

并查集。。。要用路径压缩&#xff0c;不然会超时&#xff0c; #include<iostream> #include<string> #include<map> #include<vector> #include<algorithm> #include<queue> #include<set> #include<stack> using namespace …

Java线程池有哪些作用

线程池 线程池的作用 核心点:复用机制提前创建好固定的线程一直在运行状态实现复用限制线程创建数量。 1.降低资源消耗:通过池化技术重复利用已创建的线程&#xff0c;降低线程创建和销毁造成的损耗。 2.提高响应速度:任务到达时&#xff0c;无需等待线程创建即可立即执行。…

中国重名的市辖区

中国重名的市辖区 截止2016年7月31日 新华区(3) 河北省石家庄市新华区 河北省沧州市新华区 河南省平顶山市新华区 桥西区(3) 河北省石家庄市桥西区 河北省邢台市桥西区 河北省张家口市桥西区 海州区(2) 辽宁省阜新市海州区 江苏省连云港市海州区 郊区(4) 山西省阳泉市郊区 山西…

安卓关于图片压缩的那些事儿,希望给每个安卓开发人员一些帮助

从事安卓开发也有几年了,本人喜欢开门见山,此篇文章是处理以java语言下的安卓开发过程中图片压缩问题。 图片加载在我们的开发过程中都是一个内存大户,以至于我们加载每一个图片bitmap对象的时候都应该进行回收以减少内存的占用&#xff0c;而如果单张图片的大小加载在内存都会…

银行it现状调研_中央银行系统行业现状调研分析及发展趋势预测报告(2019年版)...

QYResearch预测&#xff1a;2019-2025全球与中国中央银行系统市场现状及未来发展趋势【纸版价格】&#xff1a;RMB 15000【电子版(PDF)价格】&#xff1a;RMB 15000【报告篇幅】&#xff1a;112【报告图表数】&#xff1a;158【报告出版时间】&#xff1a;2019年11月报告摘要本…

视频编解码技术小结

1、什么是H.261编码协议 答&#xff1a;H.261是最早出现的视频编码建议&#xff0c;它采用的算法结合了可减少时间冗余的帧间预测和可减少空间冗余的DCT变换的混合编码方法&#xff0c;其输出码率是p64kbit/s。p取值较小时&#xff0c;只能传清晰度不太高的图像&#…

fiber报错 (type *big.Int has no field or method FillBytes)

如何绕过dgrijalva/jwt go中的cve-2020-26160漏洞 go jwt jwt-go由于存在一个高级漏洞&#xff0c;Gitlab管道中无法传递容器安全状态。此漏洞为jwt-go&#xff0c;安装的版本为v3.2.0incompatible。错误标题如下&#xff1a;jwt-go: access restriction bypass vulnerability…

基于BISS0001构成的热释电红外延时照明控制器电路图

BISS0001是采用CMOS数模混合结构、具有DIP-16和SOIC-16两种封装的热释电红外传感信号处理集成电路。芯片内部集成了电压比较器、状态控制器、延时电路定时器、封锁时间定时器以及参考电压源等电路&#xff0c;常用于防盗报警器、自动门等各种自动开关。利用BISS0001构成的热释电…

安卓APP破解利器之FRIDA

本文讲的是安卓APP破解利器之FRIDA&#xff0c;在我去年参加RadareCon大会的时候&#xff0c;我了解到了一个动态的二进制插桩框架——Frida。起初我觉得它似乎只有一丁点趣味&#xff0c;后来经过实践才发现它原来是如此的有趣。记得游戏里的上帝模式吗&#xff1f;这就是Frid…

如何获取option的下标和值_数智化时代下,如何获取企业增长密码?

信息化时代下&#xff0c;很多企业前前后后上线了各种信息化系统&#xff0c;ERP、OA、CRM…随着企业数字化的深入推进&#xff0c;“移动互联网、云计算、大数据、人工智能、物联网、区块链”等技术的革新&#xff0c;这些信息化系统难以满足企业对数智化转型的新需求&#xf…

解决Gorm中使用Count后关联查询失效的问题

解决Gorm中使用Count后关联查询失效的问题 问题描述 当我们 在go中使用gorm进行多表join关联查询的时候 如果还有分页的需求 那么可能会是这样写 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"ormLogger "gorm.io/gorm/logger"…

hdu1540/poj2892 线段数区间合并

HDU - 1540 POJ - 2892 题意&#xff1a;n个点&#xff0c;有3种操作D a表示摧毁a这个点&#xff0c;R 表示修复上一个点&#xff0c;Q x表示查询x所在的区间没被摧毁的连续最大区间 思路&#xff1a;线段树区间合并&#xff0c;区间合并主要就是对lsum rsum 和sum的动态维护&…

基于51单片机的交通灯控制设计

课程设计任务书及成绩 课程名称 单片机课程设计 题目 交通灯控制设计 课程设计目标与任务、计划与进度安排: 实践教学要求与任务: 1、了解交通灯的基本工作原理&#xff1b; 2、用Proteus模拟实现交通灯控制&#xff1b; 3、用Keil C51编程实现上述功能&#xff1b; 4、…

福斯i6飞行模式设置_数据网络卡的时候,不妨试试“开关飞行模式”?上网速度明显变快...

相信大家都有过这种经历&#xff0c;手机数据网速很慢的时候&#xff0c;开一下飞行模式再关闭&#xff0c;上网速度会比之前快很多&#xff0c;这就有人有了疑问&#xff0c;为什么呢&#xff1f;开飞行模式再关掉飞行模式&#xff0c;其实等于是完成了一次手动的小区重选。移…

安装开源 ITIL 门户 iTOP

在 CentOS 7 上部署iTOP是一个简单的基于Web的开源IT服务管理工具。它有所有的ITIL功能&#xff0c;包括服务台、配置管理、事件管理、问题管理、变更管理和服务管理。iTOP依赖于Apache/IIS、MySQL和PHP&#xff0c;因此它可以运行在任何支持这些软件的操作系统中。因为iTOP是一…

基于FPGA 的8b10b编解码电路前端电路设计

基于FPGA 的8b10b编解码电路前端电路设计 摘 要 本设计是采用EDA技术设计的一种8B /10B 编解码电路,实现了在高速的串行数据传输中的直流平衡。该编解码电路设计大体上可以由五个模块构成&#xff0c;分别是默认编码模块、差异度计算模块、编码校正模块、并串转换模块、显示模…

day15(mysql 的多表查询,事务)

mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起&#xff01; /*创建表t1*/ CREATE TABLE t1(a INT PRIMARY KEY ,b VARCHAR(10) ) INSERT INTO t1 VALUES(1,a); INSERT INTO t1 VALUES(2,b); INSERT INTO t1 VALUES(3,c); /*创建t2*/…