我知道标题有点令人困惑,但基本上我试图从youtube视频中抓取html以获取其浏览量,我使用InputStream.openStream()来完成这项操作,但当我这样做时,它会把我粘贴到记事本中的代码还给我,这样它就可以更容易地被看到,但是当我试图在带有inspect元素的网站html中搜索它时,它就不在哪里了找到了,当我试图用String.contents()找到它时,它也没有给出任何结果,我想知道如果可能的话,我如何在仍然使用InputStream和BufferedReader的情况下获得html
这是我的代码
package Project;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.File;
public class WebScraper
{
public static void main(String[] args) throws IOException
{
URL website = new URL("https://www.youtube.com/watch?v=9h5JC-GLR6g");
BufferedReader in = new BufferedReader(new InputStreamReader(website.openStream()));
int c = 0;
ArrayList<String> code = new ArrayList<String>();
while(in.readLine() != null)
{
String s = (in.readLine());
if(s!=null)
{
Scanner lineScan = new Scanner(s);
while(lineScan.hasNextLine())
{
code.add(lineScan.nextLine());
c++;
}
}
}
int i = 0;
while(i < code.size())
{
if(code.get(i) != null && code.get(i).contains("896K views"))
System.out.println(i+" "+code.get(i));
System.out.println(code.get(i));
i++;
}
//System.out.println(code);
System.out.println("Lines of code: "+ c);
}
}
那个是HTML。<script>
标签。
浏览器会下载一堆HTML,然后"渲染"它。如果<script>
标记是HTML的一部分(而现在,在2022年,脚本标记……它们无处不在),它们就会被执行。javascript可以而且通常会自己进行一些调用,取回一些JSON或其他什么,然后动态创建各种HTML元素并将其注入页面。
当您使用"inspect element"时,您可以看到页面("DOM")的状态,因为它在所有javascript运行之后是。
从"服务器发送给我的HTML+JS+CSS"到"检查元素显示的DOM"的唯一方法是运行所有javascript。
这非常复杂。你几乎需要一个浏览器来做到这一点。
因此,通常情况下,您想要的东西是不起作用的。这正是像youtube这样的服务有API的原因。因为试图"阅读"专为人类眼球设计的页面几乎是不可能的,即使你能做到(有一些技巧,非常复杂),如果youtube重新设计了一些东西——糟糕,你的应用程序也会出现。
你真的不应该使用的黑客攻击是实际启动浏览器,但从你的java应用程序控制浏览器,并要求it在运行所有javascript后,将你可以用"inspect element"看到的DOM流式传输回你的java进程。这是存在的,但它旨在测试客户端的东西:Selenium。因为它真的运行浏览器,所以考虑到这一点,效率非常低(即,如果你想同时解析1000个youtube链接,你最好有一个强大的盒子来同时运行1000个浏览器,因为这实际上是你最终要做的)。
所以,考虑到这太复杂了,你只能做一件事:
在网上搜索"youtube api"。如果没有,你就完了。你想要的是不可能的,除非你愿意破解它,每周都在youtube改变它的样子时更新它,打法律战,通常花周来开发它,更不用说成为专家了,因为这一切都不容易。如果是一个API,那是个好消息:阅读所有关于它的内容,并使用它来解决这些问题,而不是尝试对youtube.com本身进行HTML-parse。
这是因为许多网站(包括YouTube)提供由浏览器动态呈现的页面,而不包含您要查找的HTML。对于您的用例,您需要使用Selenium或其他一些工具。