)// 建立正則常量
var re = regexp.mustcompile("\\w+\\.\\w+$")
func main()
// 開始時間
start := time.now()
for _, url := range urls
// 讀取資源資料
body, err := ioutil.readall(res.body)
// 關閉資源
res.body.close()
if err != nil
filename := getfilename(url)
// 寫入檔案
ioutil.writefile(filename, body, 0644)
// 消耗的時間
elapsed := time.since(start).seconds()
fmt.printf("%.2fs %s\n", elapsed, filename)
}// 消耗的時間
elapsed := time.since(start).seconds()
fmt.printf("%.2fs elapsed\n", elapsed)
}// 獲取檔名
func getfilename(url string) string在上面**中,我們使用正規表示式來從 url 中匹配網域名稱後面部分,作為最終的檔名。關於正規表示式,後續會做總結。
下面來看看程式執行後的控制台資訊:
$ ./fetch
0.12s qq.com.txt
0.20s 163.com.txt
0.27s sina.com.txt
0.59s elapsed
從列印資訊中可以看出,最後消耗的總時間等於三次執行的總和。這種方式效率低下,並且不能充分利用計算機資源,下面我們就對程式進行改造,使其能夠併發地執行三個抓取操作:
)// 建立正則
var re = regexp.mustcompile("\\w+\\.\\w+$")
func main()
// 建立channel
ch := make(chan string)
// 開始時間
start := time.now()
for _, url := range urls
for range urls
// 總消耗的時間
elapsed := time.since(start).seconds()
fmt.printf("%.2fs elapsed\n", elapsed)
}// 根據url獲取資源內容
func fetch(url string, ch chan<- string)
// 讀取資源資料
body, err := ioutil.readall(res.body)
// 關閉資源
res.body.close()
if err != nil
// 寫入檔案
ioutil.writefile(getfilename(url), body, 0644)
// 消耗的時間
elapsed := time.since(start).seconds()
// 輸出單個url消耗的時間
ch <- fmt.sprintf("%.2fs %s", elapsed, url)
}// 獲取檔名
func getfilename(url string) string上面**中,我們先建立乙個 channel,然後對每個抓取操作開啟乙個 goroutine,待抓取程式完成後,通過 channel 傳送訊息告知主線程,主線程再做相應的處理操作。關於這部分的原理細節,後續再做總結。
我們執行上面的程式,執行結果如下:
$ ./fetch
0.10s
0.19s
0.29s
0.29s elapsed
從結果中可以看出,最後消耗的總時間與耗時最長的那個操作等同,可見併發在效能方面帶來的提公升是非常可觀的。 Golang 抓取網頁內容
今天寫個簡單的程式,根據指定的 url 來抓取相應的網頁內容,然後存入本地檔案。這個程式會涉及到網路請求和檔案操作等知識點,下面是實現 讀取資源資料 body byte body,err ioutil.readall res.body 關閉資源流 res.body.close if err nil ...
網頁內容抓取
之前採用xpath和正規表示式對網頁內容進行抓取,發現在有的地方不如人意,就採用了htmlparser對頁面進行解析,抓取需要的東西。htmlparser有點不好的地方在於不能對starttag和endtag進行匹配。採用了兩種方法進行抓取。第一種,抓取成對的tag之間的內容,採用了queue.qu...
c 抓取網頁內容
新增的引用 using system.net using system.io using system.io.compression 1.webclient mywebclient new webclient mywebclient.credentials credentialcache.defau...