wuse111 发表于 2020-9-12 16:10

爬取并提取某头条的视频链接

第一次发贴,写的不好请谅解,如果有更优化的处理方式请提出交流,代码仅供学习和交流
以下是正文和代码:

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

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


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




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


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

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

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['definition']
                  video_url = b64decode(video_list['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

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

wuse111 发表于 2020-9-16 20:58

sjminh 发表于 2020-9-13 14:55
楼主可以再讲的详细点吗,好像跳过了很多东西,萌新一个看不懂

跳过了分析链接和提取链接的过程,有问题可以私信给我,大家交流学习嘛

地狱龙影 发表于 2020-9-22 20:42

wuse111 发表于 2020-9-19 10:47
可以私信聊一下

大佬,我不会发私信咋整 加个QQ 或 wx可以吗?QQ是258058212 wx是llyemtf

在线小学生 发表于 2020-9-12 19:37

收藏备用.谢谢楼主

QingYi. 发表于 2020-9-12 20:03

Python还是牛逼的

JIAN_ 发表于 2020-9-12 20:15

感谢分享!

夏天by 发表于 2020-9-12 21:17

感谢分享

hacksz 发表于 2020-9-13 13:14

收藏,感谢分享

bigkingman 发表于 2020-9-13 13:23

非常感谢分享!:lol

cj13888 发表于 2020-9-13 14:27

学习一下,支持你

sjminh 发表于 2020-9-13 14:55

楼主可以再讲的详细点吗,好像跳过了很多东西,萌新一个看不懂

ciker_li 发表于 2020-9-13 23:19

感谢分享
页: [1] 2 3
查看完整版本: 爬取并提取某头条的视频链接