最近網站需要針對百度做 SEO 優化,用 Go 語言寫了個測試程序,模擬一下百度的爬蟲,看看返回的內容是否正確。
代碼很簡單,就是發送一個請求,把百度相關的信息放入請求頭中即可,代碼如下:
package main
import (
"io/ioutil"
"net/http"
)
func main() {
// 這里用簡化的UA 訪問百度自己
const (
url = "https://www.baidu.com"
userAgent = "Mozilla/5.0 Baiduspider/2.0"
)
// 創建client 參數為默認
client := &http.Client{}
// 創建請求
req, _ := http.NewRequest("GET", url, nil)
// 在請求頭中添加指定的UA
req.Header.Add("User-Agent", userAgent)
// 發起請求並返回結果
res, _ := client.Do(req)
// 讀取資源數據
body, _ := ioutil.ReadAll(res.Body)
// 寫入文件
ioutil.WriteFile("source.txt", body, 0644)
res.Body.Close()
}
運行完上面的程序,會在當前目錄下,生成一個 source.txt 文件,內容即抓取過來的網頁源代碼。
有時候,我們希望程序在寫文件的同時,同步輸出到控制台,對於這種場景,可以試試下面這種方式:
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
const (
url = "https://www.baidu.com"
userAgent = "Mozilla/5.0 Baiduspider/2.0"
)
// 創建client 參數為默認
client := &http.Client{}
// 創建請求
req, _ := http.NewRequest("GET", url, nil)
// 在請求頭中添加指定的UA
req.Header.Add("User-Agent", userAgent)
// 發起請求並返回結果
res, _ := client.Do(req)
// 獲取響應體
body := res.Body
// 創建文件 用以保存響應內容
file, _ := os.Create("source.txt")
// 創建一個MultiWriter 會同時寫到標准輸出和操作系統文件
dest := io.MultiWriter(os.Stdout, file)
// 將響應內容復制到MultiWriter每個目標 返回總的字節數
bytes, _ := io.Copy(dest, body)
// 打印內容總的字節數
fmt.Println("total bytes:", bytes)
// 關閉資源
body.Close()
file.Close()
}
再次運行程序,文件和控制台將會同步輸出內容。