网页抓取:从统计标签获取Youtube视频的分享

时间:2017-06-20 07:40:19

标签: web-scraping youtube youtube-api web-crawler extract

有没有人知道如何获取YouTube视频的分享(不是我的)?我想将它们存储到数据库中。它不适用于yt api。另一个问题是并非每个视频都有统计信息标签。

到目前为止,我尝试了Youtube API,jsoup HTML Parser(显示共享的div不存在,尽管它通过firefox中的inspect显示,例如)和import.io demo正在运行,但绝对太贵了。< / p>

Thats what I would like to extract

1 个答案:

答案 0 :(得分:4)

最好的方法是查看网络日志,在这种情况下,它会显示POST

https://www.youtube.com/insight_ajax?action_get_statistics_and_data=1&v=$video_id

它在一个javascript对象中的视频页面https://www.youtube.com/watch?v=$video_id的原始html正文中可用的正文中发送一个XSRF令牌,如:

yt.setConfig({
    'XSRF_TOKEN': "QUFFLUhqbnNvZUx4THR3eV80dHlacV9tRkRxc2NwSjlXQXxBQ3Jtc0ttd0JLWENnMjdYNE5IRWhibE9ZdDJTSk1aMktxTDR5d3JjSnkzVUtQWVcwdnp3X0tSOXEtM3hZdzVFdjNPeGpPRGtLVU5pVXV0SmtfdWJSUHNqTVg2WXBndjZpa3d6U25ja2FTelBBVWRlT0lZZkRDaDV6SU94VWE3cnpERHhWNVlUYWdyRjFqN1hvc0VLRmVwcEY3ZWdJMWgyUmc=",
    'XSRF_FIELD_NAME': "session_token",
    'XSRF_REDIRECT_TOKEN': "VlhMkn6F56dGGYcm4Rg7jCZR0vJ8MTQ5ODA1NzIwMkAxNDk3OTcwODAy"
});

它还需要在同一个视频页面中设置一些cookie。

使用

&amp;

import requests
from bs4 import BeautifulSoup
import re 

s = requests.Session() 

video_id = "CPkU0dF4JKo"

r = s.get('https://www.youtube.com/watch?v={}'.format(video_id))

xsrf_token = re.search("'XSRF_TOKEN'\s*:\s*\"(.*)\"", r.text, re.IGNORECASE).group(1)

r = s.post(
    'https://www.youtube.com/insight_ajax?action_get_statistics_and_data=1&v={}'.format(video_id), 
    data = {
        'session_token': xsrf_token
    }
)
metrics = [
    int(t.text.encode('ascii', 'ignore').split(' ', 1)[0])
    for t in BeautifulSoup(r.content, "lxml").find('html_content').find("tr").findAll("div", {"class":"bragbar-metric"})
]
print(metrics)

使用

pup&amp; xml_grep

以下bash脚本将:

  • 使用curl
  • 请求视频页https://www.youtube.com/watch?v=$video_id
  • 将Cookie存储在名为cookie.txt
  • 的文件中
  • 使用sed
  • 在以下请求中提取名为XSRF_TOKEN的{​​{1}}
  • 使用curl请求视频统计信息页session_token以及之前存储的Cookie
  • 使用xml_grep
  • 解析xml结果提取https://www.youtube.com/insight_ajax?action_get_statistics_and_data=1&v=$video_id部分
  • 使用pup解析html以提取CDATA类div并使用bragbar-metric
  • 将html结果转换为json
  • 使用sed删除unicode字符

剧本:

json{}

它提供了观看次数,观看时间,订阅,分享:

video_id=CPkU0dF4JKo

session_token=$(curl -s -c cookie.txt "https://www.youtube.com/watch?v=$video_id" | \
    sed -rn "s/.*'XSRF_TOKEN'\s*:\s*\"(.*)\".*/\1/p")

curl -s -b cookie.txt -d "session_token=$session_token" \
    "https://www.youtube.com/insight_ajax?action_get_statistics_and_data=1&v=$video_id" | \
    xml_grep --text_only 'html_content' | \
    pup 'div table tr .bragbar-metric text{}' | \
    sed 's/\xc2\x91\|\xc2\x92\|\xc2\xa0\|\xe2\x80\x8e//' | \
    sed 's/\s.*$//'