用 java jsoup 解析 instagram 不给 Elements 给源
Parsing instagram with java jsoup not give Elements gives source
我正在尝试在 Android Studio 上使用 java 使用 jsoup 获取 reels 视频 URL。我想在检查中获取元素,但代码 returns 页面源代码。我在不同网页的其他项目中使用jsoup,从来没有遇到过这种情况。你能告诉我我做错了什么吗?我怎样才能让 Elements 进入 inspect?谢谢
public class fetchData extends AsyncTask<Void, Void, Void> {
Document doc = null;
String str;
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
MainActivity.textView.setText(str);
}
@Override
protected Void doInBackground(Void... voids) {
try {
doc = Jsoup.connect("https://www.instagram.com/reel/CDok74FJzHp/?igshid=cam8ylb7okl7").get();
} catch (IOException e) {
e.printStackTrace();
}
str = doc.toString();
return null;
}
}
如果您检查页面的来源(检查视频元素),您会发现:
<video class="tWeCl"
playsinline=""
poster="https://instagram.flhr4-2.fna.fbcdn.net/v/t51.2885-15/e35/117157253_120443486171759_7332785595039685871_n.jpg?_nc_ht=instagram.flhr4-2.fna.fbcdn.net&_nc_cat=111&_nc_ohc=aX7rVh9IbGoAX_lj74j&oh=ba74c5c8ad97ba14c35710addd523dfd&oe=5F363C59"
preload="none"
type="video/mp4"
src="https://instagram.flhr4-2.fna.fbcdn.net/v/t50.2886-16/117284962_313567919762486_3343704909021624596_n.mp4?_nc_ht=instagram.flhr4-2.fna.fbcdn.net&_nc_cat=102&_nc_ohc=3wvoN4vNzkUAX_DLFTR&oe=5F3659EF&oh=7a38d593469a99239a7cb07050cc47f2">
</video>
如果您随后在 html 中搜索 mp4 url,您会在 javascript html 标签之一中找到它...它作为json 值。因此,通过分解 " = "
上的 javascript 文本并获取后半部分,您将获得原始 json,然后可以使用 JayWay 的 [=14] 将其解析为 "video_url"
=]方法。
视频标签似乎是由 javascript 在 html 中生成的,因为它似乎无法过滤任何 <[=15= 的 html ]> 元素。
import com.jayway.jsonpath.JsonPath;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Instagram {
private final String url;
public Instagram(String url) {
this.url = url;
}
public void start() {
Document doc = getHtmlPage(url);
Elements videoElement = getScriptElementContainingVideoUrl(doc);
List<String> relevantTagWithMp4Url = getSingleScriptElementWithVideoUrl(videoElement);
String scriptInnerHtml = relevantTagWithMp4Url.get(0);
System.out.println("Video Url: " + getVideoUrl(scriptInnerHtml));
}
private List<String> getSingleScriptElementWithVideoUrl(Elements scriptElements) {
List<String> relevantTagWithMp4Url = new ArrayList<>();
for (Element element : scriptElements) {
if (element.data().contains("mp4")) {
relevantTagWithMp4Url.add(element.data());
}
}
return relevantTagWithMp4Url;
}
private Elements getScriptElementContainingVideoUrl(Document doc) {
return doc.select("script");
}
private String getVideoUrl(String videoElement) {
String jsonResponse = videoElement.split(" = ")[1];
// $.. is equivalent to $.[*] - (a wild card matcher) - you may need to play with this
List<String> videoUrl = JsonPath.read(jsonResponse, "$..video_url");
return videoUrl.get(0);
}
private Document getHtmlPage(String url) {
try {
return Jsoup.connect(url).get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
new Instagram("https://www.instagram.com/reel/CDok74FJzHp/?igshid=cam8ylb7okl7").start();
}
}
我正在尝试在 Android Studio 上使用 java 使用 jsoup 获取 reels 视频 URL。我想在检查中获取元素,但代码 returns 页面源代码。我在不同网页的其他项目中使用jsoup,从来没有遇到过这种情况。你能告诉我我做错了什么吗?我怎样才能让 Elements 进入 inspect?谢谢
public class fetchData extends AsyncTask<Void, Void, Void> {
Document doc = null;
String str;
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
MainActivity.textView.setText(str);
}
@Override
protected Void doInBackground(Void... voids) {
try {
doc = Jsoup.connect("https://www.instagram.com/reel/CDok74FJzHp/?igshid=cam8ylb7okl7").get();
} catch (IOException e) {
e.printStackTrace();
}
str = doc.toString();
return null;
}
}
如果您检查页面的来源(检查视频元素),您会发现:
<video class="tWeCl"
playsinline=""
poster="https://instagram.flhr4-2.fna.fbcdn.net/v/t51.2885-15/e35/117157253_120443486171759_7332785595039685871_n.jpg?_nc_ht=instagram.flhr4-2.fna.fbcdn.net&_nc_cat=111&_nc_ohc=aX7rVh9IbGoAX_lj74j&oh=ba74c5c8ad97ba14c35710addd523dfd&oe=5F363C59"
preload="none"
type="video/mp4"
src="https://instagram.flhr4-2.fna.fbcdn.net/v/t50.2886-16/117284962_313567919762486_3343704909021624596_n.mp4?_nc_ht=instagram.flhr4-2.fna.fbcdn.net&_nc_cat=102&_nc_ohc=3wvoN4vNzkUAX_DLFTR&oe=5F3659EF&oh=7a38d593469a99239a7cb07050cc47f2">
</video>
如果您随后在 html 中搜索 mp4 url,您会在 javascript html 标签之一中找到它...它作为json 值。因此,通过分解 " = "
上的 javascript 文本并获取后半部分,您将获得原始 json,然后可以使用 JayWay 的 [=14] 将其解析为 "video_url"
=]方法。
视频标签似乎是由 javascript 在 html 中生成的,因为它似乎无法过滤任何 <[=15= 的 html ]> 元素。
import com.jayway.jsonpath.JsonPath;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Instagram {
private final String url;
public Instagram(String url) {
this.url = url;
}
public void start() {
Document doc = getHtmlPage(url);
Elements videoElement = getScriptElementContainingVideoUrl(doc);
List<String> relevantTagWithMp4Url = getSingleScriptElementWithVideoUrl(videoElement);
String scriptInnerHtml = relevantTagWithMp4Url.get(0);
System.out.println("Video Url: " + getVideoUrl(scriptInnerHtml));
}
private List<String> getSingleScriptElementWithVideoUrl(Elements scriptElements) {
List<String> relevantTagWithMp4Url = new ArrayList<>();
for (Element element : scriptElements) {
if (element.data().contains("mp4")) {
relevantTagWithMp4Url.add(element.data());
}
}
return relevantTagWithMp4Url;
}
private Elements getScriptElementContainingVideoUrl(Document doc) {
return doc.select("script");
}
private String getVideoUrl(String videoElement) {
String jsonResponse = videoElement.split(" = ")[1];
// $.. is equivalent to $.[*] - (a wild card matcher) - you may need to play with this
List<String> videoUrl = JsonPath.read(jsonResponse, "$..video_url");
return videoUrl.get(0);
}
private Document getHtmlPage(String url) {
try {
return Jsoup.connect(url).get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
new Instagram("https://www.instagram.com/reel/CDok74FJzHp/?igshid=cam8ylb7okl7").start();
}
}