mirror of
https://github.com/ProudMuBai/GoFilm.git
synced 2026-02-10 03:44:46 +08:00
157 lines
4.4 KiB
Go
157 lines
4.4 KiB
Go
package spider
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"log"
|
|
"server/model/collect"
|
|
"server/model/system"
|
|
"server/plugin/common/conver"
|
|
"server/plugin/common/util"
|
|
)
|
|
|
|
/*
|
|
Spider 数据 爬取 & 处理 & 转换
|
|
*/
|
|
|
|
type FilmCollect interface {
|
|
// GetCategoryTree 获取影视分类数据
|
|
GetCategoryTree(r util.RequestInfo) (*system.CategoryTree, error)
|
|
// GetPageCount 获取API接口的分页页数
|
|
GetPageCount(r util.RequestInfo) (count int, err error)
|
|
// GetFilmDetail 获取影片详情信息,返回影片详情列表
|
|
GetFilmDetail(r util.RequestInfo) (list []system.MovieDetail, err error)
|
|
}
|
|
|
|
// ------------------------------------------------- JSON Collect -------------------------------------------------
|
|
|
|
// JsonCollect 处理返回值为JSON格式的采集数据
|
|
type JsonCollect struct {
|
|
}
|
|
|
|
// GetCategoryTree 获取分类树形数据
|
|
func (jc *JsonCollect) GetCategoryTree(r util.RequestInfo) (*system.CategoryTree, error) {
|
|
// 设置请求参数信息
|
|
r.Params.Set(`ac`, "list")
|
|
r.Params.Set(`pg`, "1")
|
|
// 执行请求, 获取一次list数据
|
|
util.ApiGet(&r)
|
|
// 解析resp数据
|
|
filmListPage := collect.FilmListPage{}
|
|
if len(r.Resp) <= 0 {
|
|
log.Println("filmListPage 数据获取异常 : Resp Is Empty")
|
|
return nil, errors.New("filmListPage 数据获取异常 : Resp Is Empty")
|
|
}
|
|
err := json.Unmarshal(r.Resp, &filmListPage)
|
|
// 获取分类列表信息
|
|
cl := filmListPage.Class
|
|
// 组装分类数据信息树形结构
|
|
tree := conver.GenCategoryTree(cl)
|
|
|
|
// 将分类列表信息存储到redis
|
|
_ = collect.SaveFilmClass(cl)
|
|
|
|
return tree, err
|
|
}
|
|
|
|
// GetPageCount 获取分页总页数
|
|
func (jc *JsonCollect) GetPageCount(r util.RequestInfo) (count int, err error) {
|
|
// 发送请求获取pageCount, 默认为获取 ac = detail
|
|
if len(r.Params.Get("ac")) <= 0 {
|
|
r.Params.Set("ac", "detail")
|
|
}
|
|
r.Params.Set("pg", "1")
|
|
util.ApiGet(&r)
|
|
// 判断请求结果是否为空, 如果为空直接输出错误并终止
|
|
if len(r.Resp) <= 0 {
|
|
err = errors.New("response is empty")
|
|
return
|
|
}
|
|
// 获取pageCount
|
|
res := collect.CommonPage{}
|
|
err = json.Unmarshal(r.Resp, &res)
|
|
if err != nil {
|
|
return
|
|
}
|
|
count = int(res.PageCount)
|
|
return
|
|
}
|
|
|
|
// GetFilmDetail 通过 RequestInfo 获取并解析出对应的 MovieDetail list
|
|
func (jc *JsonCollect) GetFilmDetail(r util.RequestInfo) (list []system.MovieDetail, err error) {
|
|
// 防止json解析异常引发panic
|
|
defer func() {
|
|
if e := recover(); e != nil {
|
|
log.Println("GetMovieDetail Failed : ", e)
|
|
}
|
|
}()
|
|
// 设置分页请求参数
|
|
r.Params.Set(`ac`, `detail`)
|
|
util.ApiGet(&r)
|
|
// 影视详情信息
|
|
detailPage := collect.FilmDetailLPage{}
|
|
//details := system.DetailListInfo{}
|
|
// 如果返回数据为空则直接结束本次循环
|
|
if len(r.Resp) <= 0 {
|
|
err = errors.New(r.Err)
|
|
return
|
|
}
|
|
// 序列化详情数据
|
|
if err = json.Unmarshal(r.Resp, &detailPage); err != nil {
|
|
return
|
|
}
|
|
|
|
// 将影视原始详情信息保存到redis中
|
|
// 获取主站点uri
|
|
//mc := system.GetCollectSourceListByGrade(system.MasterCollect)[0]
|
|
//if mc.Uri == r.Uri {
|
|
// collect.BatchSaveOriginalDetail(detailPage.List)
|
|
//}
|
|
|
|
// 处理details信息
|
|
list = conver.ConvertFilmDetails(detailPage.List)
|
|
return
|
|
}
|
|
|
|
// CustomSearch 自定义搜索, 通过特定的搜索参数获取满足条件的影片数据
|
|
func (jc *JsonCollect) CustomSearch(r util.RequestInfo) {
|
|
// 设置固定参数 ac 请求类型 pg 页数
|
|
if len(r.Params.Get("ac")) <= 0 {
|
|
r.Params.Set("ac", "detail")
|
|
}
|
|
r.Params.Set("pg", "1")
|
|
// 设置搜索参数 wd (影片名模糊搜索)
|
|
}
|
|
|
|
// GetSingleFilm 获取单一影片信息
|
|
func (jc *JsonCollect) GetSingleFilm(r util.RequestInfo, ids string) {
|
|
// 设置固定参数 ac 请求类型 pg 页数
|
|
r.Params.Set("ac", "detail")
|
|
r.Params.Set("pg", "1")
|
|
r.Params.Set("ids", ids)
|
|
//
|
|
}
|
|
|
|
// FailureRecord 记录失败采集的相关信息, 用于后续采集重试操作
|
|
func (jc *JsonCollect) FailureRecord(r util.RequestInfo) {
|
|
// 记录采集失败时的采集参数
|
|
|
|
// 1. 采集站信息 (ID)
|
|
|
|
// 2. 采集参数, h 最新x小时影片, pg 页码
|
|
|
|
// 3. 将失败信息记录到redis ZSet集合中, score - time | member - data
|
|
|
|
}
|
|
|
|
// FilmDetailRetry 影片详情重试机制
|
|
func (jc *JsonCollect) FilmDetailRetry(r util.RequestInfo) {
|
|
|
|
}
|
|
|
|
// ------------------------------------------------- XML Collect -------------------------------------------------
|
|
|
|
// XmlCollect 处理返回值为XML格式的采集数据
|
|
type XmlCollect struct {
|
|
}
|