本帖最后由 sa123456sc 于 2022-8-27 17:03 编辑
某奇异和某讯的电影,电视剧影视可以定时爬取,主要通过影视ID,通过接口获取影视详情,子集列表。但是某酷的没有找到好的方法,我还是想通过id来抓取影视详情(播放链接、图片链接、影视介绍、上映时间、电视剧子集列表等),不然只能通过jsoup解析网页来获取了。
有没有大神知道某酷怎么通过链接的id_XNTg4NTY5MDExMg==这个id来或许详情的方法,共同讨论一下。
[Java] 纯文本查看 复制代码 /**
* 爱奇艺连续剧根据分类爬取子集
* [url=home.php?mod=space&uid=952169]@Param[/url] movie
*/
private void aqySetEpisodeByMovie(Movie movie) {
int page = 1;
while(page <= movie.getEpisodeLatestNo()/200+1){
String url="https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid="+movie.getAlbumId()+"&page="+page+"&size=200";
String html = HttpUtils.getHtml(url);
JSONObject htmlJson = (JSONObject) JSONObject.parse(html);
JSONObject tvInfoJson = (JSONObject) JSONObject.parse(htmlJson.get("data").toString());
JSONArray epsodelistJsonArray = (JSONArray) tvInfoJson.get("epsodelist");
for(int i = 0;i < epsodelistJsonArray.size(); i++){
JSONObject epsodeJSONObject = JSONObject.parseObject(epsodelistJsonArray.get(i).toString());
AssertUtil.isTrue(ObjectUtils.isEmpty(epsodeJSONObject.get("tvId")),"未解析到电视剧当前集的tvId!");
//根据tvId和movieId查找数量,如果大于0,表示已经存在,就跳过,否则添加。
int movieEpisodeCount = (int) movieEpisodeService.count(new LambdaQueryWrapper<MovieEpisode>().eq(MovieEpisode::getTvId, epsodeJSONObject.get("tvId").toString())
.eq(MovieEpisode::getMovieId, movie.getId()));
if(movieEpisodeCount == 0){//不存在该记录,添加记录
MovieEpisode movieEpisode = new MovieEpisode();
movieEpisode.setAlbumId(movie.getAlbumId());//设置AlbumId
movieEpisode.setMovieId(movie.getId());//设置movieId
movieEpisode.setTvId(epsodeJSONObject.get("tvId").toString());//设置tvId
AssertUtil.isTrue(ObjectUtils.isEmpty(epsodeJSONObject.get("playUrl")),"未解析到电视剧当前集的播放地址!");
movieEpisode.setEpisodeUrl(epsodeJSONObject.get("playUrl").toString());//设置播放地址
AssertUtil.isTrue(ObjectUtils.isEmpty(epsodeJSONObject.get("order")),"未解析到电视剧当前集的order!");
movieEpisode.setEpisodeNo(Integer.parseInt(epsodeJSONObject.get("order").toString()));//设置当前集
if(movieEpisode.getEpisodeNo()==1 ){//是第一集,更新movie的页面
movie.setMovieUrl(movieEpisode.getEpisodeUrl());
AssertUtil.isTrue(!this.updateById(movie),"影视子集插入数据库失败!");
}
if(ObjectUtils.isNotEmpty(epsodeJSONObject.get("subtitle"))){
movieEpisode.setRemark(epsodeJSONObject.get("subtitle").toString());//设置当前集数的小标题
}
if(ObjectUtils.isNotEmpty(epsodeJSONObject.get("period"))){
movieEpisode.setUpdateTime(DateUtil.formatString(epsodeJSONObject.get("period").toString(),"yyyy-MM-dd"));//设置更新时间
}
movieEpisode.setStatusCode(0);//设置正常
AssertUtil.isTrue(!movieEpisodeService.save(movieEpisode),"影视子集插入数据库失败!");
if(movie.getEpisodeCount() != 0){//判断当前子集数量是否等于movie.getEpisodeCount()的数量,相等表示完结
int nowCount = (int) movieEpisodeService.count(new LambdaQueryWrapper<MovieEpisode>().eq(MovieEpisode::getMovieId, movie.getId()));
if(nowCount == movie.getEpisodeCount()){
movie.setIsOver(0);//完结
AssertUtil.isTrue(!this.updateById(movie),"影视子集插入数据库失败!");
}
}
}
}
page++;
}
int nowCount = (int) movieEpisodeService.count(new LambdaQueryWrapper<MovieEpisode>().eq(MovieEpisode::getMovieId, movie.getId()));
if(movie.getEpisodeLatestNo() != nowCount){
movie.setEpisodeLatestNo(nowCount);
AssertUtil.isTrue(!this.updateById(movie),"影视子集插入数据库失败!");
}
}
目前某酷的视频找到了内容,但是因为用了js技术,使用httpclient无法爬取,需要使用htmlunit,但是现在有个难点,htmlunit第一次请求的时候正常,第二次请求的时候就被某酷检测出来是爬虫给拦截了,这点暂时无法攻克。 |