当前位置: 首页 > news >正文

网站怎么做播放窗口网站建设方案应该怎么做

网站怎么做播放窗口,网站建设方案应该怎么做,网站的开发建设费,肥城网站设计公司继续上次的知乎爬虫#xff0c; 这次开始了哔哩哔哩的爬虫实践#xff1b; 首先介绍下如何下载吧#xff1a; VideoHelper 里面有三种方式下载b站视频。 同样的流程#xff0c; 还是先抓包#xff0c;分析参数#xff0c;寻找参数#xff08;包括之前的请求包和页面源码…  继续上次的知乎爬虫 这次开始了哔哩哔哩的爬虫实践   首先介绍下如何下载吧 VideoHelper 里面有三种方式下载b站视频。   同样的流程 还是先抓包分析参数寻找参数包括之前的请求包和页面源码找出视频真实地址 然后在模拟。   抓包是注意几个参数 aid每个视频都会有对应的 aid 包括ep类型的 cid弹幕的id 通过相关api可由cid找到对应的资源列表 ep_id 就是地址栏上显示的ep类型的id了   这里详细的流程我就不介绍了其实我是来宣传VideoHelper 的目前还支持知乎等网站视频, 欢迎star。滑稽‘(*﹏*)   其中需要注意的是模拟发包是有些请求头是不能掉的 user-agent我就不说了 不如Referer   另外我发现网上目前仅存的b站的视频爬虫好像大多不支持ep类型的 不过我那个最近测试是支持了的 但是vip专属的也是会直接报错   另外注明该项目参考了you-get的部分api     下面老规矩贴上主要源码 package website;import bean.BilibiliBean; import bean.VideoBean; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import org.json.JSONArray; import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import util.DownloadUtil; import util.HttpUtil; import util.MD5Encoder;import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.util.*;import static util.PrintUtil.println;/*** 哔哩哔哩: https://www.bilibili.com/** author Asche* date 2018-10-20 18:02:29* github https://github.com/asche910*/ public class Bilibili extends BaseSite {// from aid to cidsprivate String ApiGetList https://www.bilibili.com/widget/getPageList?aid;private String AvApi http://interface.bilibili.com/v2/playurl?;private String EpApi http://bangumi.bilibili.com/player/web_api/playurl?;private String SEC_1 94aba54af9065f71de72f5508f1cd42e;private String SEC_2 9b288147e5474dd2aa67085f716c560d;// qualityprivate final int RESOLUTION_1080 112;private final int RESOLUTION_720 64;private final int RESOLUTION_480 32;private final int RESOLUTION_360 15;private int quality RESOLUTION_1080;// private ListString urls new ArrayList();private String playUrl;private String fileName;private int timeLength;private int fileSize 0;private int aid;private int cid;// 视频类型private final int AV_VIDEO 1;private final int EP_VIDEO 2;private final int SS_VIDEO 3;private int type AV_VIDEO;private boolean isSupported;// ep的关联系列private ListBilibiliBean serialList new ArrayList();// 是否已经解析private boolean isResolved;public Bilibili() {}/*** 先获取信息再决定是否下载* param playUrl* param outputDir*/public Bilibili(String playUrl, String outputDir) {if (!isResolved) {this.playUrl playUrl;String[] strs playUrl.split(/);for (String str : strs) {if (str.matches(av\\d{4,})) {aid Integer.parseInt(str.substring(2));isSupported true;break;} else if(str.matches(ep\\d{4,})){type EP_VIDEO;isSupported true;break;} else if(str.matches(ss\\d{4,})){type SS_VIDEO;isSupported true;break;}}try {switch (type) {case SS_VIDEO:case EP_VIDEO:initEp();String epApi generateEpApi(EpApi, cid, quality);println(epApi);parseEpApiResponse(epApi);break;case AV_VIDEO:initAv();String avApi generateAvApi(AvApi, cid, quality);println(avApi);parseAvApiResponse(avApi);break;}} catch (Exception e) {e.printStackTrace();}isResolved true;}}Overridepublic void downloadByUrl(String playUrl, String outputDir) {println(Bilibili start: );this.playUrl playUrl;String[] strs playUrl.split(/);for (String str : strs) {if (str.matches(av\\d{4,})) {aid Integer.parseInt(str.substring(2));isSupported true;break;} else if(str.matches(ep\\d{4,})){type EP_VIDEO;isSupported true;break;} else if(str.matches(ss\\d{4,})){type SS_VIDEO;isSupported true;break;}}try {if (!isResolved) {switch (type) {case SS_VIDEO:case EP_VIDEO:initEp();String epApi generateEpApi(EpApi, cid, quality);println(epApi);parseEpApiResponse(epApi);break;case AV_VIDEO:initAv();String avApi generateAvApi(AvApi, cid, quality);println(avApi);parseAvApiResponse(avApi);break;}isResolved true;}println(# Title: fileName);println( -TimeLength: timeLength / 1000 / 60 : String.format(%02d, timeLength / 1000 % 60));println( -File Size: fileSize / 1024 / 1024 M);download(urls, outputDir);} catch (Exception e) {e.printStackTrace();}}/*** 内部下载入口** param videoSrcs* param outputDir*/Overridepublic void download(ListString videoSrcs, String outputDir) throws IOException {MapString, ListString headerMap new HashMap();// 缺失Referer会导致453错误headerMap.put(Referer, Collections.singletonList(http://interface.bilibili.com/v2/playurl?appkey84956560bc028eb7cid59389212otypejsonqn3quality3typesign4c841d687bb7e479e3111428c6a4d3b8));int index 0;for (String src : videoSrcs) {println(Download: index / videoSrcs.size());String fileDir;if (videoSrcs.size() 1) {fileDir outputDir File.separatorChar fileName.replaceAll([/|\\\\], ) .flv;} else {fileDir outputDir File.separatorChar fileName.replaceAll([/|\\\\], ) 【 index 】.flv;}DownloadUtil.downloadVideo(src, fileDir, headerMap);}println(Download: All Done!);}Overridepublic VideoBean getInfo() {VideoBean bean new VideoBean();bean.setTitle(fileName);bean.setTimeLength(timeLength / 1000 / 60 : String.format(%02d, timeLength / 1000 % 60));bean.setSize(fileSize / 1024 / 1024);return bean;}public ListBilibiliBean getSerialList(){return serialList;}/*** cid, fileName** throws IOException*/private void initAv() throws IOException {String result HttpUtil.getResponseContent(ApiGetList aid);JSONObject jb (JSONObject) new JSONArray(result).get(0);cid jb.getInt(cid);Document doc Jsoup.connect(playUrl).get();Element ele doc.selectFirst(div[idviewbox_report]).selectFirst(h1);if (ele.hasAttr(title))fileName ele.attr(title);}/*** cid, fileName and related eps** throws IOException*/private void initEp() throws IOException {Document doc Jsoup.connect(playUrl).get();Element ele doc.body().child(2);String preResult ele.toString();// println(preResult); String result preResult.substring(preResult.indexOf(__) 3, preResult.indexOf(;(function()));// println(result); JSONObject object new JSONObject(result);JSONObject curEpInfo object.getJSONObject(epInfo);fileName object.getJSONObject(mediaInfo).getString(title);cid curEpInfo.getInt(cid);JSONArray ja object.getJSONArray(epList);for (Object obj : ja) {JSONObject epObject (JSONObject) obj;int aid epObject.getInt(aid);int cid epObject.getInt(cid);int duration epObject.getInt(duration);int epId epObject.getInt(ep_id);String index epObject.getString(index);String indexTitle epObject.getString(index_title);BilibiliBean bean new BilibiliBean(aid, cid, duration, epId, index, indexTitle);serialList.add(bean);println(bean.toString());}}/*** timeLength, fileSize, urls** param avReqApi* throws IOException*/private void parseAvApiResponse(String avReqApi) throws IOException {String result HttpUtil.getResponseContent(avReqApi);// println(result); JSONObject jsonObject new JSONObject(result);timeLength jsonObject.getInt(timelength);JSONArray ja jsonObject.getJSONArray(durl);IteratorObject iterator ja.iterator();while (iterator.hasNext()) {JSONObject jb (JSONObject) iterator.next();String videoSrc jb.getString(url);urls.add(videoSrc);fileSize jb.getInt(size);}}/*** timeLength, fileSize, urls** param epReqApi* throws IOException* throws DocumentException*/private void parseEpApiResponse(String epReqApi) throws IOException, DocumentException {String response HttpUtil.getResponseContent(epReqApi);SAXReader reader new SAXReader();org.dom4j.Element rootElement reader.read(new ByteArrayInputStream(response.getBytes(utf-8))).getRootElement();timeLength Integer.parseInt(rootElement.element(timelength).getText().trim());Listorg.dom4j.Element elements rootElement.elements(durl);for (org.dom4j.Element ele : elements) {int curSize Integer.parseInt(ele.element(size).getText());fileSize curSize;String url ele.element(url).getText();urls.add(url);}println(fileName : fileSize / 1024 / 1024 M);}/*** 生成av类型视频下载信息的api请求链接** param url* param cid* param quality* return*/private String generateAvApi(String url, int cid, int quality) {String paramStr String.format(appkey84956560bc028eb7cid%dotypejsonqn%dquality%dtype, cid, quality, quality);try {String checkSum MD5Encoder.md5(paramStr SEC_1).toLowerCase();return url paramStr sign checkSum;} catch (Exception e) {e.printStackTrace();}return null;}/*** 生成ep类型视频下载信息的api请求链接** param url* param cid* param quality* return*/private String generateEpApi(String url, int cid, int quality) {String paramStr String.format(cid%dmodulebangumiplayer1quality%dts%s,cid, quality, System.currentTimeMillis() / 1000 );try {String checkSum MD5Encoder.md5(paramStr SEC_2).toLowerCase();return url paramStr sign checkSum;} catch (Exception e) {e.printStackTrace();}return null;} }      完整代码位于  https://github.com/asche910/VideoHelper   转载于:https://www.cnblogs.com/asche/p/9863870.html
http://www.zqtcl.cn/news/701567/

相关文章:

  • 公司网站简介网站建设中的英文
  • 没有防盗链的网站做网站市场报价步登顶
  • 网站建设基本话术服装店网站建设规划书
  • 网站建设公司品牌crm客户管理系统设计
  • 网站源码生成器英文网站建设600
  • 著名网站建设金华建设公司网站
  • 网站点击率h5开发app
  • 中英文 微信网站 怎么做网站的建站公司
  • 苏州网站建设新手去哪找做塑料的网站
  • 莱芜网站建设电话瓦房店网站建设
  • 视频网站app怎么做的天津seo标准
  • 建立音乐网站wordpress 安装文件名
  • 龙华营销型网站制作企业网站模板源代码下载
  • 山东城乡建设厅网站哪有做网站公司
  • 建设网站是否等于开展网络营销用wordPress搭建图片库
  • 泗阳做网站的外贸公司网站搭建
  • 做汽车保养的网站上商业招商网站
  • 如何进网站帝国cms调用网站名称
  • 瑞金网站建设推广合肥瑶海区地图
  • 静态网站建设国内免费域名
  • 网站建设设计公司电子商务网站开发与管理
  • 手机网站制作设计做国际网站有什么需要注意的
  • 机构网站源码如何分析一个网站
  • 免费营销软件网站网站建设与规划实训总结
  • 网站深度功能建筑人才网市场
  • 学校网站建设的意义和应用服务平台管理系统
  • 网站内容规划要包括什么内容wordpress5.2 php版本
  • 山西建设部网站超值的镇江网站建设
  • 做淘宝要网站网站推广外链怎么做
  • 深圳做网站推广哪家好自建网站优缺点