其實也可以說是因為想給原專案換一個展示模板,就想著利用 embed 的特性順便改寫一下專案原本靜態資原始檔的打包方式。
回顧了之前寫的程式碼,瞭解 embed 、template 的用法。感謝 大佬部落格的文章 (乾貨滿滿)
golang + redis 實現的影站(低階爬蟲)。無管理後臺,效果站:film.hzz.cool 支援手機端訪問播放
Github地址
github.com/hezhizheng/go-movies
features
- 使用 Golang 1.16 embed 內嵌靜態資源(html、js、css等),執行只依賴編譯後可執行的二進位制檔案與redis
- 支援docker啟動方式
- 簡單資源分類、搜尋的支援
- 內建自動爬蟲、自動更新最新資源的定時任務,基本滿足日常看片需求。
- 釘釘機器人通知
Tip
- 暫時只維護API請求版本 API介面說明.txt,後續可能追加其他資源支援
- API版本首次啟動會全量請求並儲存到redis,之後每小時定時爬取最近更新的影視資源
目錄結構
|-- Dockerfile
|-- LICENSE.txt
|-- config
| |-- app.go
| `-- app.go.backup #程式配置檔案
|-- controller #controller層,基本的頁面渲染
| |-- DebugController.go
| |-- IndexController.go
| `-- SpiderController.go
|-- docker-compose.yml
|-- go.mod
|-- go.sum
|-- main.go
|-- models # 定義一些redis查詢的方法
| |-- Category.go
| |-- Movies.go
| `-- readme.md
|-- readme.md
|-- routes
| `-- route.go
|-- runner.conf # fresh 配置檔案
|-- services # 普通業務處理類
| |-- CategoryService.go
| |-- MoviesService.go
| `-- readme.md
|-- static2 # js、css、image等靜態資原始檔夾
|-- utils # 一些工具類
| |-- Cron.go
| |-- Dingrobot.go
| |-- Helper.go
| |-- JsonUtil.go
| |-- Pagination.go
| |-- RedisUtil.go
| |-- Spider.go
| |-- SpiderTask.go
| `-- spider # 爬蟲api版主要功能程式碼
| |-- SpiderTaskPolicy.go
| `-- tian_kong
| |-- CategoriesStr.go
| `-- SpiderApi.go
`-- views # html模板目錄
`-- tmpl
`-- temp_global_var.go # 定義 embed 的全域性變數跟一些模板呼叫的函式
首頁效果
使用安裝 (go version >= 1.16)
# 下載
git clone https://github.com/hezhizheng/go-movies
# 進入目錄
cd go-movies
# 配置檔案(預設使用redis db10的庫,可自行修改app.go中的配置)
cp ./config/app.go.backup ./config/app.go
# 配置說明
app.spider_path: 爬蟲路由
app.spider_path_name: 爬蟲路由名稱
app.debug_path: debug的路由
app.debug_path_name: debug的路由名稱
cron.timing_spider: 定時爬蟲的CRON表示式
ding.access_token: 釘釘機器人token
app.spider_mod: 固定引數為 TianKongApi
app.spider_mod: 開發模式建議設定為`true` 避免修改靜態資源需要重啟服務
# 啟動 (首次啟動會自動開啟爬蟲任務)
go run main.go
or
# 安裝 fresh 工具
fresh
# 如安裝依賴包失敗,請使用代理
export GOPROXY=https://goproxy.io,direct
or
export GOPROXY=https://goproxy.cn,direct
訪問
http://127.0.0.1:8899
開啟爬蟲
- 已內建定時爬蟲,首次全量請求之後,每小時定時爬取最近更新的影視資源(可自行修改配置檔案cron.timing_spider表示式來控制間隔)
- 主動執行:直接訪問連結 127.0.0.1:8899/movies-spider
- 耗時:具體時間受目標網站/介面的響應速度影響
Tools
- 資料庫 redis 快取/持久 github.com/Go-redis/redis
- Zset:每個分類為一個有序集合
- score:電影更新的時間戳
- member:電影對應的實際URL
- Hash:電影具體資訊(名稱、封面圖等)、每頁資料的快取
- Zset:每個分類為一個有序集合
- 路由 github.com/julienschmidt/httproute...
- json解析 jsoniter github.com/json-iterator/go
- 跨平臺打包:github.com/mitchellh/gox
- web server 框架:github.com/valyala/fasthttp
- 配置檔案讀取:github.com/spf13/viper
- 熱重啟:github.com/gravityblast/fresh
編譯可執行檔案(跨平臺)
# 用法參考 https://github.com/mitchellh/gox
# 生成檔案可直接執行
gox -osarch="windows/amd64" -ldflags "-s -w" -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}"
gox -osarch="darwin/amd64" -ldflags "-s -w" -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}"
gox -osarch="linux/amd64" -ldflags "-s -w" -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}"
- 提供win64的已編譯的檔案下載 release
使用請確保redis為開啟狀態,預設使用 DB10,啟動成功之後會自動執行爬蟲,可自行訪問 http://127.0.0.1:8899/movies-spider 進行爬蟲
Docker 部署(使用docker-compose可直接忽略該步驟)
# 安裝 redis 映象(已有可以忽略)
sudo docker pull redis:latest
# 啟動redis容器
# 根據實際情況分配埠 -p 宿主機埠:容器埠
sudo docker run -itd --name redis-test -p 6379:6379 redis
# 修改 app.go 的redis 連線地址為容器名稱
"addr":"redis-test"
# 編譯go-movies
gox -osarch="linux/amd64" -ldflags "-s -w" -gcflags="all=-trimpath=${PWD}" -asmflags="all=-trimpath=${PWD}"
# 構造映象
sudo docker build -t go-movies-docker-scratch .
# 啟動容器
sudo docker run --link redis-test:redis -p 8899:8899 -d go-movies-docker-scratch
docker-compose 一鍵啟動
# 修改 app.go 的redis 連線地址為容器名稱,這裡需要跟docker-compose.yml中保持一致
"addr":"redis-test"
# 編譯go-movies
gox -osarch="linux/amd64" -ldflags "-s -w"
# 執行
sudo docker-compose up -d
開啟遊覽器訪問 http://127.0.0.1:8899 即可看見網站效果
本作品採用《CC 協議》,轉載必須註明作者和本文連結