爬取b站視訊資訊時,如果直接用URL開啟流進行爬取網站原始碼時,會發現Java程式上一片空白(既然大家看這篇文章了,想必大家頁遇到了這個問題),說明無法直接爬取,接下來我會講解怎麼爬取b站。
視訊地址:https://www.bilibili.com/video/BV1Kb411W75N/
(注意視訊地址一定要是這個格式的,因為本程式還沒通用性,大家也可以改改啊啊啊)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class text04_bilibili {
public static void main(String[] args) {
String urlstr1;
String urlstr2;
String text;
String name;
String time;
int a=0;
String bvid;
Pattern p1;
Matcher m1;
Pattern p2;
Matcher m2;
//分享出來的b站視訊的連結
urlstr1 = "https://www.bilibili.com/video/BV1Kb411W75N/";
//bvid就是 BV1Kb411W75N 這串字元 下面這行程式碼對取視訊的bvid沒有通用型,讀者可以自己改進一下,現在只能處理b站視訊 分享 處獲得的連結
bvid = urlstr1.substring(urlstr1.indexOf("BV"),urlstr1.lastIndexOf("/"));
//b站視訊資訊存放在https://api.bilibili.com/x/player/pagelist?bvid=BV1Kb411W75N這個連結裡 或者https://api.bilibili.com/x/player/pagelist?aid=48144058這個連結裡
//我會在文章裡講解bvid和aid在哪獲取(不用研究bvid和aid是啥,就把他當作名字就行) 本程式利用bvid操作
urlstr2 = "https://api.bilibili.com/x/player/pagelist?bvid="+bvid;
//獲得網站原始碼
text = text04_bilibili.getURLText(urlstr2, "utf-8");
p1 = Pattern.compile("part\":\"[\\s\\S]+?\"");
m1 = p1.matcher(text);
p2 = Pattern.compile("duration\":[\\s\\S]+?,");
m2 = p2.matcher(text);
while(m1.find()) {
a++;
if(m2.find()) {
//此處獲得視訊名稱
name = m1.group().substring(7,m1.group().length()-1);
//此處獲得播放時長
time = m2.group().substring(10,m2.group().length()-1);
//此處這個視訊播放連結就是https://www.bilibili.com/video/BV1Kb411W75N?p=第幾集
System.out.println("編號:"+a+" "+name+" <----> "+"視訊長度: "+Integer.parseInt(time)/60+"分鐘"+Integer.parseInt(time)%60+"秒"+" 播放連結:https://www.bilibili.com/video/"+bvid+"?p="+a);
}
}
System.out.println("\n\n總共:"+a+"集");
}
public static String getURLText(String urlstr,String charset) {
String temp = "";
StringBuffer sb = new StringBuffer();
try {
URL url = new URL(urlstr);
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),Charset.forName(charset)));
while((temp=br.readLine())!=null) {
sb.append(temp);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO: handle exception
}
return sb.toString();
}
}
我把network裡的所有網址都試了一遍才找到!!!
大家如果想找一下可以按我圖中操作,https://api.bilibili.com/x/player/pagelist?bvid=BV1Kb411W75N
哪裡不會的可以評論區問我哈