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 { }