我想从YouTube上下载一些(我的意思是很多)视频广告(不是视频,而是在他们之前播放的广告)用于研究目的。
有关工具或方法的任何建议可以实现吗?我不会介意我的黑客编程,但我目前不知道怎么做。此外,YouTube不是必需的;来自其他视频网站的视频广告也适合我。
答案 0 :(得分:10)
当我发现你的问题时,我觉得玩它会很有趣, 正如我最近开发的网站(http://savedeo.com)允许您这样做 从包括YouTube在内的多个网站下载视频。
我只关注Youtube的广告系统,这对其他系统(最有可能)不起作用。关于YouTube的好处是,您可以直接从视频页面获取所有必要的信息,因此可以更快地抓取它(我在一个非常小的服务器上一天下载了近22M的视频页面)。所以你要找的部分是;ytplayer.config = {(.*?)};
,它包含内联json对象(易于处理)。你不需要任何其他东西。
如果您不想从HTML中解析它,可以通过在任何Youtube视频链接的末尾添加参数&spf=prefetch
来直接获取json对象,例如https://www.youtube.com/watch?v=bbEoRnaOIbs&spf=prefetch
并非每个YouTube视频都在展示广告(根据我的统计信息,只有18%的视频会显示广告)。您只需在json对象中查找ad_tag
密钥,即可验证是否为视频启用了广告。
YouTube正在使用三种不同的广告系统:
从两个不同的来源投放广告: - 用作广告的YouTube上传的视频(大部分仅显示视频的一部分) - 来自外部来源的视频(第三方广告服务器)
所有这些的出发点都是一样的。在json对象中找到dynamic_allocation_ad_tag
键。它包含一个通向双击服务器的URL。只有在您使用实际AR值更改此部分sz=WIDTHxHEIGHT;
之后,此网址才会生效,例如sz=480x70,480x360,480x361;
。
您希望在同一个json文件中找到另外三个键tpas_partner_id
,tpas_video_id
和video_id
(来自网址的video_id),因为这些键将用于第三方广告系统。
现在,您可以点击双击网址,该网址会返回一个XML文件,其中包含有关此视频的广告信息。整个文件很有趣并且充满了重要信息(所以你应该将它与视频一起存储)。查找这三个键AdSystem
,AdTitle
和Description
。
如果广告是通过adsense系统(adsense或adx)提供的,则此xml包含广告的所有信息,包括广告的持续时间和直接链接。该链接正是您要查找的内容,您可以在密钥MediaFile
下找到它。
链接大多看起来像http://www.youtube.com/get_video?video_id=LCeDi-d5CRg&ts=1391921207&t=CyJEI0XYwJVJEYE5CVhqY-DF3KQ&gad=1
,它会将您重定向到mp4格式的真实文件。如果广告系统是ADX,您将获得主要是flv文件的直接链接,例如http://playtime.tubemogul.com/ad_promoted_videos/4799351_dhxsYlMYHmLMmxL0oBem_1390593897.flv
如果广告是来自第三方系统的服务器 GDFP ,则必须呼叫不同的服务器。对于第三方广告,Youtube使用FreeWheel服务。要获取广告数据,您必须准备一个XML请求,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<adRequest profile="{profile}" networkId="10613" version="1">
<capabilities>
<expectMultipleCreativeRenditions />
<supportsAdUnitInMultipleSlots />
<supportsSlotCallback />
<supportNullCreative />
<supportAdBundle />
<supportsFallbackAds />
<autoEventTracking />
<requiresRendererManifest />
<requiresVideoCallbackUrl />
</capabilities>
<visitor caller="AS3-5.6.0-r9954-1305270957">
<httpHeaders>
<httpHeader value="https://www.youtube.com/watch?v={video_id}" name="referer" />
<httpHeader value="12,0,0,38" name="x-flash-version" />
</httpHeaders>
</visitor>
<keyValues>
<keyValue key="_fw_distributorvideoassetid" value="{video_id}" />
<keyValue key="_fw_yt_type" value="short" />
<keyValue key="_fwu:10613:lang" value="eng" />
</keyValues>
<siteSection pageViewRandom="{random}" customId="youtube_watch" siteSectionNetworkId="{tpas_partner_id}">
<videoPlayer>
<videoAsset autoPlay="true" duration="318" videoPlayRandom="{random}" customId="{tpas_video_id}" videoAssetNetworkId="{tpas_partner_id}">
<adSlots height="390" defaultSlotProfile="{profile}" width="699" compatibleDimensions="2560,1440">
<temporalAdSlot height="390" adUnit="preroll" timePosition="0" customId="0_1" width="699" />
<temporalAdSlot height="390" adUnit="overlay" timePosition="0" customId="0_2" width="699" />
</adSlots>
</videoAsset>
<adSlots>
<nonTemporalAdSlot height="60" customId="0_5" width="300" acceptCompanion="true" />
<nonTemporalAdSlot height="250" customId="0_6" width="300" acceptCompanion="true" />
</adSlots>
</videoPlayer>
<adSlots />
</siteSection>
</adRequest>
您可能在{}中发现了多个变量。您必须使用自定义数据替换它们,主要是使用从json对象获取的数据。
10613:10613_youtube_as3_player
和10613:youtube2
都会尝试。现在,您将此XML文件作为POST请求发送到https://2975c.v.fwmrm.net/ad/p/1?
(不要忘记使用内容类型application/xml
发送)。
响应包含另一个XML文件,您可以在其中获得广告所需的所有数据,包括各种格式和尺寸的直接链接。您可以在密钥asset
下找到它们。同样,您应该将整个文件与视频一起存储,因为它包含广告的其他数据。
就是这样,快乐的狩猎。
答案 1 :(得分:7)
更简单的解决方案是右键单击视频窗口并选择Stats for nerds
。
将显示统计信息列表,查找Video ID
并复制它 - 仅复制/
字符前的字符串部分,因为您只需要Video ID
,而不是sCPN
Stats for nerds
字符串。 (例如,我正在寻找Sam Ovens视频,但广告视频没有可点击链接,因此我使用了a-C4m7teAAU
功能并找到了ID:YouTube
)。
然后只需将视频ID添加到标准public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set title for the GridView
setTitle("GridView");
// Get the view from grid_view.xml
setContentView(R.layout.grid_view);
// Set the images from ImageAdapter.java to GridView
GridView gridview = (GridView) findViewById(R.id.gridview);
//gridview.setAdapter(new ImageAdapter(this)); //commented line 05052018
gridview.setAdapter(new ChangesofAdapter(this)); //new line 05052018
// Listening to GridView item click
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// Launch ImageViewPager.java on selecting GridView Item
Intent i = new Intent(getApplicationContext(), ImageViewPager.class);
// Show a simple toast message for the item position
Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();
// Send the click position to ImageViewPager.java using intent
i.putExtra("id", position);
// Start ImageViewPager
startActivity(i);
}
});
}
}
观看网址中,如下所示:
答案 2 :(得分:3)
2020年5月,这些方法对我有用
alert("https://www.youtube.com/watch?v="+$(".html5-video-info-panel-content").children[0].children[1].textContent.replace(" ","").split("/")[0])
https://www.youtube.com/watch?v=XXXXXXXXX
在撰写本文时,[书呆子统计]的html是:
<div class="html5-video-info-panel" data-layer="4">
<button class="html5-video-info-panel-close ytp-button" title="close">[x]</button>
<div class="html5-video-info-panel-content">
<div>
<div>Video ID / sCPN</div>
<span>I4VzIvGdTxI / GD6Y 2G9R N3W5</span>
</div>
<div>
<div>Viewport / Frames</div>
<span>640x360 / 0 dropped of 1706</span>
</div>
<!-- a lot of divs -->
</div>
</div>
如您所见,我们的ID位于 span 内,它是div类别为的div的 first 的 second 子html5-video-info-panel-content 。
jQuery帮助我们获取span值:
$(".html5-video-info-panel-content").children[0].children[1]
然后,我们需要删除空格并拆分以获取视频ID:
.textContent.replace(" ","").split("/")[0]
最后,我们将此值连接到
"https://www.youtube.com/watch?v="
参考
答案 3 :(得分:0)
好。所以,我也一直在尝试这样做...
在我大部分时间放弃之后,我右键点击了广告-它提供了复制“视频ID”的功能。出于某种原因-我只是将剪贴板内容粘贴到网址栏中-并到达了广告的youtube视频。可能是偶然,但那一次还是有效的。从那里-我使用了其中一种“从youtube下载”类型的网站(显然是试图让您安装软件-请注意)-https://www.y2mate.com/等----然后我得到了视频。 / p>
(此后我一直无法执行此操作...)-也许它会为其他人提供一些联系-您可以解释为什么会发生这种情况。
更新:似乎有时它可以工作...也许设置了某些广告以供查找。这里有一些证明:https://vimeo.com/372764735