[Go]網頁爬蟲

更新於 2024/05/20閱讀時間約 3 分鐘
package main

import (
"fmt"
"io"
"net/http"
"os"
"strconv"
)

func Get(url string) (result string, err error) {
resp, err1 := http.Get(url)
if err != nil {
err = err1
return
}
defer resp.Body.Close()
//讀取網頁內容
buf := make([]byte, 4*1024)
for true {
n, err := resp.Body.Read(buf)
if err != nil {
if err == io.EOF {
fmt.Println("完成")
break
} else {
fmt.Println("resp.Body.Read err = ", err)
break
}
}
result += string(buf[:n])
}
return
}

//將所有的網頁內容爬取下來
func SpiderPage(i int, page chan<- int) {
url := "https://github.com/search?q=go&type=Repositories&p=1" + strconv.Itoa((i-1)*50)
fmt.Printf("正在爬取第%d個網頁\n", i)
result, err := Get(url)
if err != nil {
fmt.Println("http.Get err = ", err)
return
}
//把內容寫入文件
filename := "page"+strconv.Itoa(i) + ".html"
f, err1 := os.Create(filename)
if err1 != nil {
fmt.Println("os.Create err = ", err1)
return
}
//寫內容
f.WriteString(result)
//關閉文件
f.Close()
//每爬完一個,就給個值
page <- i
}

func Run(start, end int) {
fmt.Printf("正在爬取第%d頁到%d頁\n", start, end)
//因為很有可能爬蟲還沒結束下面的循環就已經結束了,所以這裡就需要且到通道
page := make(chan int)
for i := start; i <= end; i++ {
//將page阻塞
go SpiderPage(i, page)
}
for i := start; i <= end; i++ {
//這裡直接將面碼傳給點位符,數值直接從管道取出
fmt.Printf("第%d個頁面爬取完成\n", <-page)
}
}

func main() {
var start, end int
fmt.Printf("請輸入起始頁數字>=1:>")
fmt.Scan(&start)
fmt.Printf("請輸入結束頁數字:>")
fmt.Scan(&end)
Run(start, end)
}





avatar-img
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
package main import "fmt" func randGenerator() chan int { ch := make(chan int) go func() { for { //select會嘗試執行各個case,如果都可以執行,那麼隨機選一個執行 se
package main import ( "fmt" ) func foo(i int) chan int { ch := make(chan int) go func() { ch <- i }() return ch } func main() { ch1, ch2, ch3
package main import "fmt" func SendNotification(user string) chan string { //...... //建立一個通道來保存訊息 notifications := make(chan string, 500) //開啟
package main import ( "database/sql" "encoding/csv" "fmt" _ "github.com/go-sql-driver/mysql" "log" "os" "strconv" ) var db *sql.DB type User
gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。 使用 到https://github.com/protocolbuffers/protobuf/releases下
package main import ( "fmt" "net" "time" ) var ConnSlice map[net.Conn]*Heartbeat type Heartbeat struct { endTime int64 //結束時間 } func main() {
package main import "fmt" func randGenerator() chan int { ch := make(chan int) go func() { for { //select會嘗試執行各個case,如果都可以執行,那麼隨機選一個執行 se
package main import ( "fmt" ) func foo(i int) chan int { ch := make(chan int) go func() { ch <- i }() return ch } func main() { ch1, ch2, ch3
package main import "fmt" func SendNotification(user string) chan string { //...... //建立一個通道來保存訊息 notifications := make(chan string, 500) //開啟
package main import ( "database/sql" "encoding/csv" "fmt" _ "github.com/go-sql-driver/mysql" "log" "os" "strconv" ) var db *sql.DB type User
gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。 使用 到https://github.com/protocolbuffers/protobuf/releases下
package main import ( "fmt" "net" "time" ) var ConnSlice map[net.Conn]*Heartbeat type Heartbeat struct { endTime int64 //結束時間 } func main() {
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
隨著暗影超夢團體戰的結束,3月份也總算劃下句點,轉眼瞬間就來到了春意盎然的四月啦,而今天4月1號愚人節,Pokémon GO就有一個小小的愚人節活動...
Thumbnail
在鋼之對戰裡頻繁出沒的火箭隊,在接下來的活動裡也不得閒,迎接1月份的最後一檔活動,阪木老大將帶著GO火箭隊回歸啦,先來看看活動的時間。
Thumbnail
今天要來和大家分享亡靈節活動體驗,以及Pokémon GO City Safari即將在台南舉辦的購票資訊。
Thumbnail
前言介紹 在 golang 1.16之後官方提供的工具包裡面有個 `embed` 可以使用,這使得把檔案嵌入 golang 的二進制編譯更為容易,以至於方便我們部署一些並非 .go 的副檔名檔案。 這裡要介紹的是如何把 vue 作為前端,編譯至我們的 golang 專案內,起一個網頁服務。 在開始
Thumbnail
農業社會遵循著「春耕、夏耘、秋收、冬藏」的節氣運作,那金融市場呢?我們常聽到一句「Sell in May and Go Away」,遇到5月,真的需要賣股退場觀望嗎?這句市場諺語到底能否經得起考驗呢?
Thumbnail
自2015年5月起,至今網賺被動收入經營也滿6年。前2年一邊上班一邊在假日時抽空畫圖上傳圖庫,後4年離開上班族生活一邊SOHO一邊持續累積圖庫作品,建立更多網賺被動收入。如今就在上個月首次達成第一個網賺被動收入的目標里程碑(10萬/月),然而水往低處流,人往高處爬,雖然目前單被動收入已經可以讓我完
Thumbnail
懷舊遊戲週報收集每週與懷舊遊戲相關的新訊,預定每週五出刊。 本週主要的消息包含: ‧初代《電車GO!》網頁體驗版 ‧《莎木II》黑膠原聲帶開始預購 ‧東京電玩展大量遊戲周邊商品發表...等其他資訊
Thumbnail
完整標題:go on 與「繼往走向」或「繼往開來」及「繼」、「續」、「繼續」、「接續」、「启開」、「正昂」、「發生」等的轉換密碼
Thumbnail
完整標題:go 與「之」、「至」、「至于」、「到」、「到于」、「前往」、「進往」、「步往」、「走」、「走于」、「走往」、「行」、「行于」、「行往」、「行走」、「去」、「過」、「過去」、「過于」、「步」、「步于」、「步往」、「步行」、「機遇」、「行旺」等的轉換密碼
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
隨著暗影超夢團體戰的結束,3月份也總算劃下句點,轉眼瞬間就來到了春意盎然的四月啦,而今天4月1號愚人節,Pokémon GO就有一個小小的愚人節活動...
Thumbnail
在鋼之對戰裡頻繁出沒的火箭隊,在接下來的活動裡也不得閒,迎接1月份的最後一檔活動,阪木老大將帶著GO火箭隊回歸啦,先來看看活動的時間。
Thumbnail
今天要來和大家分享亡靈節活動體驗,以及Pokémon GO City Safari即將在台南舉辦的購票資訊。
Thumbnail
前言介紹 在 golang 1.16之後官方提供的工具包裡面有個 `embed` 可以使用,這使得把檔案嵌入 golang 的二進制編譯更為容易,以至於方便我們部署一些並非 .go 的副檔名檔案。 這裡要介紹的是如何把 vue 作為前端,編譯至我們的 golang 專案內,起一個網頁服務。 在開始
Thumbnail
農業社會遵循著「春耕、夏耘、秋收、冬藏」的節氣運作,那金融市場呢?我們常聽到一句「Sell in May and Go Away」,遇到5月,真的需要賣股退場觀望嗎?這句市場諺語到底能否經得起考驗呢?
Thumbnail
自2015年5月起,至今網賺被動收入經營也滿6年。前2年一邊上班一邊在假日時抽空畫圖上傳圖庫,後4年離開上班族生活一邊SOHO一邊持續累積圖庫作品,建立更多網賺被動收入。如今就在上個月首次達成第一個網賺被動收入的目標里程碑(10萬/月),然而水往低處流,人往高處爬,雖然目前單被動收入已經可以讓我完
Thumbnail
懷舊遊戲週報收集每週與懷舊遊戲相關的新訊,預定每週五出刊。 本週主要的消息包含: ‧初代《電車GO!》網頁體驗版 ‧《莎木II》黑膠原聲帶開始預購 ‧東京電玩展大量遊戲周邊商品發表...等其他資訊
Thumbnail
完整標題:go on 與「繼往走向」或「繼往開來」及「繼」、「續」、「繼續」、「接續」、「启開」、「正昂」、「發生」等的轉換密碼
Thumbnail
完整標題:go 與「之」、「至」、「至于」、「到」、「到于」、「前往」、「進往」、「步往」、「走」、「走于」、「走往」、「行」、「行于」、「行往」、「行走」、「去」、「過」、「過去」、「過于」、「步」、「步于」、「步往」、「步行」、「機遇」、「行旺」等的轉換密碼