Golang 併發抓取網頁內容

2022-07-06 18:42:08 字數 2399 閱讀 3003

)// 建立正則常量

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...