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.pswp.cn/news/455017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455017.shtml
英文地址,請注明出處:http://en.pswp.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*/…