百度貼吧爬蟲
阿新 • • 發佈:2022-04-09
簡單版
package main import ( "fmt" "io" "net/http" "os" "strconv" ) func HttpGet(url string) (result string, err error) { resp, err1 := http.Get(url) if err1 != nil { err = err1 //將封裝函式內部的錯誤,傳出給呼叫者。 return } defer resp.Body.Close() //迴圈讀取網頁資料,傳出給呼叫者 buf := make([]byte, 4096) for { n, err2 := resp.Body.Read(buf) if n == 0 { fmt.Println("讀取網頁完成") break } if err2 != nil && err2 != io.EOF { err = err2 return } // 累加每一次迴圈讀到的buf資料,存入result 一次性返回. result += string(buf[:n]) } return } //爬取頁面操作。 func working(start, end int) { fmt.Printf("正在爬取第%d頁到%d頁.... \n", start, end) //迴圈爬取每一頁資料 for i := start; i <= end; i++ { url := "https://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&ie=utf-8&pn=" + strconv.Itoa((i-1)*50) result, err := HttpGet(url) if err != nil { fmt.Println("HttpGet err:", err) continue } // fmt.Println("result=",result) //將讀到的整網頁資料,儲存成一個檔案 f, err := os.Create("第" + strconv.Itoa(i) + "頁" + ".html") if err != nil { fmt.Println("Create err:", err) continue } f.WriteString(result) f.Close() // 儲存好一個檔案,關閉一個檔案 //defer f.Close() } } func main() { //指定爬取起始、終止頁 var start, end int fmt.Print("請輸入爬取的起始頁(i>=1): ") fmt.Scan(&start) fmt.Print("請輸入爬取的終止頁(>=start): ") fmt.Scan(&end) working(start, end) }
升級版 併發爬蟲
package main import ( "fmt" "io" "net/http" "os" "strconv" ) func HttpGet(url string) (result string, err error) { resp, err1 := http.Get(url) if err1 != nil { err = err1 //將封裝函式內部的錯誤,傳出給呼叫者。 return } defer resp.Body.Close() //迴圈讀取網頁資料,傳出給呼叫者 buf := make([]byte, 4096) for { n, err2 := resp.Body.Read(buf) if n == 0 { fmt.Println("讀取網頁完成") break } if err2 != nil && err2 != io.EOF { err = err2 return } // 累加每一次迴圈讀到的buf資料,存入result 一次性返回. result += string(buf[:n]) } return } func SpiderPage(i int, page chan int){ url := "https://tieba.baidu.com/f?kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&ie=utf-8&pn=" + strconv.Itoa((i-1)*50) result, err := HttpGet(url) if err != nil { fmt.Println("HttpGet err:", err) return } // fmt.Println("result=",result) //將讀到的整網頁資料,儲存成一個檔案 f, err := os.Create("第" + strconv.Itoa(i) + "頁" + ".html") if err != nil { fmt.Println("Create err:", err) return } f.WriteString(result) f.Close() // 儲存好一個檔案,關閉一個檔案 page <- i // 與主go程完成同步 } //爬取頁面操作。 func working2(start, end int) { fmt.Printf("正在爬取第%d頁到%d頁.... \n", start, end) page := make(chan int) //迴圈爬取每一頁資料 for i := start; i <= end; i++ { go SpiderPage(i,page) } for i := start; i <= end; i++ { fmt.Printf("第%d個頁面爬取完成\n",<-page) } } func main() { //指定爬取起始、終止頁 var start, end int fmt.Print("請輸入爬取的起始頁(i>=1): ") fmt.Scan(&start) fmt.Print("請輸入爬取的終止頁(>=start): ") fmt.Scan(&end) working2(start, end) }