<ruby id="x69ha"><address id="x69ha"></address></ruby>
    1. <tbody id="x69ha"></tbody>

          1. <th id="x69ha"></th>
          2. <dd id="x69ha"><track id="x69ha"></track></dd>
            <rp id="x69ha"></rp>
              免费注册 查看新帖 |

            Chinaunix

              平台 论坛 博客 文库
            最近访问板块 发新帖
            查看: 36867 | 回复: 8
            打印 上一主题 下一主题

            LWP下载知乎答案中的视频 [复制链接]

            论坛徽章:
            12
            子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
            跳转到指定楼层
            1 [收藏(0)] [报告]
            发表于 2018-05-15 17:48 |只看该作者 |倒序浏览
            本帖最后由 523066680 于 2018-10-16 15:36 编辑

            首发:https://zhuanlan.zhihu.com/p/36865994

            视频示例:https://www.zhihu.com/question/271736973/answer/389377346

            其中 use Modern::Perl; 不是必需的。

            1. =info
            2.     Author: 523066680
            3.     Date: 2018-05
            4. =cut

            5. use Modern::Perl;
            6. use LWP::UserAgent;
            7. use File::Slurp;
            8. use JSON;
            9. STDOUT->autoflush(1);

            10. goto_dir("D:/temp");
            11. our $main = "https://lens.zhihu.com/api/videos/";
            12. our $ua = LWP::UserAgent->new(  );
            13. our $target = "https://www.zhihu.com/question/271736973/answer/389377346";

            14. my $res = $ua->get( $target );
            15. my $html = $res->content();
            16. my @video = $html=~/>https:.*?video\/(\d+)</g;
            17. my $oauth = get_oauth( $html );

            18. for my $idx ( 0 .. $#video )
            19. {
            20.     printf "Getting video %s - %s\n", $idx, $video[$idx];
            21.     my @vlinks = get_video_links(  $oauth, $video[$idx] );
            22.     get_video( @vlinks );
            23. }

            24. # 获取 m3u8 列表并提取链接
            25. sub get_video_links
            26. {
            27.     our ($main, $ua);
            28.     my ( $oauth, $pgcode ) = @_;

            29.     my $res = $ua->get(
            30.                 $main .$pgcode,
            31.                 "authorization" => $oauth,
            32.             );

            33.     die unless $res->is_success();

            34.     my $data = decode_json( $res->content );
            35.     my $play_url = $data->{playlist}->{sd}->{play_url};  # m3u8 url
            36.     my $pre_url;

            37.     # 获取网址共用部分
            38.     $play_url =~/(.*?\w{32})/;  
            39.     $pre_url = $1 ."/";

            40.     $res = $ua->get( $play_url );
            41.     my @vlinks = $res->content =~/\n(.*?\d+\.ts.*?)\n/g;
            42.     grep { $_ = $pre_url . $_ } @vlinks;

            43.     return $pgcode, @vlinks;
            44. }

            45. # 获取视频切片,合并
            46. sub get_video
            47. {
            48.     our $ua;
            49.     my $name = shift;
            50.     my $buff = "";
            51.     my $res;

            52.     while ( my $link = shift )
            53.     {
            54.         print $#_ + 1 ," ";
            55.         $res = $ua->get( $link );
            56.         $buff .= $res->content();
            57.     }
            58.     print "\n";

            59.     write_file( "${name}.ts", {binmode=>":raw"}, $buff );
            60. }

            61. sub get_oauth
            62. {
            63.     our ( $ua );
            64.     my $html = shift;
            65.     my ($js) = $html =~/(https:[^<>]+main\.app[^<>]+js)/g;
            66.     my $res = $ua->get( $js );
            67.     # pattern: authorization:"oauth c3cef7c66a1843f8b3a9e6a1e3160e20"}
            68.     my ($oauth) = $res->content =~/authorization:"([^"]{30,})"/;
            69.     return $oauth
            70. }

            71. sub goto_dir
            72. {
            73.     my $dir = shift;
            74.     mkdir $dir unless ( -e $dir );
            75.     chdir $dir;
            76. }

            77. __DATA__
            复制代码


            Perl 是不是过时我真的不关心,只用来做想做的事(工作和编程无关)。

            2018-10 更新,7楼

            论坛徽章:
            0
            2 [报告]
            发表于 2018-05-15 18:37 |只看该作者
            感谢分享!

            Perl是个能干活的骆驼,用起来很爽。

            论坛徽章:
            0
            3 [报告]
            发表于 2018-06-15 19:31 |只看该作者
            牛,可以做个爬虫

            论坛徽章:
            0
            4 [报告]
            发表于 2018-06-15 19:31 |只看该作者
            牛,可以做个爬虫

            论坛徽章:
            12
            子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
            5 [报告]
            发表于 2018-06-18 11:25 |只看该作者
            本帖最后由 523066680 于 2018-06-18 20:06 编辑

            回复 3# dahe_1984

            写了tumblr的视频批量下载,不过需要账号登录,加上内容敏感,就没有分享~

            论坛徽章:
            0
            6 [报告]
            发表于 2018-07-01 08:09 |只看该作者
            谢楼主,学习下!

            论坛徽章:
            12
            子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
            7 [报告]
            发表于 2018-10-16 15:35 |只看该作者
            更新一下,现在知乎简化了,不用oauth,也不用多个ts文件拼接,直接单个MP4

            代码保存为 UTF8 编码格式


            1. =info
            2.     Author: 523066680
            3.     2018-07 知乎去掉了 oauth 授权方式
            4.     2018-10 从 ts 多文件,变更为 mp4 单文件下载
            5. =cut

            6. use JSON;
            7. use Encode qw/from_to/;
            8. use LWP::UserAgent;
            9. use Mojo::DOM;
            10. use File::Slurp;
            11. STDOUT->autoflush(1);

            12. our $wdir = "D:/temp";
            13. our $main = "https://lens.zhihu.com/api/videos/";
            14. our $ua = LWP::UserAgent->new();
            15. our $target = "https://www.zhihu.com/question/271736973/answer/389377346";
            16. #our $target = "https://www.zhihu.com/question/285103979/answer/492401516";
            17. #our $target = "https://www.zhihu.com/question/278030511/answer/452274063";

            18. my $res = $ua->get( $target );
            19. my $html = $res->content();
            20. my @video = $html=~/>https:.*?video\/(\d+)</g;  # 获取视频页面链接
            21. my $title = get_title_name( $html );
            22. my ($answerID) = ($target=~/\/(\d+)$/);

            23. mkdir $wdir unless -e $wdir;
            24. chdir $wdir;

            25. for my $idx ( 0 .. $#video )
            26. {
            27.     printf "Getting video %s - %s\n", $idx, $video[$idx];
            28.     get_video( $video[$idx], "${title}Answer_${answerID}_${idx}.mp4" );
            29. }

            30. sub get_video
            31. {
            32.     our ($main, $ua);
            33.     my ( $pgcode, $fname ) = @_;

            34.     my $res = $ua->get( $main .$pgcode );
            35.     die unless $res->is_success();

            36.     my $data = decode_json( $res->content );
            37.     my $play_url = $data->{playlist}->{sd}->{play_url};

            38.     $res = $ua->get( $play_url );
            39.     write_file( $fname, {binmode=>":raw"}, $res->content );
            40. }

            41. sub get_title_name
            42. {
            43.     my $html = shift;
            44.     my $dom = Mojo::DOM->new($html);
            45.     my $title = $dom->at("title")->text;
            46.     $title =~s/ - 知乎//;
            47.     from_to( $title, "utf8", "gbk" );
            48.     return $title;
            49. }

            复制代码

            论坛徽章:
            0
            8 [报告]
            发表于 2019-03-13 16:44 |只看该作者
            路过看看啦啦啦啦

            论坛徽章:
            0
            9 [报告]
            发表于 2019-03-29 22:05 |只看该作者
            看不懂,学习中。
            您需要登录后才可以回帖 登录 | 注册

            本版积分规则 发表回复

            DTCC2020中国数据库技术大会 限时8.5折

            【架构革新 高效可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

            大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

            http://dtcc.it168.com


            大会官网>>
            2019香港一肖精选中特资料
              

            北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
            中国互联网协会会员  联系我们:huangweiwei@it168.com
            感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

            清除 Cookies - ChinaUnix - Archiver - WAP - TOP