Go語言專案實戰:併發爬蟲
匯入類庫
import (
"fmt"
"regexp"
"net/http"
"io/ioutil"
"strings"
"sync"
"time"
"strconv"
)
定義全域性資料
var (
//存放圖片連結
chanImgUrls chan string
//存放147個任務是否已完成
chanTask chan string
waitGroup sync.WaitGroup
)
爬取一個頁面上的全部圖片連結,返回結果切片
func SpiderPrettyImg(url string) (urls []string) {
pageStr := GetPageStr(url)
//fmt.Println(pageStr)
re := regexp.MustCompile(reImg)
results := re.FindAllStringSubmatch(pageStr, -1)
fmt.Printf("共找到%d條結果:\n", len(results))
for _, result := range results {
url := result[1]
fmt.Println(url)
urls = append(urls, url)
}
return
}
從url中提取檔名稱
func GetFilenameFromUrl(url string, dirPath string) (filename string) {
lastIndex := strings.LastIndex(url, "/")
filename = url[lastIndex+1:]
timePrefix := strconv.Itoa(int(time.Now().UnixNano()))
filename = timePrefix + "_" + filename
filename = dirPath + filename
//fmt.Println(fileName)
return
}
下載url對應的檔案到指定路徑
func DownloadFile(url string, filename string) (ok bool) {
resp, err := http.Get(url)
if err != nil {
HandleError(err, "http.Get(url)")
return
}
defer resp.Body.Close()
//ioutil.ReadAll(resp.Body)read tcp 192.168.20.50:57178->175.6.244.4:80: wsarecv:
// An existing connection was forcibly closed by the remote host.
fBytes, e := ioutil.ReadAll(resp.Body)
HandleError(e, "ioutil.ReadAll(resp.Body)")
err = ioutil.WriteFile(filename, fBytes, 0644)
HandleError(err, "http.Get(url)")
if err != nil {
return false
} else {
return true
}
}
爬取一個頁面下的所有圖片連結,並丟入全域性待下載資料管道
func SpiderImgUrls(url string) {
//獲取一個頁面下的所有圖片連結
urls := SpiderPrettyImg(url)
//將所有圖片超連結丟入資料管道
for _, url := range urls {
chanImgUrls <- url
}
//通知當前協程任務完成
chanTask <- url
waitGroup.Done()
}
同步下載圖片連結管道中的所有圖片
func DownloadImg() {
for url := range chanImgUrls {
filename := GetFilenameFromUrl(url, "D:/BJBlockChain1801/demos/W4/day4/img/")
ok := DownloadFile(url, filename)
if ok {
fmt.Printf("%s下載成功!\n", filename)
} else {
fmt.Printf("%s下載失敗!!!!!!!!!!!!\n", filename)
}
}
waitGroup.Done()
}
檢查147個任務是否全部完成,完成則關閉資料管道
func CheckIfAllSpidersOk() {
var count int
for {
url := <-chanTask
fmt.Printf("%s完成爬取任務\n", url)
count ++
if count == 147 {
close(chanImgUrls)
break
}
}
waitGroup.Done()
}
主程式
func main() {
//初始化資料管道
chanImgUrls = make(chan string, 1000000)
chanTask = make(chan string, 147)
//爬蟲協程:源源不斷地往管道中新增圖片連結
for i := 1; i < 148; i++ {
waitGroup.Add(1)
go SpiderImgUrls("http://www.umei.cc/tags/meinv_" + strconv.Itoa(i) + ".htm")
}
//開闢任務統計協程,如果147個任務全部完成,則關閉資料管道
waitGroup.Add(1)
go CheckIfAllSpidersOk()
//下載協程:源源不斷地從管道中讀取地址並下載
for i := 0; i < 10; i++ {
waitGroup.Add(1)
go DownloadImg()
}
waitGroup.Wait()
}
學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928
[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- 爬蟲實戰專案合集爬蟲
- 爬蟲專案實戰(一)爬蟲
- 爬蟲實戰專案集合爬蟲
- python爬蟲實操專案_Python爬蟲開發與專案實戰 1.6 小結Python爬蟲
- go語言實戰教程:Redis實戰專案應用GoRedis
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- Python爬蟲開發與專案實戰pdfPython爬蟲
- Python爬蟲開發與專案實戰(2)Python爬蟲
- Python爬蟲開發與專案實戰(1)Python爬蟲
- Go語言專案實戰:多人聊天室Go
- GO語言併發Go
- go語言實戰教程:實戰專案資源匯入和專案框架搭建Go框架
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- python爬蟲-33個Python爬蟲專案實戰(推薦)Python爬蟲
- Python爬蟲開發與專案實戰--分散式程式Python爬蟲分散式
- 不踩坑的Python爬蟲:Python爬蟲開發與專案實戰,從爬蟲入門 PythonPython爬蟲
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- 大資料爬蟲專案實戰教程大資料爬蟲
- Python爬蟲開發與專案實戰 4: HTML解析大法Python爬蟲HTML
- 非常棒的一門GO語言實戰課程《高併發&高效能 Go語言開發企業級抽獎專案》——推薦連結分享Go
- go語言實戰教程:專案檔案配置和專案初始化執行Go
- Python靜態網頁爬蟲專案實戰Python網頁爬蟲
- 2019最新《網路爬蟲JAVA專案實戰》爬蟲Java
- GO 語言 Web 開發實戰一GoWeb
- Go 語言實戰 GraphQLGo
- python書籍推薦-Python爬蟲開發與專案實戰Python爬蟲
- go語言實現簡單爬蟲獲取頁面圖片Go爬蟲
- 第09章 Go語言併發,Golang併發Golang
- Go語言高併發與微服務實戰專題精講——遠端過程呼叫 RPCGo微服務RPC
- Python爬蟲入門學習實戰專案(一)Python爬蟲
- 爬蟲實戰專案-公眾號:AI悅創爬蟲AI
- Datawhale-爬蟲-Task7(實戰大專案)爬蟲
- 32個Python爬蟲實戰專案,滿足你的專案慌Python爬蟲
- Go語言併發程式設計Go程式設計
- Go語言專案實戰:基於開源資料的成語查詢Go
- 視訊教程-Python網路爬蟲開發與專案實戰-PythonPython爬蟲
- 有Go語言實戰培訓班嗎?go語言開發環境搭建Go開發環境