收起左侧

    [技术分享] 爬取并提取某头条的视频链接

    0
    回复
    81
    查看
    [复制链接]

    3435

    主题

    3428

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    12042
    发表于 7 天前 | 显示全部楼层 |阅读模式
    以下是正文和代码:

    1.进入某头条的官网,目前是叫阳光宽频网,就提取首页的内容

    2.通过分析出json数据的链接,并的得到出首页数据的链接:http://www.365yg.com/xigua/feed/ ... Count=10&UseHQ=true(其中这个channelid是固定的,count代表提取的数量)
    155423dxeg11sxteiyqegc.png

    3.然后得到的是json数据格式,通过提取key值data的内容再提取key值raw_data的内容,得到的数据很明显是base64加密的方式,直接进行base64的解密,然后得到详细的标题,groupid还有一些其他的内容等等。




    4.进入单个视频,通过抓包发现链接的提取有两种方式,代码会进行具体说明,第一种提取方式就不上操作了,第二种提取方式需要再request headers里面加上一个协议头才能进行访问,这个协议头的内容在第3条中能提取出来


    5.再优化一下代码,然后减少报错。

    具体的操作截图和代码如下,目前所提取的视频链接都是自带声音,那种提取视频和音频分割的没有写,不过思路是一样的,提取出来,然后进行合成:

    [Python] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
    [backcolor=rgb(27, 36, 38) !important][color=white !important]
    [color=white !important]?

    01

    02

    03

    04

    05

    06

    07

    08

    09

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    import requests
    from base64 import b64decode
    import json


    def get_url(num):
        headers = {
        "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
        }
        res = requests.post(f'http://www.365yg.com/xigua/feed/?ChannelID=6797027941&Count={num}&UseHQ=true',
                            headers=headers,
                            allow_redirects=False).json()
        data_list = []
        base_list = res['Data']
        for base in base_list:
            base = base['raw_data']
            raw = b64decode(base).decode()
            raw = json.loads(raw)
            title = raw['title']
            group_id = raw['group_id']
            video_id = raw['video_id']
            token = raw['play_biz_token']
            auth_token = raw['play_auth_token']
            #第一种,通过group_id提取视频的链接

            # res = requests.post(f'http://www.365yg.com/xigua/play/?GroupID={group_id}', headers=headers,
            #                     allow_redirects=False).json()
            # video_list = json.loads(res['InformationResponse']['Info']['PackedJson'])['video_play_info']
            # video_list = json.loads(video_list)['video_list']

            #第二种,通过提取video_id和两个token,提取视频链接

            url = f'http://vas.snssdk.com/video/openapi/v1/?format_type=dash&action=GetPlayInfo&video_id={video_id}&nobase64=false&ptoken={token}&vfrom=xgplayer'
            headers.update({'Authorization': auth_token})
            res = requests.get(url, headers=headers).json()

            #这下面的提取是两种方法通用
            try:
                video_list = res['data']['dynamic_video']['dynamic_video_list']
                # print("dv_list", video_list)
                for video in video_list:
                    video_type = video['definition']
                    video_url = b64decode(video['main_url']).decode()
                    # print(title + ':' + video_type + '|' + video_url)
                    data = title, video_type, video_url
                    data_list.append(data)
            except TypeError:
                video_list = res['data']['video_list']
                # print("v_list", video_list)
                for i in range(1, 5):
                    try:
                        video_type = video_list[f'video_{i}']['definition']
                        video_url = b64decode(video_list[f'video_{i}']['main_url']).decode()
                        # print(title + ':' + video_type + '|' + video_url)
                        data = title, video_type, video_url
                        data_list.append(data)
                    except KeyError:
                        pass
            finally:
                pass
        return data_list






    觉得不错的朋友们可以给个鼓励,有错误也请各位朋友指正,谢谢了
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在线客服
    专注源码分享6年
    全国免费热线电话

    400-225-995

    周一至周日9:00-23:00

    反馈建议

    a5887776@163.com 在线QQ咨询

    Powered by Discuz! X3.3 © 2001-2013 Comsenz Inc.