[Go]網頁爬蟲

小黑-avatar-img
發佈於後端
更新於 發佈於 閱讀時間約 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
Google Gemini 2.0 的超擬真人語音功能引發震撼,其 Native Audio OUTPUT 技術能模擬各種情緒、語速與停頓,應用層面廣泛,但同時也帶來行銷操控的隱憂。本文探討 Gemini 2.0 的優缺點、應用瓶頸與未來發展,並提醒企業主管及使用者需謹慎評估風險。
Thumbnail
本文探討了輕音樂文化的歷史發展,從文藝復興時期的古典音樂到現代流行音樂的轉變,分析了輕音樂如何在電影配樂中發揮重要作用。文章中特別提到1939年《亂世佳人》到1997年《鐵達尼號》的關鍵時刻,以及著名輕音樂團Paul Mauriat的退休,反映出輕音樂的盛衰以及其對於文化的影響。
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
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
Google Gemini 2.0 的超擬真人語音功能引發震撼,其 Native Audio OUTPUT 技術能模擬各種情緒、語速與停頓,應用層面廣泛,但同時也帶來行銷操控的隱憂。本文探討 Gemini 2.0 的優缺點、應用瓶頸與未來發展,並提醒企業主管及使用者需謹慎評估風險。
Thumbnail
本文探討了輕音樂文化的歷史發展,從文藝復興時期的古典音樂到現代流行音樂的轉變,分析了輕音樂如何在電影配樂中發揮重要作用。文章中特別提到1939年《亂世佳人》到1997年《鐵達尼號》的關鍵時刻,以及著名輕音樂團Paul Mauriat的退休,反映出輕音樂的盛衰以及其對於文化的影響。
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 專案內,起一個網頁服務。 在開始