当前位置: 首页 > 知识库问答 >
问题:

使用java jsoup not give Elements解析instagram提供源代码

戴原
2023-03-14
  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;
        }
}

共有1个答案

宿洋
2023-03-14

如果您检查页面的来源(检查视频元素),您会发现:

<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&amp;_nc_cat=111&amp;_nc_ohc=aX7rVh9IbGoAX_lj74j&amp;oh=ba74c5c8ad97ba14c35710addd523dfd&amp;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&amp;_nc_cat=102&amp;_nc_ohc=3wvoN4vNzkUAX_DLFTR&amp;oe=5F3659EF&amp;oh=7a38d593469a99239a7cb07050cc47f2">
</video>

如果您在html中搜索mp4 url,您会在其中一个javascript html标记中找到它...它以json值的形式传递。因此,通过将“=”上的javascript文本拆分,然后使用后半部分,就可以获得原始json,然后使用Jayway的jsonPath.read方法对其进行解析,以获得“video_url”

因此,视频标记似乎是由javascript在html中生成的,因为似乎不可能过滤html中的任何<video>元素。

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();
    }
}
 类似资料:
  • 问题内容: 我希望解析Java源代码文件,并提取方法源代码。 我需要这样的方法: 有没有简单的方法可以做到这一点,有一个库可以帮助我构建方法,等等? 问题答案: 从https://javaparser.org/下载Java解析器 您必须编写一些代码。此代码将调用解析器…它将返回一个CompilationUnit: 注意:SEDInputStream是输入流的子类。您可以根据需要使用FileInpu

  • 本文向大家介绍CentOS 7中使用Squid提供HTTP代理详解,包括了CentOS 7中使用Squid提供HTTP代理详解的使用技巧和注意事项,需要的朋友参考一下 本文主要记录了一下设置CentOS服务器使用Squid作为HTTP代理,及客户端的代理配置的方法,下面来看看详细的介绍吧。 使用Squid提供HTTP代理 主机上安装和设置Squid 作为网关的n147机器,公网IP是2.2.2.1

  • 服务提供者是 laravel 框架的重要组成部分,承载着各种服务,自定义的应用以及所有 Laravel 的核心服务都是通过服务提供者启动。本文将会介绍服务提供者的源码分析,关于服务提供者的使用,请参考官方文档 :服务提供者。 服务提供者的注册 服务提供者的启动由类 IlluminateFoundationBootstrapRegisterProviders::class 负责,该类用于加载所有服务

  • 章节简述:  本章讲解了DNS域名解析服务的原理以及作用,介绍了域名查询功能中正向解析与反向解析的作用,并通过实验的方式演示了如何在DNS主服务器上部署正、反解析工作模式,以便让大家深刻体会到DNS域名查询的便利以及强大。 本章还介绍了如何部署DNS从服务器以及DNS缓存服务器来提升用户的域名查询体验,以及如何使用chroot牢笼机制插件来保障bind服务程序的可靠性,并向大家演示如何在主服务器与

  • 问题内容: 我试图通过服务公开使用Angular的$ uibModal的“通用”模式。这是该服务的定义: 上面没有什么太复杂的。但是,它不起作用。如果我从对象中删除该属性,则该服务有效;但是,如果包含该属性,则会收到源自该属性的未知提供程序错误。 该属性的文档为: (类型:对象)-将被解析并作为本地成员传递给控制器​​的成员;它等效于路由器中的resolve属性。 目的是能够为在其DOM中利用这些

  • plugins/kibana/public/dashboard/index.js 结构跟 visualize 类似,设置两个调用 savedDashboards.get() 方法的 routes,提供一个叫 dashboard-app 的 directive。 savedDashboards 由 plugins/kibana/public/dashboard/services/saved_dash