【问题标题】:Parsing instagram with java jsoup not give Elements gives source用java jsoup解析instagram不给Elements给出源
【发布时间】:2020-08-10 14:39:38
【问题描述】:

我正在尝试在 Android Studio 上使用 java 获取带有 jsoup 的 reels 视频 URL。我想在检查中获取元素,但代码返回页面源。我在不同网页的其他项目中使用jsoup,从未遇到过这种情况。你能告诉我我做错了什么以及如何让元素进入检查?谢谢

  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;
        }
}

【问题讨论】:

    标签: java android jsoup instagram


    【解决方案1】:

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

    <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 中生成的,因为它似乎无法过滤任何 video> 元素的 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2019-04-29
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多